週刊mosh - GCのアップデート / GCと循環参照 / 月刊R7RS
Moshは0.2.7のRC期間。今のところ大きな問題は発覚してないけど、現在様子見中。
GCのアップデート - libtoolを使わなくなった
GCをCVS版にアップデートする過程で、autotools版のビルド(./configureを使うビルドの事)でも、GC側のconfigureを使わず、直接リンクするようになった。これは、CMake版では従来からやっていたことで、間接的にはMonaOS版も同じことをしている。
この方式のデメリットは、GCを構成するソースコード全てを常に正しく列挙しなければならない点で、アップデートがちょっと面倒になる。ただ、CMake版はどっちにせよこれが必要なので諦めている。(実は最近のBoehm GCはCMakeにも対応しているが、CMakeはサブディレクトリのプロジェクトにオプションを渡す便利な方法がないので使えない。)
最大のメリットはCygwinでのビルド時間が大幅に削減されたこと。Windows上でMoshを開発するにはCygwin版のMoshも必須なので。。あとディストリビューション毎に地味にバージョンが違うlibtoolは移植性の問題になりやすかったのでこれを避けることで移植性を高めることができる。
GCと循環参照
GCをアップデートすると、
GC Warning: Finalization cycle involving 0x5843bc0
のような警告が良く出るようになった。これはC++のGCインターフェースを使う限りは仕方ないことなので、今のところは無視するしかない。
本質的な問題は、GCのファイナライザを使ってPortをcloseしようとしている点。
Portクラスはgc_cleanupを継承していて、GCによって回収される際にデストラクタを呼ぶようにしている。しかし、Port(を継承したオブジェクト)は他のオブジェクトを指す可能性があるため、ユーザがPort同士を循環参照させると必ずこのメッセージが出てしまう。
Boehm GCは保守的GCなためファイナライザが呼ばれない可能性が有るわけで、ファイナライザで何か副作用を伴う仕事をするのは好ましくない。今回で言うと、ユーザはGCが自動的にPortをcloseする挙動に依存する可能性があるが、これはあまり良いプログラミング習慣でない。
月刊R7RS - SyntaxとVariableのdefine
R7RSは現在第3次投票の準備中であまり動きなし。細かい議論は継続して行われている。
(let () (define (foo) 1) (define (bar) (foo)) (define-syntax foo (syntax-rules () ((_) 2))) (bar)) The final syntax definition of `foo` is shadowing a previous definition, but neither has affected the expansion. I think in addition to your text we should just simply say that multiple internal definitions of the same identifier are an error (as Ikarus says).
冷静に考えるとdefineとdefine-syntaxで同じ識別子を定義したときの挙動は従来謎だった。というわけで、R7RSでは上のfooのように、defineとdefine-syntaxの両方で定義される場合はエラーということになる模様。
letrec*やletrec-syntaxの場合と違って、defineやdefine-syntaxは明確なスコープを持たないので扱いが地味に難しい。
元の議論は"syntaxの前方参照は禁止しないのか"( http://lists.scheme-reports.org/pipermail/scheme-reports/2011-June/001124.html )という議論で、確かに従来のSchemeはこれを明確に禁止していなかったので、one-passでexpandすることが出来なかった。