Zhi*_*ANG 3 ocaml functional-programming
我写
let fact x =
let result = ref 1 in
for i = 1 to x do
result := !result * i;
Printf.printf "%d %d %d\n" x i !result;
done;
!result;;
Run Code Online (Sandbox Code Playgroud)
在名为"Moduletest.ml"的文件中,和
val fact : int -> int
Run Code Online (Sandbox Code Playgroud)
在名为"Moduletest.mli"的文件中.
但是,他们为什么不工作?
当我试图在ocaml中使用时,
Moduletest.fact 3
Run Code Online (Sandbox Code Playgroud)
它告诉我:
Error: Reference to undefined global `Moduletest'
Run Code Online (Sandbox Code Playgroud)
发生了什么?
谢谢.
OCaml toplevel仅与标准库链接.有关如何使其他代码可见的几个选项:
#use指令这种自我描述,你只需从一些来源复制代码并将其粘贴到顶层.不要忘记,在添加之前,toplevel不会评估您的代码;;
编辑器当然是Emacs ...嗯,确实它可以是任何其他有能力的编辑器,例如vim.此方法是对前一个的详细说明,其中编辑器实际上负责为您复制和粘贴代码.在Emacs中,您可以使用C-c C-b命令评估整个文件,或者您可以将其缩小到选定区域C-c C-r,并且最精细的是使用C-c C-e,即评估表达式.虽然它有点马车.
#use指令.该指令接受文件名,它实质上将复制并粘贴文件中的代码.请注意,它不会为您创建文件模块/例如,如果您有test.ml包含此内容的文件:
(* file test.ml *)
let sum x y = x + y
Run Code Online (Sandbox Code Playgroud)
然后用#use指令加载它,实际上会带来你的范围,sum值:
# #use "test.ml";;
# let z = sum 2 2
Run Code Online (Sandbox Code Playgroud)
您不能sum使用Test.,因为Test实际上没有创建模块.#use指令只是将文件的内容复制到顶层.而已.
您可以使用编译的代码创建自己的顶层.这是一个高级主题,所以我将跳过它.
ocamlfindocamlfind是一个工具,允许您查找并加载系统上安装的库到您的顶层.默认情况下,toplevel不与标准库以外的任何代码链接.甚至,并非库的所有部分都实际链接,例如,Unix模块不可用,并且需要明确加载.有原始指令可以加载任何库,比如#load和#include,但它们不适合随意的用户,特别是如果你有优秀ocamlfind的随意使用.在使用它之前,您需要加载它,因为它在默认情况下也不可用.以下命令将加载ocamlfind并添加一些新指令:
# #use "topfind";;
Run Code Online (Sandbox Code Playgroud)
在加载过程中,它会向您显示如何使用它的一些提示.添加的最有趣的指令是#require.它接受一个库名,并将其代码加载(即链接)到顶层:
# #require "unix";;
Run Code Online (Sandbox Code Playgroud)
这将加载一个unix库.如果您不确定,关于库的名称,您始终可以使用#list命令查看所有库.该#require指令很聪明,它将自动加载库的所有依赖项.
如果您不希望每次启动OCaml顶级时都键入所有这些指令,那么您可以.ocamlinit在主目录中创建文件,然后将它们放在那里.此文件将在顶级启动时自动加载.