[Anthy-dev 2915] Re: [r5rs] Guard

Back to archive index

YamaKen yamak****@bp*****
2006年 4月 27日 (木) 16:01:30 JST


ヤマケンです。反応遅くなってすいません。

At Sat, 08 Apr 2006 16:08:30 -0700,
jun.l****@gmail***** wrote:
> 
> YamaKen <yamak****@bp*****> writes:
> >> 自分では expand-macro で展開を確認しながら scm_format を埋めて debug 
> >> してるんですが、sscm では出力が unwrap-syntax されてしまうので scope 
> >> 周りの debug が不便です。原因はguard_body() で返り値に delay() を被せ
> >> てるからですが、どう直すべきかわかりません。というか guard 周りの code 
> >> はどうもよくわからない & わかるまで粘る気になるような外見でないので、
> >> 書いた人に見てほしいんですが… > ヤマケンさん

> 端的に言えば
> 
> sscm> (define-syntax macro
>         (syntax-rules ()
>           ((_) sym)))
> 
> という前提で、現状
> 
> sscm> (expand-macro macro)
> sym
> 
> となってるのが
> 
> #<farsym 0 sym>
> 
> になってほしいということです。

とっくに見てると思いますが、r3289で対応しておきました。

> > こんな不自然なコードになっているのはSRFI-34の参照実装を機械的にC 
> > にベタ移植しているからで、なぜそうしているかと言うと、Scheme処理
> > 系の満たすべき仕様に精通しているとは言えない私がSRFI-34実装の正
> > しさを保証するには既存のauthoritativeなコードを主観の入り込む余
> > 地のない形で移植するしか手がないからです。
> >
> > このポリシーによって実装の正しさを保証する限り、許されるコード変
> > 更は機械的?に等価な変換だけとなります。意味的に等価、という仕様
> > の解釈が入る書き換えは行ってはいけない。したがって、元のコードで
> > lambdaを使っているところはCのコードでもlambdaを使う必要がありま
> > す。
> >
> > R5RSやSRFIのドキュメントを拝借する際に文言をいじるべきではない、
> > というのも同様の思想です。
> 
> SRFI 文書の参考実装を忠実に C に転写するのは構いませんが、それが参考実
> 装の code (である list 構造) を C data で表現するという意味であれば C 
> 路線を捨てて core 以外 scheme で書いた方が確実で効率的です。(SRFI も殆
> どコピペで済むし、read の overhead が嫌ならScheme→C converter を 
> scheme で書けば良い。多分 50 行以内で済むでしょう。)

そんな風に既成の枯れたライブラリを使いまわしたいというのがSIODに
代わるScheme処理系を求めたそもそもの動機なので、私はむしろCのコー
ドを減らしたい派です。太田さんの方針もあるのでR5RS部分については
library procedureも少ないことだしall Cでいいかと思っていますが。

一方、SRFIについては必要性が無い限りCで実装する事には積極的に反
対です。今までに書かれたmodule-srfi*.cはSchemeでは書けなかったか、
pure Schemeでは著しく効率が落ちるものだけです。SRFI-34もCで書き
たいわけではなく、実装時点でマクロを利用できなかったからああなっ
ただけです。

太田さんが書きかけのmodule-srfi1.cは上記に当てはまりませんが、
uimではSLIB実装の方を使うつもりである事は最初期から繰り返し表明
しています。効率のために一部のprocedureをCで独自実装する事は考え
られますが。

井上さんがマクロを実装してくれたおかげで既存のSchemeによるSRFI実
装を流用できる幅が大きく拡がったわけですが、今あるmodule-srfi*.c 
は効率面重視の選択肢としてそのまま併存させるつもりです。一定の品
質も確保できていると考えているし、マクロはいらないがSRFI-8は欲し
いというような場面もあると思うので。

> それより、
> 
> > Scheme処理系の満たすべき仕様に精通しているとは言えない私がSRFI-34実
> > 装の正しさを保証するには
> 
> という部分が非常に気になります。言葉の齟齬がある気がしますが、もしこれ
> が、ヤマケンさんが自分でよくわかってないものをよくわからない code を拝
> 借して形にしようとしている、という意味であれば危険極まりないと思います。
> 他人 (∋過去の自分) の実装に正しさを求めるなら、その実装の働きを理解し
> ないと正しくコピペすることもできません。

さすがに文書による仕様そのものの規定とコード各部の意味、実行の流
れぐらいは理解してから移植しています。ブラックボックスのまま変換
したわけではありません。ただし、この指摘で痛いところを突かれたの
は確かで、コード各部がなぜそのような実装になる必要があるのかとい
う各種要求仕様の洗い出しや、それを転じた最適化の余地の把握は十分
にできていません。

がしかし、これらの考察不足によりバグを見逃している可能性も無いと
は言えませんが、想定される利用範囲についてはテストを書いて動作を
検証済なので、品質はSigScheme全体の中ではむしろ高い方と想定して
います。他の部分を置いてここにこれ以上の労力を割くのはナンセンス
です。

上記の考察や最適化を行っていないのは、[Anthy-dev 2500]で指摘され
たようなScheme処理系に関する知識・経験の不足による見落としの可能
性を考えての事です。したがって、環境、継続、クロージャ等のインス
タンスの生成・操作は参照実装と同じタイミングで行うようにしていま
す。一方、それらのパラメータが少なく、影響範囲と等価性を確信でき
る末端のコードについては最適化を行っています(call-with-valuesの
省略等)。これは「SRFI-34仕様を解釈した上での意味的に等価な再実装」
ではなく「参照実装のコード片の機械的な変換」の範疇のつもりです。

また、効率を追うにしても将来的に何らかのマクロ機構の利用が選択肢
に入ってからでないと最善の結果にならないと考え、苦労して最適化を
行う価値が無いとの判断もありました。

ではマクロが使えるようになった今はどうかというと、まだmacro.c等
の実装の整理や(フットプリントを含めた)パフォーマンスの分析等が終
わっていないので、当面はmodule-srfi34.cを利用しようと思っていま
す。

> 実際、guard は verbatim に転写できていません。参考実装が define-syntax 
> を使っている関係から中途半端に C に手が出ているために、解釈が紛れ込ん
> でいます (「何の」かは難しいところですが)。その証拠に expand-macro を
> 使えば sigscheme の実装と SRFI-34 の参考実装を scheme level で見分けら
> れます。
> 
> (define-syntax macro
>   (syntax-rules ()
>     ((_) (let ((sym 0)) sym))))
> 
> ;; srfi-34 の実装をコピペ (省略)
> 
> (write
>  (guard (err (else #f))
>         (expand-macro macro)))

想定している「解釈」「機械的に移植」の範囲が食い違っているからと
は思いますが、これをもって移植失敗の実例とするのはさすがに勘弁し
て欲しいです。

あれを実装した時点では「quoteしたオブジェクトをevalしたら元のオ
ブジェクトが得られる」という前提が崩れる事は想定してなかったわけ
で、実際scm_s_quote()だけを元の実装に戻せば上記の2実装は同じ結果
を返します。「参照実装がquoteの実装に依存しないのだから、その移
植版でもかくあれ」というレベルのverbatimなマッピングを目標にして
いるわけではありません。

-------------------------------
ヤマケン yamak****@bp*****



Anthy-dev メーリングリストの案内
Back to archive index