2016-03-01 103 views
0

帶Lisp中的字符串的開關語句。Lisp中的開關語句

(defun switch(value) 
     (case value 
     (("XY") (print "XY")) 
     (("AB") (print "AB")) 
    ) 
    ) 

我想比較是否值爲「XY」,然後打印「XY」或「AB」相同。 我試過這段代碼,但它給了我零。有人能告訴我我做錯了什麼嗎?

+0

你的圓括號都是錯的,'case'是通過身份進行比較的。 – molbdnilo

+0

@molbdnilo請你指出錯誤。因爲這個'案子'我完全迷失了。我嘗試了一堆的變化,但沒有人爲我工作 – Sagar0921

+0

print(「XY」)?那是哪種編程語言?它看起來像Lisp嗎?不是真的。 –

回答

3

print("XY")看起來更像是Algol(及其所有descendants)而非LISP。要應用print人會環繞在括號中的操作和參數,像(print "XY")

case恰好是一個宏,你可以自己用引用代碼傳遞給macroexpand和我在執行測試的結果我得到:

(let ((value value)) 
    (cond ((eql value '"XY") (print "XY")) 
     ((eql value '"AB") (print "AB")))) 

您應該知道eql僅適用於原始數據類型和數字。字符串是序列,因此(eql "XY" "XY") ;==> nil

也許你應該使用別的東西而不是case。例如。使用condifequal

2

您可以使用庫alexandria,其中有一個可配置的switch宏:

(switch ("XY" :test 'equal) 
    ("XY" "an X and a Y") 
    ("AB" "an A and a B")) 
2

CASEHyperspec說:

這些宏允許的形式身體的一個條件執行子句通過匹配其身份的基礎上的測試密鑰來選擇。

CL中的字符串不相同,即(EQ "AB" "AB") => NIL

這就是爲什麼CASE不適用於字符串。您或者需要使用符號(它們僅被實施一次,因此保證身份),或者使用CONDEQUAL甚至EQUALP如果字母大小寫被忽略。