defparameter vs defun传递函数

joh*_*ers 5 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稍后重新分配给不同的功能(或任何其他功能,包括非功能数据).

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

Bag*_*ers 9

这是一个奇怪的回答,因为我们有点比较苹果和橙子.

对于那些正在研究这种情况的lisp新手,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 
Run Code Online (Sandbox Code Playgroud)

因此,在重新分配函数时,defparameter没有优势.此外,如果要重新定义该函数,可以查看编译命令.

  • 您也可以在这里使用`(setf(fdefinition'jam)...)`,[`fdefinition`](http://www.lispworks.com/documentation/HyperSpec/Body/f_fdefin.htm)将在_all_上运行函数名(包括`(setf ...)`函数,而不仅仅是符号. (5认同)
  • `defparameter` 仍然有一个优势,即 `let` 会自动为你绑定一个新值和 _restore_ 旧值,而你不必显式存储它。例如,比较 [this paste](http://pastebin.com/8sLLnEPJ) 中的两个片段。 (2认同)