lisp - defparameter vs defun 用于传递函数

标签 lisp common-lisp

所以我可以这样做:

(defparameter *some-function* ... ; 稍后返回 lambda

或者这个:

(defun some-function ...

无论是哪种,我都可以使用 funcall:

(funcall 'some-function ... 或者 (funcall *some-function* ...

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

(一些函数...

我不能用 defparameter 函数做到这一点。

defparameter 提供了更简单的技术,用于稍后将 some-function 重新分配给不同的函数(或其他任何东西,包括非函数数据)。

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

最佳答案

这个问题的回答很奇怪,因为我们有点将苹果与橙子进行比较。

对于正在查看此内容的 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 

所以 defparameter 在重新分配函数时没有优势。另外,如果您想重新定义函数,可以查看 the compile command .

关于lisp - defparameter vs defun 用于传递函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19709228/

相关文章:

recursion - 在 Clojure 中实现 foreach (doseq)

lisp - 为什么 Lisp 中的 consing 很慢?

macos - 在 Mac OS X 上从源代码编译 SBCL

loops - 常见的 Lisp `loop` : maximize into local variable introduced by `let`

string - 即使最后一个字符是定界符也拆分字符串

lisp - 在 lisp 中应用和关键字参数

lisp - ' ('(LIST) ' 无 'NIL) should be a lambda expression in (hanoi(' ('(list)' ()'())))

macros - "let"的 Common Lisp 宏以匹配 Clojure

windows - 如何在 Windows 中获得 common-lisp GUI?

scheme - 打印函数调用的参数而不评估,不使用 "macro"