帶Lisp中的字符串的開關語句。Lisp中的開關語句
(defun switch(value)
(case value
(("XY") (print "XY"))
(("AB") (print "AB"))
)
)
我想比較是否值爲「XY」,然後打印「XY」或「AB」相同。 我試過這段代碼,但它給了我零。有人能告訴我我做錯了什麼嗎?
帶Lisp中的字符串的開關語句。Lisp中的開關語句
(defun switch(value)
(case value
(("XY") (print "XY"))
(("AB") (print "AB"))
)
)
我想比較是否值爲「XY」,然後打印「XY」或「AB」相同。 我試過這段代碼,但它給了我零。有人能告訴我我做錯了什麼嗎?
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
。例如。使用cond
或if
與equal
。
您可以使用庫alexandria
,其中有一個可配置的switch
宏:
(switch ("XY" :test 'equal)
("XY" "an X and a Y")
("AB" "an A and a B"))
上CASE
的Hyperspec說:
這些宏允許的形式身體的一個條件執行子句通過匹配其身份的基礎上的測試密鑰來選擇。
CL中的字符串不相同,即(EQ "AB" "AB") => NIL
。
這就是爲什麼CASE
不適用於字符串。您或者需要使用符號(它們僅被實施一次,因此保證身份),或者使用COND
與EQUAL
甚至EQUALP
如果字母大小寫被忽略。
你的圓括號都是錯的,'case'是通過身份進行比較的。 – molbdnilo
@molbdnilo請你指出錯誤。因爲這個'案子'我完全迷失了。我嘗試了一堆的變化,但沒有人爲我工作 – Sagar0921
print(「XY」)?那是哪種編程語言?它看起來像Lisp嗎?不是真的。 –