检查函数是否在SML中定义

检查函数是否在SML中定义,sml,polyml,Sml,Polyml,给定SML源文件,是否可以检查(使用Poly/ML)是否定义了函数/值名称列表?如果是,怎么做 或者,我注意到您可以执行以下操作。假设我们有一个名为somefile.sml的要检查的源文件。假设我们创建文件test.sml,包含以下内容: use "somefile" f; (* defined in somefile.sml *) g; (* undefined *) 然后我们运行: use "test" handle e as SyntaxError => (print (exnMe

给定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中,您可以找到是否使用PolyML.globalNameSpace定义了值或其他任何内容

测试值(如函数)使用

它接受一个名称并返回一个选项类型,如果已经定义了值,则返回SOME;如果没有定义,则返回NONE。 所以

会回来的

SOME ?


将返回NONE。

您能举一个这样一个测试有用的场景的例子吗?我正在为用户提交的代码构建一个自动测试应用程序。我已经编写了一个简单的单元测试库,并将在Poly/ML的容器化实例中处理提交的代码。计划是首先加载提交的代码,检查是否编译,然后加载单元测试库,然后加载特定提交的测试套件。当用户提交正确编译的代码,但未能实现在测试套件中测试的一个或多个方法时,就会出现问题。然后,测试套件将无法编译,这是不可取的行为。@AlexCoplan难道你不能强制用户提交的代码实现某个签名吗?我不确定单用解释器就可以做到这一点。也许使用一个外部解析器库,来找出存在哪些定义?我假设您想要对现有函数进行分级,只对不存在的函数进行惩罚?根据@AlexCoplan的建议,你可以要求学生提供一个存根实现,即使是对于他们不知道如何实现的函数。太棒了,非常感谢!我会专门使用poly,这很好。
#lookupVal PolyML.globalNameSpace "f";
SOME ?
#lookupVal PolyML.globalNameSpace "g";