3

シンボルがまだlispの文字列でない場合にのみ、記号を文字列に変換する方法はありますか?

これは次のように機能するはずです。

(変換の場合のみ'ABC)=> "ABC"

(変換が「ABC」の場合のみ)=>「ABC」

4

3 に答える 3

8

関数を使用しますSTRING

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

CL-USER > (string 'FOO)
"FOO"
于 2012-06-15T21:59:40.070 に答える
3

format 関数を使用して変換を行うことができます。リストされている他のオプションよりも遅いと認められますが、他のデータ型、コントロールの大文字/小文字などで機能します。したがって、開発、またはコードの非内側ループ部分では、これが役立つ場合があります。

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> 
~          
于 2012-06-16T18:21:55.477 に答える
2
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> 

しかし、それを繰り返し変換するという考えは奇妙に聞こえます。なぜそれをする必要があるのか​​を示すことができますか?

于 2012-06-15T13:26:32.617 に答える