Lisp词汇闭包-函数声明

Lisp词汇闭包-函数声明,lisp,common-lisp,sbcl,Lisp,Common Lisp,Sbcl,我有一个函数,格式化ls: (defun format-ls (ls) (let (( acc ())) (dolist (elt ls) (push "(~A . " acc)) acc)) 您可以注意到,在结束行(acc))中缺少一个括号 然而,我的Lisp REPL(sbcl 2.1.1)对该表达式的解释没有任何错误: 但如果我添加缺少的括号,如下所示: (defun format-ls (ls) (let ((

我有一个函数,格式化ls

(defun format-ls (ls)
    (let (( acc ()))
      (dolist (elt ls)
         (push "(~A . " acc))
    acc))
您可以注意到,在结束行(acc))中缺少一个括号

然而,我的Lisp REPL(sbcl 2.1.1)对该表达式的解释没有任何错误:

但如果我添加缺少的括号,如下所示:

(defun format-ls (ls)
    (let (( acc ()))
      (dolist (elt ls)
         (push "(~A . " acc)))
    acc))
REPL抛出以下错误:

现在,所有括号都匹配的表达式将被解释为没有任何问题:

(b)
(defun post+ (ls)
    (let (( acc ()))
       (let ((i -1))
        (dolist (elt ls)
         (push (+ elt (setf i(+ i 1))) acc)))
    (reverse acc)))

我错过了什么

(defun format-ls (ls)
  (let ((acc ()))
    (dolist (elt ls)
      (push "(~A . " acc))
    acc))
s表达式中没有不匹配的括号。不过,字符串中只有一个开括号

上面写得很好:

CL-USER 40 > (read-from-string "(defun format-ls (ls)
                                 (let ((acc ()))
                                   (dolist (elt ls)
                                     (push \"(~A . \" acc))
                                   acc))")
(DEFUN FORMAT-LS (LS)
  (LET ((ACC NIL))
    (DOLIST (ELT LS) (PUSH "(~A . " ACC)) ACC))
221

您缺少的是,第一个示例中没有不匹配的paren,第二个示例中有(额外的结束paren)。你是不是把绳子里的帕伦当作要匹配的帕伦中的一个?@Rainer Joswig-谢谢你花时间来经历我暂时(我希望…)的精神错乱。我早该知道是喝咖啡休息的时候了。你的压痕有问题
acc
let
的范围内,因此对它的引用必须比
(let…
)缩进更多。这可能是因为您的编辑器被字符串文字中的括号弄糊涂了。