シンボルがまだlispの文字列でない場合にのみ、記号を文字列に変換する方法はありますか?
これは次のように機能するはずです。
(変換の場合のみ'ABC)=> "ABC"
(変換が「ABC」の場合のみ)=>「ABC」
関数を使用しますSTRING
。
CL-USER > (string "FOO")
"FOO"
CL-USER > (string 'FOO)
"FOO"
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>
~
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>
しかし、それを繰り返し変換するという考えは奇妙に聞こえます。なぜそれをする必要があるのかを示すことができますか?