在普通的 lisp 中使用字符串

Work with string in common lisp

这段代码工作正常:

(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

为什么?

letlet* 使用以下语法在一组表单中引入绑定:

(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

所以,你会发现你把let*forms部分空了,这在Common Lisp中是合法的,它的值是nil.

您还可以发现 write 形式 let* 之外,因此,变量 strstr-len 是未知的,因为它们在全局 let 形式之外。

如评论中所述,如果您使用了解 Common Lisp 语法的编辑器(有几种可用的编辑器),您可以在键入代码后立即发现此类错误。例如,在这种情况下,您会立即注意到额外的括号,这样的编辑器将其清楚地突出显示。此外,编辑器会正确对齐表格,writelet* 下对齐。