2016-08-02 155 views
-1

此代码串工作顺利进行:与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 

为什么?

+3

你的括号是错误的。你应该让你的编辑器缩进代码,以避免这种问题。 – jkiiski

回答

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 

所以,你会发现你有let*forms部分空的,在Common Lisp中是合法的,其值为nil

你也可以发现,write形式是let*,基于这个原因,变量strstr-len是未知的,因为它们是全球let形式之外。

如注释中所述,如果您使用了知道Common Lisp语法的编辑器(有几种可用的编辑器),只要输入代码,就可以找到这种类型的错误。例如,在这种情况下,您会立即注意到额外的括号,这个编辑器清楚地突出了这个。此外,编辑会正确对齐表格,writelet*对齐。