Squeak Smalltalk における“真偽のほど”


Smalltalk では真は true 、偽は false だけです。

よく知られているように Smalltalk では条件分岐などの処理は単なるメソッドコールで、それらのメソッド(#ifTrue:ifFalse: など)はクラス Boolean に定義されています(実際には true 、false それぞれが属するクラスである True 、False でオーバーライドされている)。

したがって、ture もしくは false 以外のオブジェクトをレシーバにして起動しようとしてもエラー(実際には警告。 true として続行可能)になります。


Squeak Smalltalk では Infinity は Flaot infinity で、NaN は Float nan で作れます。この種の値を持つかどうかを含め Smalltalk 処理系ごとに違います。

true  ifTrue: [#TRUE] ifFalse: [#FALSE]    "=> #TRUE "
false ifTrue: [#TRUE] ifFalse: [#FALSE]    "=> #FALSE "
0     ifTrue: [#TRUE] ifFalse: [#FALSE]    "=> NonBooleanReceiver: proceed for truth. "
1     ifTrue: [#TRUE] ifFalse: [#FALSE]    "=> NonBooleanReceiver: proceed for truth. "
0.0   ifTrue: [#TRUE] ifFalse: [#FALSE]    "=> NonBooleanReceiver: proceed for truth. "
Float nan             ifTrue: [#TRUE] ifFalse: [#FALSE]    "=> NonBooleanReceiver: proceed for truth. "
Float nan isNaN   "=> true "
Float nan = Float nan   "=> false "
Float infinity        ifTrue: [#TRUE] ifFalse: [#FALSE]    "=> NonBooleanReceiver: proceed for truth. "
(Float infinity - 1) isInfinite   "=> true "
Float infinity - 1    ifTrue: [#TRUE] ifFalse: [#FALSE]    "=> NonBooleanReceiver: proceed for truth. "
(Float infinity - Float infinity) isNaN   "=> true "
Float infinity - Float infinity ifTrue: [#TRUE] ifFalse: [#FALSE]    "=> NonBooleanReceiver: proceed for truth. "
'0'   ifTrue: [#TRUE] ifFalse: [#FALSE]    "=> NonBooleanReceiver: proceed for truth. "
'0.0' ifTrue: [#TRUE] ifFalse: [#FALSE]    "=> NonBooleanReceiver: proceed for truth. "
''    ifTrue: [#TRUE] ifFalse: [#FALSE]    "=> NonBooleanReceiver: proceed for truth. "
#()   ifTrue: [#TRUE] ifFalse: [#FALSE]    "=> NonBooleanReceiver: proceed for truth. "
Dictionary new ifTrue: [#TRUE] ifFalse: [#FALSE]    "=> NonBooleanReceiver: proceed for truth. "
nil   ifTrue: [#TRUE] ifFalse: [#FALSE]    "=> NonBooleanReceiver: proceed for truth. "
nil not   "=> MessageNotUnderstood: UndefinedObject>>not "