【问题标题】:defparameter vs defun for passing functions arounddefparameter vs defun 用于传递函数
【发布时间】:2013-10-31 14:29:21
【问题描述】:

所以我可以这样做:

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

或者这个:

(defun some-function ...

无论哪种方式,我都可以使用funcall

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

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

(some-function ...

defparameter 函数无法做到这一点。

但是除了这两点之外,还有什么其他的考虑因素呢?

【问题讨论】:

  • 从根本上说,您可能还想考虑flet 和/或labels,这取决于您到底想做什么,我觉得这是一个很好的描述here.

标签: lisp common-lisp


【解决方案1】:

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

对于那些刚接触 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

【讨论】:

  • 您也可以在这里使用(setf (fdefinition 'jam) ...)fdefinition 将适用于所有函数名(包括(setf ...)函数,而不仅仅是符号。
  • @JoshuaTaylor:太棒了,我不知道。干杯(关于让的好点)
  • defparameter 仍有一个优势,let 将绑定一个新值并自动为您恢复旧值,而无需您显式存储它。例如,比较this paste中的两个sn-ps。
  • 请注意,“文件中对同一文件中定义的命名函数的调用指的是该函数,除非该函数已声明为 notinline。如果函数在运行时间或在同一文件中多次定义。” clhs.lisp.se/Body/03_bbc.htm
  • 或者再次使用defun(defun jam () (print 'some-ham))。 ;-) defun 不像 defvar 不更新。
猜你喜欢
  • 2017-01-18
  • 1970-01-01
  • 1970-01-01
  • 2014-09-14
  • 1970-01-01
  • 1970-01-01
  • 2016-06-08
  • 2019-03-15
  • 1970-01-01
相关资源
最近更新 更多