Lisp - конвертировать символ в строку, только если строка еще не

Есть ли способ преобразовать символ в строку, только если он не является строкой в ​​lisp?

Это должно работать так:

(только-если-преобразование 'ABC) => "ABC"

(только-если-преобразование "ABC") => "ABC"

3 ответа

Решение

Используйте функцию STRING,

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

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

Вы можете использовать функцию форматирования для преобразования. Конечно, он медленнее других перечисленных опций, но может работать с другими типами данных, управляет прописными / строчными буквами и т. Д. Поэтому для разработки или частей кода, не входящих в цикл, это может быть полезно для вас:

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> 

Но идея его преобразования звучит странно. Можете ли вы показать, зачем вам это нужно?

Другие вопросы по тегам