3

一部のコードを読みやすくするために、case ステートメントを使用しようとしています。一連の if 文として動作するように見えますが、なぜか case 文は true でなくても常に nil との比較を受け入れます。この動作が発生する理由を誰かが明確にすることはできますか?

例:

> (case 'a            
    (nil nil)         
    (otherwise 'b))   
NIL                   
> (case 'a            
    ('a 'b)           
    (otherwise nil))  
B                       

上記の例では、'a が明らかに nil ではないにもかかわらず、最初のインスタンスは nil を返します。if ステートメントで同じことをしようとすると、期待どおりに動作します。

> (if (eq 'a nil) nil 'b)    
B                            
> (if (eq 'a 'a) 'b nil)     
B                            

私が理解していないケースステートメントについていくつかの動作があると仮定しています。どんな助けでも大歓迎です。

編集:明確にするために、「aは評価されないことを知っています。この例をモックアップして、case ステートメントのターゲットが確実に nil でない状況を作成しました。

私は xlisp-plus を使用していますが、実際の clisp インストールを試して、動作が異なるかどうかを確認します。

編集(もう一度):CLISPをインストールすると、そこで正常に動作します。なぜ xlisp が異なるのかを調査するのに苦労する価値はありません。皆さん、健全性チェックをありがとう。

4

5 に答える 5

4

a 内の各キー指定は、CASEリテラルのリストまたは単一のアトムのいずれかです。ただし、CLtL は、アトムがNILNILリテラルか空のリストかが曖昧であるため、アトムがあってはならないことを示しています。NIL代わりに次のリストを使用します。

> (case 'a
    ((nil) nil)         
    (otherwise 'b))
B
> (case nil
    ((nil) nil)         
    (otherwise 'b))
NIL
于 2011-05-23T14:15:10.503 に答える
2

Common Lisp は、CASE の場合、テストする項目がアトムまたはアトムのリストであることを想定しています。テストは関数 EQL でもあります。

(case 'a
  (a 'b)    ; EQL a
  (otherwise 'foo))

(case 'a
  ((a b c) 'foo)   ; EQL to one of a, b or c
  (otherwise 'bar))

の引用は偶然にのみ機能します。使用しないでください:

; don't use this:
(case 'a
  ('a 'foo)    ; <- bad!  , EQL to QUOTE or A
  (otherwise 'bar))

上記は次と同じです。

; don't use this:
(case 'a
  ((quote a) 'foo)   ; <- bad! ,  EQL to QUOTE or A
  (otherwise 'bar))
于 2011-05-23T18:09:17.000 に答える
1

LISP のバージョンに依存すると思います。Mac に LispWorks があり、結果は次のとおりです。

CL-USER 2 : 1 > (case 'a            
    (nil nil)         
    (otherwise 'b))   
B
于 2011-05-23T13:59:33.640 に答える
1

ここでは SBCL と同じ:

CL-USER> (case 'a
           (nil nil)
           (otherwise 'b))
B

つまり、'aシンボルであり、 になることはありませんnil

于 2011-05-23T14:02:57.437 に答える
0

フォーム内の値caseは暗黙的に引用符で囲まれたリテラルのリストであるため、次のようになります。

(case 'a
  ((a) 'b)
  (otherwise nil))

あなたが望むものです。 otherwise(他の人が言ったように)動作するはずです-t代わりに試してください。

ところで、'aリーダーを使用すると、次のように読み取られます(quote a)。つまり、値が の場合にも選択されますquote。たとえば、

(case 'quote
  ('a 'b)
  (otherwise nil))
于 2011-05-23T14:04:32.283 に答える