此代码可以正常工作:
(let* ((str (read-line)))
(write (char str 1)))
但是,如果我添加一些,它会破坏:
(let* ((str (read-line))
(str-len (length str))))
(write (char str 1)))
*** - EVAL: variable STR has no value
为什么?
答案 0 :(得分:3)
let
和let*
使用以下语法在一组表单中引入绑定:
(let bindings
declarations
forms)
因此绑定具有仅在表单内指定的值。
你写过:
(let* ((str (read-line))
(str-len (length str))))
(write (char str 1)))
如果我们调整它以使其更容易理解,那就简单地说:
(let* ((str (read-line))
(str-len (length str))))
(write (char str 1)))
^
| invalid parenthesis
因此,您可以发现forms
的{{1}}部分为空,这在Common Lisp中是合法的,其值为let*
。
您还可以发现nil
表单在之外 write
,因此,变量let*
和str
是未知,因为它们不在全球str-len
形式之内。
如评论中所指定的,如果您使用的编辑器知道Common Lisp的语法(有几个可用),您可以在键入代码后立即找到此类错误。例如,在这种情况下,您会立即注意到额外的括号,这样的编辑器会清楚地突出显示。此外,编辑器可以正确对齐表单,let
在write
下对齐。