scheme

テストを楽しく

./mosh -t で実行されるテスト実行過程と結果表示を変更。 "\r" を利用してテスト数がカウントアップされる。(CPAN のテストみたいに) Running 752/765 (13 ToDo) ... passed ToDo 記法も用意。エラーにしたくはないが、将来必ず通すべきテストである事を明…

Install gmp-4.2.4 on OSX 10.5.4

libgmp をリンクしようとして以下のエラーが出たら。 ld: warning in /usr/local/lib/libgmp.dylib, file is not of required architecture Undefined symbols: "___gmpz_init", referenced from: _main in cce3wyEi.o ld: symbol(s) not found collect2: ld…

mpq_set_si

mpq_set_si の3つめの引数は unsigned 。はまった。

Numeric Tower - Flonum and Bignum

Flonum は double で表現することに。Bignum は mpz_t 。異なる型同士の演算は似たような関数が多くなる。プリプロセッサマクロで楽をした。多少読みづらくはなるが、ミスの可能性が局所化されるので利用する。加減乗除と比較と write を実装。細かい手続や …

Numeric Tower の実装を考える

まずは仕様の概要をつかむ。 Numeric Tower number(数) complex (複素数) real (実数) flonum rational (有理数) integer (整数) fixnum bignum 正の無限大,負の無限大,非数(NaN) 0.0と-0.0 exact/inexact 演算 例えば GNU MP を使うとして、使える範囲は …

論文読もうとやる気出したら

http://www.citeulike.org/tag/scheme で面白そうな論文を見つけて読もうと思ったら。有料だったorz...。

R6RS ライブラリの serialize/load

R6RS ライブラリの serialize/load を実装中。フレームワークは psyntax 側に用意されているのであれこれと読み漁る。 やっと動いたよ。これにより psyntax のS式変換フェーズをばっさり省略できるのでやっぱり速い。 いくつか考えるべき事があるのでメモ。 …

なぜ quote が分からなかったか?

SICP を読みながら Scheme インタプリタを書いていた頃。quote の仕様と実装方法が分からなくて困ったことがあった。そのときなぜ分からなかったか?というのが今になって思い出したので書いておく。 理由はデータとコードとS式の関係がもやもやとして分かっ…

Mosh trunk のコンパイル方法

先日メールでお問い合わせ頂いたり、id:tazant さんにも触ってもらっているようなので、Mosh trunk のコンパイル方法を書いておきます。Makefile.am の # when you release comment out start という行から # when you release comment out end までをコメン…

equal? は使わない

equal? は速くないのであまり使わないように。assq で良いところを無駄に assoc を使っているところがあり遅かった。

半分冗談だけど

Faslでコードの埋め込みをやるならば、更に進めて VM の初期状態を埋め込むと起動がめっさ速くなるんじゃなかろうか。 レジスタ スタック 名前空間のハッシュテーブル くらいを埋め込めば良い気がするね。(細かな問題はあるでしょうが)

細かい修正

スタックトレース中に assert で死ぬバグ Mosh のデフォルトの起動モードを R6RS モードに変更(以前は R5RS 相当がデフォルトだった) -b オプションは廃止。 これは感慨深い。 やっとまともな速度で動くようになった。 ファイルオープン時のエラーを error…

末尾呼び出し最適化 その3

結論としては末尾呼び出しの最適化は以前からうまくいっていた。 ただスタックの自動伸長の実装がなかったので初期化時にスタックサイズが決められていて、その大きめのアロケーションのせいで起動が遅かった。 作業 stack自動伸長を実装する。 vm.scm で実…

末尾呼び出し最適化 その2

input 末尾かどうか? 末尾までに消費したスタック output FRAME の削除 SHIFT の挿入 準備 vm/compiler をいじれるように用意する(rev 560) コンパイル結果を見せる 必ず記録を残す(こまめにコミット) 分からない動作 列挙 pass3/$local-assign val は ta…

末尾呼び出し最適化

いまさら末尾呼び出し最適化を見直しているのですが Gauche で以下のコードがスタックオーバーフローにならない理由が分からなくて混乱。 (define (my-map1 f l) (if (null? l) l (cons (f (car l)) (my-map1 f (cdr l))))) (my-map1 (lambda (x) x) (vector…

Fasl で幸せ

プリコンパイルして Mosh バイナリに埋め込まれる コンパイラ パターンマッチライブラリ psyntax を全て Fasl で読み込むようにした。 g++ でのコンパイル速度、Mosh 起動時のライブラリ読み込みともに速くなり幸せ。前者は予想していたが後者は予想外のうれ…

Gauche と Mosh の read/write の違い

はまったのでメモ。 #\null と #\nul |...| と ... :hoge Gauche ではキーワード。Moshでは識別子 (import (srfi :1)) 的なときに注意。

Fasl にたどり着かない

Mosh にたくさんバグが見つかった。がんがん修正中。 バグその1 現象:GC の malloc に対して巨大なブロック割当を要求し warning 発生。 原因:unbound variable 例外の発生時に例外内容を表示しようとしたら更に例外発生。(ダブルフォルト的) こういうの…

とても長い vector の read が遅い

とても長い vector の read が遅い。プロファイラで見たら yyparse の中で遅い。うわ。これは調べるの難しそうだ。 試しに gdb で実行して適当に SIG_INT で止めてみたら。getLastPair() だった。リストを読み出すときに append を使っているのが原因。 appe…

Fasl reader/writer 実装

Fasl の reader/writer を実装した。これからテスト。

Ypsilon vm boot 時のコード埋め込み

Scheme で書かれたコンパイル済みのコンパイラを C++ に埋め込む形で Mosh は書かれている。しかしながら2つほど問題がある。 g++ でビルドするときに遅い(環境によってはコンパイルが終わらない) コードを取得するときに重い 静的に決まらない部分の初期…

プロファイラが落ちるのを修正

unbound variable のエラーがうまくハンドル出来ていなかった。

Record の eqv?

Record の eqv に実装漏れがあったので修正。

REPL 対応完了

REPL で出る unbound variable の識別子が G24 のように gensym 由来の変数。ユーザーにはさっぱり理解できない。psyntax 側で何か仕組みを用意しているに違いない。 しかし見つからない。困った。と思ったら分かった。psyntax は gensym に識別子を渡してシ…

REPL 対応

re2c は入力をバッファリングするので (eval (read) ...) 的な事が構造上難しい。 そこで苦肉の策として get-line を使用し (eval (call-with-port (open-string-input-port (get-line (current-input-port))) read) (environment '(rnrs))) のように REPL …

R6RS Bytevector ほぼ実装完了

utf16->string なども実装が終わり、Bytevector の実装はほぼ完了。今回のリリースでは Bignum を含む Numeric Tower は実装しないので一部実装不可能なものがあるので「ほぼ」。残すは REPL psyntax.cpp などのプリコンパイル速度向上

Ypsilon の濃い話を聞いて

id:fujita-y さんの Ypsilon の実装話を聞いて 論文読まねば CPU周りの基礎知識が足りない と強く感じた。前者はどうやったらそういう習慣がつくのかなあ。 後者はぱただかへねだかをもう一回読む。 懇親会でまた聞きしたのですが、Ypsilon のコンパイル済み…

Shibuya.lisp Tech Talk #1 無事終了

Shibuya.lisp Tech Talk #1 無事終了しました。 スピーカーの皆さん、観客の皆さん、スタッフの皆さん、開催にたずさわった全ての皆さん本当にありがとうございました。 第1回という事で探り探りの開催でしたが、無事盛況のうちに終了しました。たくさんの出…

R6RS の Codec と Transcoder

R6RS の Codec と Transcoder を Scheme 側で実装するかで激しく悩む。 C++ 側から多少のサポートがあれば実装出来ると思う。問題はパフォーマンスかな。 Scheme で実装してみるか。 ああ。いやでも C++ 側に実装しないと既存のポート周りの実装をごっそり直…

bytevector 周りの実装 2

2.4 は後回し。 2.5 Operations on 16-bit integers エンディアンを考える必要。要は多バイトで構成されるデータを、どのようにバイト列に格納し取り出すかという話。 #vu8(#xff 0) をリトルエンディアンで取り出したら #x00ff で、ビックエンディアンなら #…