Common Lisp -----应该是lambda

Common Lisp -----should be a lambda

(defun foo(x y)(format t "X: ~a~%" x))

上面的函数工作正常, 但是

(defun foo(x y) ((format t "X: ~a~%" x) (format t "Y: ~a~%" y)))

提示

"*** - SYSTEM::%EXPAND-FORM: (FORMAT T "X: ~a~%" X) should be a lambda"

如果要分别打印参数x,y,如何修复编译错误?

你的括号太多了。应该是:

(defun foo (x y)
  (format t "X: ~a~%" x)
  (format t "Y: ~a~%" y))

在所有 Lisp 方言中,括号在句法上都很重要。不能随意加减。

此特定实现的错误消息没有多大帮助。

允许在函数体和许多其他地方对形式进行简单排序:

(defun foo ()
  (form-a)
  (form-b))

如果不允许,可以使用例如 progn 运算符,其中 returns 最后一种形式的值:

(if (> a b)
  a
  (progn
    (print "smaller")
    b))

由于Lisp语法的限制,出现错误信息:

((print "a")
 (print "b"))

以上无效,因为 Common Lisp 表达式中的第一个元素需要是:

  • 特殊运算符号
  • 一个宏符号
  • 函数符号
  • 或 lambda 表达式 (lambda (a b c) ...)

(print "a") 都不是这四个。 因为你有一个列表作为第一种形式,Lisp 系统告诉你这个列表看起来不像一个合适的 lambda 表达式。

使用 lambda 表达式作为第一个元素的这种有效形式的示例是:

((lambda (a b) (+ a b 22))
 (+ 3 4)
 (+ 6 7))