Shiro Kawai
shiro****@lava*****
2003年 12月 12日 (金) 17:04:50 JST
From: Shoji Kuzukami <kuzuk****@manba*****> Subject: [Gauche-devel-jp] Re: lib/slib.scmの(home-vicinity) Date: Fri, 12 Dec 2003 14:37:47 +0900 > いろいろ調べてみると,goshは, > (eqv? anyone1 anyone2) => #t > (equal? anyone1 anyone2) => #f > ということが起こりうるのですね. 本当はそういうことはあってはいけないので、Scm_Equalを修正すべきなのかも しれません。今の方法だと若干比較の回数が少なくて済むのですが。 > もうすこし勉強して改良しました. > というかequal?に組み込んでみました. 実際、eqv? で本当によいのか、という疑問はあります。 異なるバインディングを表現しているふたつのidentifierを比べた時、など。 (eqv? は遷移的でなければならないので、identifier vs symbolの場合に 名前で比較するなら、ふたつのidentifierも名前が同じならeqv? になるはず) 実際は、identifierに関して意味のある比較をするためには free-identifier=? や bound-identifier=? のような手続きを使う ことになると思うので、実質的な問題はあまり出ないとは思うのですが。 > さきほど試したところ > gosh> (define-syntax hoge (syntax-rules () ((hoge foo ...) (cdr b)))) > gosh> (equal? (macroexpand '(hoge bar)) '(cdr b)) > => #t equal? の方が意味が緩いですし、こちらなら名前で比較しても いいかなという気はしますね。 ;; ただ、WiLiKi:MacroProblemの問題を扱うなら、eqv? の方がいいのかな… ;; それならlegacy macro内でシンボルに対してcase式も使えるし… とりあえず、equal? に入れて様子を見てみますか。 --shiro