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

bea*_*rdc 2 lisp string list 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
Run Code Online (Sandbox Code Playgroud)

我是否误解了stringp函数或列表的工作方式?

谢谢

sep*_*p2k 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
Run Code Online (Sandbox Code Playgroud)