defparameter vs defun传递函数

时间:2013-10-31 14:29:21

标签: lisp common-lisp

所以我可以这样做:

(defparameter *some-function* ... ; returns lambda later

或者这个:

(defun some-function ...

使用其中之一,我可以使用funcall

(funcall 'some-function ... 要么 (funcall *some-function* ...

使用defun版本,我也可以这样做:

(some-function ...

我无法使用defparameter函数执行此操作。

defparameter提供了更简单的方法,可以在以后将some-function重新分配给不同的函数(或其他任何内容,包括非函数数据)。

但除了这两点之外,使用一个还是另一个的其他考虑因素是什么?

1 个答案:

答案 0 :(得分:9)

这是一个奇怪的回答,因为我们在某种程度上比较苹果和橙子。

对于那些正在研究这种情况的新手来说,defparameter用于定义动态变量,而defun用于定义函数。

如果您担心能够以编程方式重新分配函数而不使用defun,请查看以下内容:

CL-USER> (defun jam () (print 'some-jam))
JAM

CL-USER> (jam)
SOME-JAM 

CL-USER> (setf (symbol-function 'jam) (lambda () (print 'some-ham)))
#<FUNCTION (LAMBDA ()) {1004C033DB}>

CL-USER> (jam)
SOME-HAM 

因此,在重新分配函数时,defparameter没有优势。此外,如果您想重新定义该功能,可以查看the compile command