2015-04-04 60 views
1

我仍然有問題需要真正掌握case。我明白你提供使用eq內部比較符號,但是我不知道如果我得到一個正確的事情:使用帶有一個或多個符號的案例

我已經看到,我可以寫,如:

(case n 
    (23 'foo) 
    (42 'bar) 
    (otherwise 'something-else)) 

我也可以這樣寫:

(case n 
    ((23 42) 'foo-or-bar) 
    (otherwise 'something-else)) 

所以,我說的對,如果我指定一個列表,case然後檢查是否變量n比賽列表中的元素之一,但如果我指定一個單一的值,然後case直接匹配這個值?

換句話說:如果我只有一個值,可以使用非列表版本嗎?

+0

你爲什麼不嘗試它?轉到lisp提示符並輸入內容,如'(let((n 3))(case n((2 3)'foo)(4'bar)))'。但是,是的,這是正確的。 – lurker 2015-04-04 15:32:45

回答

4

鍵是鍵

的概念列表概念每個子句使用密鑰列表。測試密鑰將與鍵列表中的每個鍵進行比較。

關鍵列表(foo bar baz)正好是(foo bar baz)

鑰匙foo被認爲表示(foo)。它有助於編寫更短的代碼。

(case x 
    (foo  41) 
    ((bar baz) 42))) 

T的例外,否則

注意otherwise(otherwise)t(t)有例外。你需要寫(otherwise),如果你想匹配的符號:

(case 'otherwise 
    ((otherwise) 'the-symbol-otherwise) 
    (otherwise 'the-otherwise-clause)) 

EQ與EQL

還要注意的是,在Common Lisp的大多數比較默認與EQL,不EQ完成。 EQ是指針相等,EQL也適用於數字和字符。

+0

好吧,那麼'否則'的特殊情況下,總是使用括號可能是個好主意,對吧? – 2015-04-04 15:47:03

+0

@GoloRoden:大多數代碼不會爲單個項目鍵列表使用括號。 – 2015-04-04 15:48:15

+0

好的。感謝:-) – 2015-04-04 15:48:32

2

這不是直接回答你的問題,但我們可以使用lisp來查看它在做什麼。

如果在CLHS頁面查找case我們可以看到它是一個宏觀的,這意味着我們可以macroexpand它,看它變成什麼成

因此,讓我們第一個例子

(case n 
    (23 'foo) 
    (42 'bar) 
    (otherwise 'something-else)) 

這種擴展到

(LET ((#:G1246 N)) 
    (COND ((EQL #:G1246 '23) NIL 'FOO) 
     ((EQL #:G1246 '42) NIL 'BAR) 
     (T NIL 'SOMETHING-ELSE))) 

#:G1246是我們能想到的一個象徵保證通過口齒不清唯一一個gensym ..我會只是將其重命名爲tmp現在

(let ((tmp n)) 
    (cond ((eql tmp '23) nil 'foo) 
     ((eql tmp '42) nil 'bar) 
     (t nil 'something-else))) 

而且cond是一個宏觀的..讓我們來看看如何擴展(我已經簡化它有點像上文)

(let ((tmp n)) 
    (if (eql tmp '23) 
     'foo 
     (if (eql tmp '42) 
      'bar 
      'something-else))) 

現在我們可以看到所有的邏輯

現在,讓我們展開下一個

(case n 
    ((23 42) 'foo-or-bar) 
    (otherwise 'something-else)) 

成爲s

(let ((tmp n)) 
    (if (or (eql tmp '23) (eql tmp '42)) 
     'foo-or-bar 
     'something-else)) 

Macroexpand是該死的有用的。希望這可以幫助

+0

這確實非常有幫助,感謝詳細的解釋:-)) – 2015-04-04 20:26:14

+1

哦,如果你使用emacs與粘液,然後將光標停留在開始paren和'Ctrl + Return'這將擴大到一個新的緩衝區,然後可以展開內部宏或使用撤消「解除展開」它們。宏觀展望的這種探索性使用非常具有啓發性。 (Vim slimv也會有一個鍵綁定,但我不知道它是什麼) – Baggers 2015-04-04 21:39:41