2016-08-02 195 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*對齊。