[Gauche-devel-jp] Re: lib/slib.scmの(home-vicinity)

Back to archive index

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



Gauche-devel-jp メーリングリストの案内
Back to archive index