测试列表元素是否是CL中的字符串

时间:2011-03-19 08:55:08

标签: string list lisp common-lisp

我正在尝试学习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函数或列表的工作方式?

谢谢

2 个答案:

答案 0 :(得分:5)

'(s1 s2)是一个包含符号s1s2的列表。所以(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