以编程方式加载sml/nj中的代码

以编程方式加载sml/nj中的代码,sml,smlnj,Sml,Smlnj,我尝试加载一个外部.sml文件,比如说a.sml,然后执行这个文件中列出的fun(add:int->int->int) 我完全知道如何在交互式shell中做到这一点:使用“a.sml” 但是如何在.sml文件中实现这一点呢?我尝试了以下方法: val doTest = let val _ = print ("Loading..." ^ "\n") val _ = use "a.sml" val _ = print ("1 + 2 = " ^ Int.toString

我尝试加载一个外部.sml文件,比如说
a.sml
,然后执行这个文件中列出的
fun
add:int->int->int

我完全知道如何在交互式shell中做到这一点:
使用“a.sml”

但是如何在.sml文件中实现这一点呢?我尝试了以下方法:

val doTest =
  let
    val _ = print ("Loading..." ^ "\n")
    val _ = use "a.sml"
    val _ = print ("1 + 2 = " ^ Int.toString (add 1 2) ^ "\n")                                                   
  in
    1
  end
但编撰者的反应是:

test.sml:7.49-7.52 Error: unbound variable or constructor: add

顺便说一句:我知道使用CM是更合适的方式。但就我而言,在编译之前我不知道文件
a.sml

你不能这么做。编译器必须知道在编译时调用的函数的类型。您要求的是SML在运行时加载一个文件(使用…),然后运行其中的代码。由于相位差异,这是不可能的;类型检查发生在编译过程中,之后可能会忘记所有类型信息

如果您正在生成代码并且知道文件名,那么仍然可以使用CM,并使用构建系统分两步进行编译。然后,您将在第二个编译步骤中从生成的代码中获得类型错误。如果这种方法不适合您,请描述您的情况