Gauche:R7RS関連
R7RS Large
with-exception-handler の注意点
- R7RS で書かれたプログラムを改造して、通常の Gauche モードで動かしていて、
妙に不安定になったことがありました。
原因は、with-exception-handler の仕様の違いでした。
Gauche の with-exception-handler は、SRFI-18 版であり、
handler の実行中に例外が発生すると、再び同じ handler が呼ばれて、
無限ループになることがあります。
一方、R7RS の with-exception-handler は、handler の実行中に例外が発生すると、
それは外側の handler で処理されるため、ループにはなりません。
対策としては、以下のように R7RS の with-exception-handler を use することが挙げられます。
これによって R7RS と同じ動作をさせることができます。
(use scheme.base :only (with-exception-handler read-bytevector write-bytevector flush-output-port error-object-message error-object-irritants))
hamayama(2019/09/21 04:31:32 UTC)
R7RS Benchmarks
- 以下のページにR7RS用のベンチマークのプログラムがあります。
https://github.com/ecraven/r7rs-benchmarks
(実行結果 https://ecraven.github.io/r7rs-benchmarks/benchmark.html )
- 実行結果の Gauche の項目で、2個エラーになっていたので、調査してみました。
https://github.com/Hamayama/Gauche-r7rs-bench-diff
- dynamic のエラーについては、キーワード型が認識できずにエラーとなっていました。
- gcbench のエラーについては、トップレベルではなく 手続きの内部で、
define-record-type を使用しているところがあり、そこでエラーになっていました。
R7RS の 5.5 を読むと、define と同じように使えるというようなことが書いてありました。
- あと、自分のPCのメモリ量(RAM 4GB)では、array1 と mperm がメモリ不足で
うまく実行できませんでした。
- これらについて対策を行い、実行した結果は、以下のようになりました。
https://drive.google.com/open?id=1Pg2CQukfBvC8a0baThT71br4vPyqiqRpK_dliJmY39I
冒頭の実行結果と比べると、全体的に2倍くらい遅くなっていますが、
CPU, メモリ量, OS等の違いかと思います。
hamayama(2016/07/29 10:32:53 UTC)(2018/07/10 04:03:15 UTC)
Shiro(2016/07/29 11:40:24 UTC): あ、define-record-typeがトップレベル以外で使えなくなってるのは意図しないバグです。アクセサをインライン展開しようとしてdefine-inlineにしたのがミスだった.
Shiro(2016/07/29 11:51:32 UTC): このコミットhttps://github.com/shirok/Gauche/commit/0e8d4c712f3def0bea1b8e46bfe3a30148ff8b06 で直らないかな>define-record-type。
それからキーワードについては、環境変数GAUCHE_KEYWORD_IS_SYMBOLを何らかの値に設定しておいてもらえばキーワード型がシンボルになるのでr7rs上位互換になるはずです。
- hamayama(2016/07/29 15:49:18 UTC): ありがとうございます。問題なく動くようです。
- hamayama(2019/09/21 04:40:23 UTC): Gauche 0.9.8 から、デフォルトでキーワードはシンボルになったため、
上記の環境変数の設定は不要になりました。