2016-11-17 11 views
5

私はScheme、Racket、Clojureの式(ここでClojureを使用)(and true '())()と評価し、(and '() true)trueと評価しました。これは、空のリストだけでなく、任意のリストに対しても当てはまります。 ブール値とリストの論理和

しかし、GNU CLISPやEmacs Lispの

(and t '())nilに評価し、 (and '() t)nilに評価されますが、 (and t '(1 2 3))(1 2 3)に評価し、 (and '(1 2 3) t)tに評価されます。

ここでは何が起こっていますか?

答えて

9

最初の言語グループでは、空リストは「偽」として扱われず、代わりに「真実」値として扱われます。スキームとラケットでは#falseが唯一の偽の値なので、'()がnullでもnullは偽ではありません。 clojureでは空のリストはnilと同じではないので、そこにも '真実'があります。

2番目のグループでは、空のリストはnilの同義語であり、偽とみなされ、条件はnilを返します。しかし、要素を持つリストはnilと同じではないので、再び真理値として扱われます。

パズルの最後の部分は、すべての値が真実である場合にandが最後の真理値を返すことです。

+0

しかし、SchemeとRacketでは '(null? '())'は真です。 Clojureでは、 '(nil? '())'は本当に間違っています。 –

+2

@clementi Scheme and Racketでは、 'null'は' '()と同じ値ですが、真実であり、(2) '()'や ''()'として出力します。 CLとelispでは、 'nil'は' '()と同じ値ですが、(1)偽です。(2) '()'ではなく 'nil'として出力します。 –

+0

@clementiは私の答えを更新しました。 alexisはまさに正しいです。 –

2

Clojureでは、falsenilは論理的に偽と見なされます。他のすべては論理的に真実とみなされます。

あなたが言及した他のLispsでは、空のリストは論理的に偽と見なされます。

2

演算子は引数を評価し、結果を「短絡」します。つまり、1つの引数がfalseになると直ちにnilを返します。それ以外の場合は、最後の値を返します。 動作の違いは、Common Lispでは、空のリストはnilと同じです。つまり、(and '() t)nilを返す(and nil t)と同じです。