【问题标题】:How to I check whether a given variable value is of type string如何检查给定的变量值是否为字符串类型
【发布时间】:2013-09-04 18:07:42
【问题描述】:

基本上我会说你必须使用(typep var 'string-type),但据我所知没有字符串这样的类型。

通过 type-of 结果确定类型

(type-of "rowrowrowyourboat")
> (SIMPLE-ARRAY CHARACTER (17))

这是一种我可以以通用方式寻找的类型,因为仅寻找 SIMPLE-ARRAY 不会有任何好处:

(typep "rowrowrowyourboat" 'simple-array)
> t

(typep (make-array 1) 'simple-array)
> t

并且使用直观的方法来动态确定示例字符串的类型也没有任何好处,因为它们的长度不会相同(大部分时间)

(typep "rowrowrowyourboat" (type-of "string"))
> nil

所以我想知道检查给定变量是否为字符串类型的规范方法是什么?

【问题讨论】:

    标签: string types common-lisp sbcl


    【解决方案1】:

    大多数类型在 CL 中都有一个谓词,即使字符串是一个字符序列,它也存在一个函数 stringp,它完全可以满足您的需求。

    (stringp "getlydownthestream") ; ==> T
    

    它在文档中说这与写作相同

    (typep "ifyouseeacrocodile" 'string) ; ==> T
    

    【讨论】:

      【解决方案2】:

      您的问题有几个误解。通常在 Lisp 中,变量没有类型。

      重复:Lisp 中的变量没有类型

      您可以询问某个 Lisp 值是否属于某种类型或它具有什么类型。 Lisp 对象具有附加类型。

      Common Lisp 没有“字符串”类型?你为什么不看文档?这很容易。

      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

      字符串: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-STRINGSIMPLE-STRINGSIMPLE-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 中的变量可以输入,但那是另一回事了。

      【讨论】:

      • 我的意思是(当然)变量的值 - 会更正
      猜你喜欢
      • 2013-12-15
      • 2011-06-18
      • 2013-08-08
      • 2018-06-14
      • 2020-04-25
      • 2020-05-28
      • 1970-01-01
      • 2012-04-13
      • 2020-07-17
      相关资源
      最近更新 更多