在普通的 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
为什么?
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
所以,你会发现你把let*
的forms
部分空了,这在Common Lisp中是合法的,它的值是nil
.
您还可以发现 write
形式 在 let*
之外,因此,变量 str
和 str-len
是未知的,因为它们在全局 let
形式之外。
如评论中所述,如果您使用了解 Common Lisp 语法的编辑器(有几种可用的编辑器),您可以在键入代码后立即发现此类错误。例如,在这种情况下,您会立即注意到额外的括号,这样的编辑器将其清楚地突出显示。此外,编辑器会正确对齐表格,write
在 let*
下对齐。
这段代码工作正常:
(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
为什么?
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
所以,你会发现你把let*
的forms
部分空了,这在Common Lisp中是合法的,它的值是nil
.
您还可以发现 write
形式 在 let*
之外,因此,变量 str
和 str-len
是未知的,因为它们在全局 let
形式之外。
如评论中所述,如果您使用了解 Common Lisp 语法的编辑器(有几种可用的编辑器),您可以在键入代码后立即发现此类错误。例如,在这种情况下,您会立即注意到额外的括号,这样的编辑器将其清楚地突出显示。此外,编辑器会正确对齐表格,write
在 let*
下对齐。