Common lisp 如何在SBCL中创建解释函数?
我想创建一个解释函数定义,而不是编译函数定义 说: 变量:*计算器模式*[sb ext]:在不同计算器之间切换 实现。如果设置为:compile,则eval的一个实现 将使用编译器调用。如果设置为:解释,则为解释器 将使用 因此,我尝试创建一个条形函数(它不存在): 但是,我检查一下,BAR已经编译好了:Common lisp 如何在SBCL中创建解释函数?,common-lisp,sbcl,Common Lisp,Sbcl,我想创建一个解释函数定义,而不是编译函数定义 说: 变量:*计算器模式*[sb ext]:在不同计算器之间切换 实现。如果设置为:compile,则eval的一个实现 将使用编译器调用。如果设置为:解释,则为解释器 将使用 因此,我尝试创建一个条形函数(它不存在): 但是,我检查一下,BAR已经编译好了: CL-USER> (compiled-function-p #'bar) T 那么,如何创建BAR的解释版本呢?问题中的let表单仅在运行时设置计算器模式。到那时,函数已经编译好了 您
CL-USER> (compiled-function-p #'bar)
T
那么,如何创建BAR的解释版本呢?问题中的let表单仅在运行时设置计算器模式。到那时,函数已经编译好了 您需要在加载时设置它,并确保
加载
文件,而不是编译然后加载它
试试这个:
在您的文件.lisp中
:
;; at load time, set evaluator mode to interpret (before bar definition is met)
(eval-when (:load-toplevel :execute)
(setf sb-ext::*evaluator-mode* :interpret))
;;define your interpreted function
(defun bar (x)
(+ x 1))
;; set evaluator back to compile mode (optional)
(eval-when (:load-toplevel :execute)
(setf sb-ext::*evaluator-mode* :compile))
;;check if bar is a compiled function
(print (compiled-function-p #'bar)) ;;prints NIL
然后使用
(加载“your file.lisp”)
(这不会首先编译文件)。问题中的let表单仅在运行时设置计算器模式。到那时,函数已经编译好了
您需要在加载时设置它,并确保加载
文件,而不是编译然后加载它
试试这个:
在您的文件.lisp中
:
;; at load time, set evaluator mode to interpret (before bar definition is met)
(eval-when (:load-toplevel :execute)
(setf sb-ext::*evaluator-mode* :interpret))
;;define your interpreted function
(defun bar (x)
(+ x 1))
;; set evaluator back to compile mode (optional)
(eval-when (:load-toplevel :execute)
(setf sb-ext::*evaluator-mode* :compile))
;;check if bar is a compiled function
(print (compiled-function-p #'bar)) ;;prints NIL
然后用
(加载“your file.lisp”)
(这并不首先编译文件)。我认为*计算器模式*
本质上是一个全局变量。例如,如果您这样做:
> (setf sb-ext:*evaluator-mode* ':interpret)
:interpret
> (setf (symbol-function 'bar)
(lambda (x) x))
#<interpreted-function nil {10026E7E2B}>
> (compiled-function-p #'bar)
nil
> (setf sb-ext:*evaluator-mode* ':compile)
:compile
> (setf (symbol-function 'bar)
(let ((sb-ext:*evaluator-mode* ':interpret))
(lambda (x) x)))
#<function (lambda (x)) {52C3687B}>
> (compiled-function-p #'bar)
t
那么
(x…
不是一个顶级表单。我认为*计算器模式*
本质上是一个全局变量。例如,如果您这样做:
> (setf sb-ext:*evaluator-mode* ':interpret)
:interpret
> (setf (symbol-function 'bar)
(lambda (x) x))
#<interpreted-function nil {10026E7E2B}>
> (compiled-function-p #'bar)
nil
> (setf sb-ext:*evaluator-mode* ':compile)
:compile
> (setf (symbol-function 'bar)
(let ((sb-ext:*evaluator-mode* ':interpret))
(lambda (x) x)))
#<function (lambda (x)) {52C3687B}>
> (compiled-function-p #'bar)
t
那么(x…
不是顶级表单