基本上我会说你必须使用(typep var 'string-type)
,但据我所知,没有像字符串这样的类型。
通过
中的结果类型确定类型(type-of "rowrowrowyourboat")
> (SIMPLE-ARRAY CHARACTER (17))
这是一种我能用通用方式寻找的类型,因为只查找SIMPLE-ARRAY
会有任何好处:
(typep "rowrowrowyourboat" 'simple-array)
> t
(typep (make-array 1) 'simple-array)
> t
使用直观的动态确定示例字符串类型的hack也没有任何好处,因为它们的长度不一样(大部分时间)
(typep "rowrowrowyourboat" (type-of "string"))
> nil
所以我想知道检查给定变量是否为string类型的规范方法是什么?
答案 0 :(得分:8)
大多数类型在CL中都有一个谓词,即使字符串是一系列字符,它也存在一个函数stringp,它完全符合你的要求。
(stringp "getlydownthestream") ; ==> T
它在文档中说与编写
相同(typep "ifyouseeacrocodile" 'string) ; ==> T
答案 1 :(得分:4)
你的问题有几个误解。通常在Lisp变量中没有类型。
重复: Lisp中的变量没有类型。
您可以询问某些Lisp值是某种类型还是具有哪种类型。 Lisp对象附加了类型。
Common Lisp没有类型'string'?你为什么不查看文档?这很容易。
Common Lisp HyperSpec:http://www.lispworks.com/documentation/HyperSpec/Front/index.htm
符号索引:http://www.lispworks.com/documentation/HyperSpec/Front/X_Symbol.htm
S的符号索引:http://www.lispworks.com/documentation/HyperSpec/Front/X_Alph_S.htm
STRING:http://www.lispworks.com/documentation/HyperSpec/Body/a_string.htm#string
系统类STRING:http://www.lispworks.com/documentation/HyperSpec/Body/t_string.htm
所以Common Lisp的类型为STRING
。
Strings Dictionary还列出了其他字符串类型:BASE-STRING
,SIMPLE-STRING
,SIMPLE-BASE-STRING
。
我正在使用LispWorks,因此返回的类型看起来有点不同:
CL-USER 20 > (type-of "foo")
SIMPLE-BASE-STRING
CL-USER 21 > (typep "foo" 'string)
T
CL-USER 22 > (stringp "foo")
T
CL-USER 23 > (subtypep 'simple-base-string 'string)
T
T
CL-USER 24 > (let ((var "foo")) (typep var 'string))
T
秘密:Common Lisp中的变量可以输入,但这是另一个故事。