Lisp 词法闭包 - 函数声明

问题描述

我有一个函数format-ls

(defun format-ls (ls)
    (let (( acc ()))
      (dolist (elt ls)
         (push "(~A . " acc))
    acc))

您可以注意到结束行中缺少一个括号,acc))

然而我的 Lisp REPL(sbcl 2.1.1) 解释这个表达式没有任何错误

format-ls,OK

但是如果我加上缺少的括号,如下图:

(defun format-ls (ls)
    (let (( acc ()))
      (dolist (elt ls)
         (push "(~A . " acc)))
    acc))

REPL 抛出以下错误

format-ls,error

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

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

post+

在这里遗漏了什么?

解决方法

(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