【问题标题】:Check if function is defined in SML检查函数是否在 SML 中定义
【发布时间】:2015-04-30 17:58:17
【问题描述】:

给定一个 SML 源文件,是否可以检查(使用 Poly/ML)是否定义了函数/值名称列表?如果有,怎么做?

另外,我注意到您可以执行以下操作。假设我们有一个要检查的源文件,名为somefile.sml。假设我们创建文件test.sml,内容如下:

use "somefile"
f; (* defined in somefile.sml *)
g; (* undefined *)

然后我们运行:

use "test" handle e as SyntaxError => (print (exnMessage e));

不幸的是,这只会打印出“静态错误”。有什么方法,类似于上面描述的,来确定(在代码中)“test.sml”中哪些函数没有定义?

【问题讨论】:

  • 你能举一个例子说明这样的测试会有用吗?
  • 我正在为用户提交的代码构建一个自动化测试应用程序。我编写了一个简单的单元测试库,并将在 Poly/ML 的容器化实例中处理提交。计划是先加载提交的代码,检查是否编译,然后加载单元测试库,再加载具体提交的测试套件。当用户提交正确编译的代码,但他们未能实现在测试套件中测试的一种或多种方法时,就会出现问题。然后测试套件将无法编译,这是不可取的行为。
  • @AlexCoplan 不能强制用户提交的代码实现某个签名吗?
  • 我不确定这可以单独使用解释器完成。也许使用外部解析器库来找出存在哪些定义?
  • 我假设您想对现有功能进行评分并且只对不存在的功能进行惩罚?详细说明@AlexCoplan 的建议,您可以要求学生提供存根实现,即使是他们不知道如何实现的功能。

标签: sml polyml


【解决方案1】:

可能无法以可移植的方式执行此操作,但在 Poly/ML 中,您可以了解是否使用 PolyML.globalNameSpace 定义了值或其他任何内容。

要测试一个值(例如一个函数),请使用

#lookupVal PolyML.globalNameSpace

这需要一个名称并返回一个选项类型,如果值已定义,则返回 SOME,如果未定义,则返回 NONE。 所以

#lookupVal PolyML.globalNameSpace "f";

会回来

SOME ?

同时

#lookupVal PolyML.globalNameSpace "g";

将返回 NONE。

【讨论】:

  • 太棒了,非常感谢!我将专门使用 poly,这很好。
猜你喜欢
  • 2021-05-24
  • 1970-01-01
  • 1970-01-01
  • 2016-09-28
  • 2016-01-22
  • 1970-01-01
  • 1970-01-01
  • 2013-10-20
  • 2020-11-14
相关资源
最近更新 更多