【问题标题】:Lisp - Convert symbol to string only if not already a stringLisp - 仅当还不是字符串时才将符号转换为字符串
【发布时间】:2012-06-18 13:37:04
【问题描述】:

只有当符号在lisp中还不是字符串时,有没有办法将其转换为字符串?

它应该像这样工作:

(only-if-conversion 'ABC) => "ABC"

(仅当转换“ABC”)=>“ABC”

【问题讨论】:

    标签: string recursion lisp symbols


    【解决方案1】:

    使用函数STRING

    CL-USER > (string "FOO")
    "FOO"
    
    CL-USER > (string 'FOO)
    "FOO"
    

    【讨论】:

      【解决方案2】:

      您可以使用格式函数进行转换。当然它比列出的其他选项慢,但它可以处理其他数据类型,控制大写/小写等。因此,对于开发或代码的非内循环部分,这可能对您有用:

      CL-USER>
      (format nil "~a" "str")
      "str"
      CL-USER>
      (format nil "~a" 'str)
      "STR"
      CL-USER> 
      (format nil "~(~a~)" 'str)
      "str"
      CL-USER>
      (format nil "~(~a~)" "str")
      "str"
      CL-USER> 
      ~          
      

      【讨论】:

        【解决方案3】:
        CL-USER> (defun symbol-or-string-to-string (x)
               (typecase x
                 (symbol (symbol-name x))
                 (string x)
                 (otherwise (error "Wrong type"))))
        SYMBOL-OR-STRING-TO-STRING
        CL-USER> (symbol-or-string-to-string "foo")
        "foo"
        CL-USER> (symbol-or-string-to-string 'foo)
        "FOO"
        CL-USER> (symbol-or-string-to-string #())
        ; Evaluation aborted.
        CL-USER> 
        

        但是重复转换它的想法听起来很奇怪。你能说明你为什么需要这样做吗?

        【讨论】:

        • 谢谢,我需要它用于获取符号的递归函数,并且只能在第一次调用中转换它,并且在下一次调用(调用子字符串时)不转换,因为它已经是一个字符串..
        • 您可以在此处使用etypecase,这将更准确地表示更具体的错误
        猜你喜欢
        • 2014-09-28
        • 2013-10-31
        • 2017-07-13
        • 1970-01-01
        • 2010-12-03
        • 2018-01-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多