Common Lisp:编译与评估

Hai*_*ile 5 lisp functional-programming sbcl common-lisp

在使用sbcl的Emacs + Slime上,一旦我在文件中定义了一个函数(或更多),我有两个选择:

  • 评估:例如使用CMx eval-defun
  • 编译:例如使用Cc Mk编译文件

第二个也生成.fasl文件.

两者有什么不同?

编译定义/文件时,幕后发生了什么?

每个人的优点和缺点是什么?

Vse*_*kin 7

首先,有一个函数eval[ 1 ],它允许在语言运行库中评估(即执行)任意CL形式.CL实现可以具有2种不同的操作模式:编译模式和解释模式.编译模式意味着,在评估之前,表单首先在内存中编译.同样在CL评估中,不是在文件级别,而是在单个表单的级别上.因此eval,根据操作模式,可以编译和解释表单.(默认情况下为例如SBCL总是编译,除非你通过设置指示它不sb-ext:*evaluator-mode*:interpret,而CLISP总是解释).

现在,还有一个便利函数compile-file[ 2 ]允许编译某些文件中的所有表单并将结果保存在另一个文件中.这不会触发  对这些表格的评估.

CL还定义了3个不同的程序生命周期:编译时,加载时和执行时.并且有可能控制当使用最多(如果不是最多)隐藏的CL特殊操作员之一时发生的事情eval-when[ 3 ].

综上所述,C-M-x eval-defun将调用eval光标下的表格.它不需要编译它,但这可能,具体取决于实现.C-c M-k compile-filecompile-file您的缓冲区,但无法评估它的内容.