Common Lisp -----应该是一个lambda

时间:2016-02-25 01:56:18

标签: syntax-error lisp common-lisp

(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,我该如何修复编译错误?

2 个答案:

答案 0 :(得分:6)

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

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

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

如果不允许,可以使用progn运算符,它返回最后一个表单的值:

(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))

答案 1 :(得分:5)

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

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

在所有Lisp方言中,括号在语法上都很重要。你不能无缘无故地添加或减去它们。