我尝试加载外部.sml文件 - 假设为a.sml
- 并执行此文件中列出的fun
(add: 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
。
答案 0 :(得分:2)
你不能这样做。编译器必须知道在编译时调用的函数的类型。您要问的是SML在运行时加载文件(使用...),然后在其中运行代码。由于相位差异,这是不可能的;在编译期间发生类型检查,之后可以忘记所有类型信息。
如果您正在生成代码并知道文件名,您仍然可以使用CM并使用构建系统分两步编译。然后,您将在第二个编译步骤中从生成的代码中获取类型错误。如果这种方法对您不起作用,请描述您的情况。