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

use*_*063 1 lisp common-lisp syntax-error

(defun foo(x y)(format t "X: ~a~%" x))
Run Code Online (Sandbox Code Playgroud)

上面的功能工作正常,但是

(defun foo(x y) ((format t "X: ~a~%" x) (format t "Y: ~a~%" y)))
Run Code Online (Sandbox Code Playgroud)

它提示

"*** - SYSTEM::%EXPAND-FORM: (FORMAT T "X: ~a~%" X) should be a lambda"
Run Code Online (Sandbox Code Playgroud)

如果我想单独打印参数x,y,如何修复编译错误?

Rai*_*wig 6

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

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

(defun foo ()
  (form-a)
  (form-b))
Run Code Online (Sandbox Code Playgroud)

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

(if (> a b)
  a
  (progn
    (print "smaller")
    b))
Run Code Online (Sandbox Code Playgroud)

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

((print "a")
 (print "b"))
Run Code Online (Sandbox Code Playgroud)

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

  • 一个特殊的操作符号
  • 宏观符号
  • 功能符号
  • 或lambda表达式 (lambda (a b c) ...)

并且(print "a")既不是那些四.由于你有一个列表作为第一个表单,Lisp系统告诉你这个列表看起来不像一个正确的lambda表达式.

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

((lambda (a b) (+ a b 22))
 (+ 3 4)
 (+ 6 7))
Run Code Online (Sandbox Code Playgroud)


Chr*_*ung 5

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

(defun foo (x y)
  (format t "X: ~a~%" x)
  (format t "Y: ~a~%" y))
Run Code Online (Sandbox Code Playgroud)

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