在常见的lisp中使用字符串

时间:2016-08-02 11:24:11

标签: common-lisp string-length

此代码可以正常工作:

(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

为什么?

1 个答案:

答案 0 :(得分:3)

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

因此,您可以发现forms的{​​{1}}部分为空,这在Common Lisp中是合法的,其值为let*

您还可以发现nil表单之外 write,因此,变量let*str是未知,因为它们不在全球str-len形式之内。

如评论中所指定的,如果您使用的编辑器知道Common Lisp的语法(有几个可用),您可以在键入代码后立即找到此类错误。例如,在这种情况下,您会立即注意到额外的括号,这样的编辑器会清楚地突出显示。此外,编辑器可以正确对齐表单,letwrite下对齐。