微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Lisp 词法闭包 - 函数声明

如何解决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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。