我正在尝试学习Common Lisp(sbcl)并通过基本的defuns进行练习。我现在正在尝试编写一个在列表中添加所有字符串的长度。
早期步骤是测试第一个元素是否为字符串。我以为你可以用
来打电话 (stringp (car '(s1 s2)))
其中s1和s2是字符串。使用stringp测试s1,并询问列表中的汽车似乎工作正常,但将它们组合在一起并不能满足我的期望:
CL-USER> (car '(s1 s2))
S1
CL-USER> (stringp s1)
T
CL-USER> (stringp (car '(s1 s2)))
NIL
我是否误解了stringp函数或列表的工作方式?
谢谢
答案 0 :(得分:5)
'(s1 s2)
是一个包含符号s1
和s2
的列表。所以(car '(s1 s2))
返回符号s1
(正如您可以看到REPL打印S1
而不是变量s1
中存储的任何字符串这一事实。由于符号是不是字符串,stringp
返回false。
如果您实际使用字符串列表,它将按预期工作:
* (car (list s1 s2))
"contents of s1"
* (stringp (car (list s1 s2)))
T
答案 1 :(得分:2)
QUOTE会阻止评估其随附的表格。随附的表格按原样返回。
(car '(s1 s2))
返回S1
。这是一个符号,而不是一个字符串。
如果您评估s1
,则Lisp返回其值。但这使用了另一个评估步骤。
如果你看s1
作为一个符号,那么如果你告诉Lisp它会保留一个符号:
CL-USER > 's1
S1
CL-USER > (stringp 's1)
NIL