如何在常见的lisp中摆脱funcall

时间:2012-10-18 17:17:53

标签: common-lisp

根据这份文件:http://cl-cookbook.sourceforge.net/functions.html

(defun adder (n)
  (lambda (x) (+ x n)))
(funcall (adder 12) 1)

我必须使用funcall来调用(加法器12),并且忽略了反复编写funcall,有没有办法在方案中编写类似的代码:

((adder 12) 1)

2 个答案:

答案 0 :(得分:6)

没有。没有。

您还可以将其视为一项功能:它可以显式调用函数对象,并提高源代码的可理解性。

答案 1 :(得分:1)

但是,您可以使用这样的东西(不知道为什么会这样,但输入的字符数与Scheme中的字符数相同):

(set-macro-character
 #\[
 #'(lambda (stream char)
     (declare (ignore char))
     (set-syntax-from-char #\] #\;)
     (let ((forms (read-delimited-list #\] stream t)))
       (set-syntax-from-char #\] #\x)
       (append '(funcall) forms))))

(defun adder (n)
  #'(lambda (x) (+ x n)))

(format t "sum: ~s~&" [(adder 12) #x128]) ;; 308

如果您遇到带括号的变量名称,可能会给您一些问题。当然,使用它取决于你,请考虑自己警告。