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>
Но идея его преобразования звучит странно. Можете ли вы показать, зачем вам это нужно?