2

私のコードを見てみましょう

コード 1:

(eqv? 'lambda 'quote)

戻る#f

コード 2:

(case 'lambda ('quote "equal") (else "not equal"))

戻り"not equal"ますが警告を生成します;;; <stdin>:17:0: warning: duplicate datum quote in clause ((quote quote) "equal") of case expression (case (quote lambda) ((quote quote) "equal") (else "not equal"))

Code3:奇妙な結果

 (case 'quote ('lambda "equal"))

"equal"警告なしに戻る

を使用してコードを解釈しguile (GNU Guile) 2.0.11ました。そして、ここにgnucaseの構文の説明があります

この評価の結果は、eqv? を使用してすべてのデータムと比較されます。

4

1 に答える 1

6

'<something>リストです。Scheme では、case フォームはリストでなければなりません (Common Lisp などの一部の Lisp では、その要素だけのリストを表す単一の非リスト要素にすることもできます)。 (quote <something>)

(case n
  ((0) 'zero)                 ; in Common Lisp, could also be (0 'zero)
  ((1 2 3) 'one-two-or-three)
  ((4 5) 'four-or-five))

あなたがするとき:

(case some-symbol
   ('quote 'it-was-quote))

あなたはやっている

(case some-symbol
  ((quote quote) 'it-was-quote))

したがって、リストを提供していて、要素が重複しています。何も問題はありませが、通常は予期しないことなので、警告が表示されます。

その理屈で

(case 'quote ('lambda "equal"))

と同じです

(case 'quote ((quote lambda) "equal"))

そして、シンボルquoteはリスト(quote lambda)にあるため、大文字と小文字が一致し、「等しい」となります。この話の教訓は、「場合に応じてケースを引用しないでください」です。つまり、次のことを行う必要があります。

(case 'quote
  ((lambda) "equal"))
于 2015-12-01T13:39:48.790 に答える