Common lisp 如何在SBCL中创建解释函数?

Common lisp 如何在SBCL中创建解释函数?,common-lisp,sbcl,Common Lisp,Sbcl,我想创建一个解释函数定义,而不是编译函数定义 说: 变量:*计算器模式*[sb ext]:在不同计算器之间切换 实现。如果设置为:compile,则eval的一个实现 将使用编译器调用。如果设置为:解释,则为解释器 将使用 因此,我尝试创建一个条形函数(它不存在): 但是,我检查一下,BAR已经编译好了: CL-USER> (compiled-function-p #'bar) T 那么,如何创建BAR的解释版本呢?问题中的let表单仅在运行时设置计算器模式。到那时,函数已经编译好了 您

我想创建一个解释函数定义,而不是编译函数定义

说:

变量:*计算器模式*[sb ext]:在不同计算器之间切换 实现。如果设置为:compile,则eval的一个实现 将使用编译器调用。如果设置为:解释,则为解释器 将使用

因此,我尝试创建一个条形函数(它不存在):

但是,我检查一下,BAR已经编译好了:

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…
不是顶级表单