Hai*_*ile 5 lisp functional-programming sbcl common-lisp
在使用sbcl的Emacs + Slime上,一旦我在文件中定义了一个函数(或更多),我有两个选择:
第二个也生成.fasl文件.
两者有什么不同?
编译定义/文件时,幕后发生了什么?
每个人的优点和缺点是什么?
首先,有一个函数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-file将compile-file您的缓冲区,但无法评估它的内容.