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

时间:2013-12-01 14:57:32

标签: sml smlnj

我尝试加载外部.sml文件 - 假设为a.sml - 并执行此文件中列出的funadd: int -> int -> int)。

我完全知道如何在交互式shell中执行此操作:use "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
BTW:我知道使用CM是更合适的方式。但在我的情况下,我在编译之前不知道文件a.sml

1 个答案:

答案 0 :(得分:2)

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

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