【发布时间】:2013-10-22 21:44:45
【问题描述】:
我想将像 print 这样的函数存储在一个变量中,这样我就可以输入像 p 这样的简短内容,例如:
在Scheme:
(define print display)
(print "Hello world\n")
;; alternate way
(define print 'display)
((eval print) "Hello world\n")
同样的方法似乎在Common Lisp 中不起作用:
(defvar p 'print)
;;(print (type-of p))
(p "Hello world") ;; Attempt 1
((eval p) "Hello world") ;; >> Attempt 2
((eval (environment) p) "Hello world") ;; Attempt 3
上面的Attempt 1 出现此错误:
*** - EVAL: undefined function P
这与Attempt 2 和3 在Clisp 中:
*** - EVAL: (EVAL (ENVIRONMENT) P) is not a function name; try using a
symbol instead
*** - EVAL: (EVAL P) is not a function name; try using a symbol instead
还有gcl:
Error: (EVAL P) is invalid as a function.
Error: (EVAL (ENVIRONMENT) P) is invalid as a function.
所以:
-
try using a symbol是什么意思?p绝对是symbol;假阳性? -
eval怎么了?p的评估不会产生过程print吗? - 我认为
Lisp程序是first class objects。为什么Attempt 1不像Scheme那样工作?
编辑
(移自下面的评论)
我想知道为什么(setf (symbol-function 'p) #'print) 不能这样工作(setf (symbol-function 'p) 'print)。我收到以下(不是很有帮助)错误:
*** - SYSTEM::%PUTD: PRINT is not a function ;; CLisp
Error: PRINT is not of type LIST. ;; Gcl
我知道尖号 (#) 应该在函数和变量之间消除歧义
具有相同的名称,但在本例中,只有一个 print,即函数。
另外,为什么不能像这样使用defvar 而不是setf:
(defvar (symbol-function 'p) #'print)
然而defvar 和setf 都为变量赋值。
相关的错误是:
*** - DEFVAR: non-symbol (SYMBOL-FUNCTION 'P) cannot be a variable ;; Clisp
Error: (SYMBOL-FUNCTION (QUOTE P)) is not of type SYMBOL. ;; Gcl
【问题讨论】:
标签: scheme common-lisp eval first-class-functions lisp-2