!eq の仕様について
Closed this issue · 11 comments
pasberth commented
- false の場合は nil 、 true の場合は 0 を返す
- 同値性のみ調べる。同一性はない。 "abc" と "abc" は常に 同じもので。
- 違う型の比較は常に false 。97 と 'a' は false
- リストは再帰的に調べる。 false がひとつでもあれば false
- クロージャは常に false 。たとえ同じ関数でも false (同一性がないのにまったく同じ事をする f と g が !eq f g は false だとして !eq f f が true なのはおかしい)
ympbyc commented
同一性を調べるものも必要。
eqは同一性eqvかequalが同値性がいいと思う。
eqでは!eq f fはtrue
pasberth commented
同一性は調べられなくていい、というか、同一性は意識したくない。
必要だったら unique っていう同値の値が唯一しかない値を導入しよう。
リストに unique いれとけば同一性もうまく表現できる
pasberth commented
それに 今の VM の実装は同一性なんてないから実装がかなり複雑になっちゃうよ
pasberth commented
破壊的な変更ができないなら同一のものであるか調べられる意味はないと思う
ympbyc commented
破壊的変更と同一性は関係ない。
同一性が調べられないとクロージャを値としてまともに使えない。
pasberth commented
え・・・?
クロージャとクロージャを比較したいときなんてそうそうなくない?
クロージャとクロージャを比較したいならクロージャだけ !eq
での判定を同一性にすればいいと思う。
!eq と !equal のふたつ用意してリストとかの同一性まで判定できるようにはしなくていい。
ympbyc commented
クロージャを値として使うのに慣れればばよくあるよ。
マップのキーにしたりコールバック(CPS)として渡したときとか。
じゃあクロージャは同一性判定でOK.
クロージャの同値性を判定する方法があればそれでもいいけど多分むずいので。
pasberth commented
ok. 名前は短い方がいいので !eq
がいいとおもうけど
Scheme に合わせるなら !equal
でもいいかも
どうせマクロ書くし
ympbyc commented
equalに一票
pasberth commented
じゃあ equal で
pasberth commented
この仕様で決定し、実装されてる