2012-06-15 129 views

回答

5

使用功能STRING

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

CL-USER > (string 'FOO) 
"FOO" 
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> 

但是反覆轉換它的想法聽起來很奇怪。你能證明你爲什麼需要這樣做嗎?

+0

感謝,我需要它的遞歸函數,得到一個符號,並具有將其轉換隻在第一個呼叫,並在接下來的調用(當調用子)不能轉換,因爲它已經是一個字符串.. –

+2

可以在這裏使用'etypecase',這將更準確地表示更具體的錯誤 –

0

您可以使用format函數進行轉換。誠然,它比列出的其他選項慢,但它可以在其他數據類型的工作,控制upcase/downcase等,所以對於開發或代碼的非內環部分,這可能對您有用:

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> 
~