为什么 Setq 工作但不让?

Why does Setq work but not let?

我遵循我书中的语法 "The land of lisp" 并且 let 版本只有 returns 在传递 *string* 时为 nil。而 "setq" 版本 returns 是 string.

的反转版本
(defparameter *string* "a b c")
(defun reverse-string (string)
    (let (reversed (string))))

(defun setq-reverse-string (string)
    (setq reversed (reverse string)))

LET的语法是:

(LET ((var1 val1)
      (var2 val2)
      ...)
  body)

代替 (varN valN) 你可以只用 varN,这是 shorthand 代表 (varN nil)。您也可以省略 valN,在这种情况下它默认为 nil.

所以你的代码等同于:

(defun reverse-string (string)
  (let ((reversed nil)
        (string nil))))

您缺少一定程度的括号来执行您想要的操作:

(defun reverse-string (string)
  (let ((reversed (string)))))

您还缺少对 reverse 的调用并返回变量

(defun reverse-string (string)
  (let ((reversed (reverse string)))
    reversed))