scheme

outputz.el の設定

id:antipop さんの outputz.el 。id:hayamiz さんの設定例を参考に以下のように設定してみました。 Outputz のグラフではホスト名が先頭に来るので、メジャーモード(C++なのかSchemeなのか)がそこに来るように変更しました。 ;; Outputz (require 'outputz…

三角関数の定義域を複素数に拡張

R6RS の (sin z) を実装する。三角関数の定義域を複素数に拡張するという話は習った覚えがない。きっと忘れたのだろう。 cos(ix) = (e^-x + e^x) / 2 sin(ix) = (e^-x - e^x) / 2i sin(z) = sin(x+iy) = sin(x)cos(iy) + sin(iy)cos(x) = sin(x) * ((e^-y + …

複素数の対数

複素数の対数が記憶から消えている。 z = re^iθ logz = logr + loge^iθ logz = logr + iθ こうか。なるほど。

最大公約数

最大公約数を求める手続き gcd 。ユークリッドの互除法 - Wikipediaを見て思い出しつつ実装。 Bignum に関しては GMP に gcd を求める関数があるのだけどまあいいか。 (define (gcd2 m n) (if (zero? n) (abs m) (gcd2 n (mod m n)))) (define (gcd . n*) (u…

div, div0, mod, mod0

Integer Divisionを読み、仕様を理解しテストを書いている。 実数の範囲で正しく動かさないといけないので気を使う。

cute

srfi-26 の cut/cute をひっそりと追加しました。

Bytevectors の全テスト通った

% ../mosh tests/r6rs/run/bytevectors.sps Running tests for (rnrs bytevectors) 469 tests passed ひゃっほう。Bytevectors とはいうものの、文字コードやBignumや、IEEE-754 などてんこもりなのです。これが通るのはかなりうれしい。 bytevector-ieee-xx…

Operations on IEEE-754 representations

R6RS Bytevectors の Operations on IEEE-754 representations を実装。IEEE-754 は普段全く意識してなかった。これをきっかけに少しだけ勉強できたのが良かったな。 Bytevector から浮動小数を読み出したりとか。 (almost=? 3.14 (bytevector-ieee-single-r…

数値の read 実装完了

やっと数値 read の実装が完了。bison/re2c を使用することを決断した際にはもう少し楽だと思っていたが間違い。自分でパーサを書くにしろ、パーサジェネレータを書くにしろコード立ち上げのコストはあまり変わらないという印象。 ただし 漏れがあるかどうか…

polar

極座標形式の入力がうまくいかないと思ったらこんなミスを。makeFixnum はどう見ても間違い。 return Object::makeCompnum(Object::makeFixnum(r * cos(a)), Object::makeFlonum(r * sin(a)));

Gauche trunk の Flonum 対応

Lingr 経由。VM経由の Flonum 演算の計算途中に現れるテンポラリなFlonumをスタックに alloc するらしい。 以前からスタックに割り当てるというキーワードは聞いていたが、「ネイティブスタック?」「VMスタック?」そんなのできるのか?と思ったら、専用の…

動かないのは g++ -O3 最適化のバグのせいだったというオチ

昨日 bison と re2c で書いた数値パーサが OSX では動くが Ubuntu では動かないという現象に遭遇。(コード壊れた) ずっと調べていたところ bison が生成したコードの中の /* Discard the shifted token unless it is eof. */ if (yychar != YYEOF) yychar …

2進数リテラルの read を実装

re2c と bison の協調動作の調整に時間がかかった。ひとつのプログラムで2種類の bison 由来のパーサを使うので yylex などのリネームが必要だったりとか。 (write #b11/10) (print #b11+10i) (print #b11-10i) (print #b11+i) (print #b11-i) (print #b+nan…

Lean on the compiler

今まさに Lean on the compiler している。と意識できるようになっただけでもWEwLC読んだ価値はあった。

数値の read を実装

id:YasuyukiMiura さんがコミッタとして活躍を始めてくれました。僕は数値の read を早く実装し、テストを書きやすくしないと。 NUM2(2進数) の read を実装する。あれこれいじってみたが数値の reader を re2c/bison で外部に作った方が実装が楽そう。 こ…

Numerical type predicates 実装完了

面白かった。

美しい

Numeric Tower を実装していて「この仕様は美しいな」と感じていたのだが、よく考えればそれは数学の美しさだった。Numeric Tower は数学の表層に過ぎないのは良く分かっているつもりだが、この整然とした美しさには特別なものを感じる。Tower とは言い得て…

+inf の作り方

Object::makeFlonum(1.0 / 0.0); と表現している部分が division by zero in ‘1.0e+0 / 0.’ と g++ さんに警告を受ける。の件ですが、きむら(K)さんに static double zero(void) { return 0.0; } static double one (void) { return 1.0; } one() / zero();…

Bitwise 実装完了

ふむ。ただいま算術手続き実装率44.4%。後半分か。

bitwise 実装中

終わったのは bitwise-not, bitwise-and, bitwise-ior, bitwise-xor, bitwise-bit-count bitwise-length, bitwise-first-bit-set and bitwise-if. bitwise-if 面白いな。

Flonum 手続き実装終了

今日追加したのは fldiv, flmod, fldiv-and-mod, fldiv0, flmod0, fldiv0-and-mod0 flnumerator, fldenominator, flfloor, flceiling, fltruncate, flround flexp, fllog, flsin, flcos, fltan, flasin, flacos, flatan, flsqrt flexpt and fixnum->flonum. …

(call/cc procedure?) => ?

2ch の Lisp Scheme スレを覗いたら見つけた話題。 (call/cc procedure?) => #t となるのはなぜか?という話。2秒くらい考えてやっと分かった。「call/cc だから何かすごいことが起きて」と思った自分が情けない。 ちなみに (call/cc list?) は #f ですね。

Flonums

fl=?, fl>?, fl>=?, flflonum, flodd?, fleven? flfinite?, flinfinite?, flnan?, flmax, flmin, fl+, fl-, fl*, fl/, denominator, numerator を実装。C++ 上で +inf.0 を Object::makeFlonum(1.0 / 0.0); と表現している部分が division by zero in ‘1.0e+…

nan?, finite?, infinite?, positive?, negative?, exact? and inexact?

浮動小数の計算が必要なコードをほとんど書いたことがない。だからIEEE 754 もおおざっぱにしか知らなかった。勉強し直して +inf.0 とか -inf.0 とか nan.0 を知る。 いやはや GNU MP に有理数の計算を任せられるとはいえ、複素数、浮動小数は自分で考えなけ…

let/lambda 境界を超えてしまう jump

Mosh のコンパイラに最適化で let/lambda 境界を超えて jump してしまうようなコードが生成され、結果としてスタックがずれて死ぬというバグがある。 前から気づいていたが 0.0.8 で直そう。 でもその前に算術系だ。

let で stack overflow を検出する

let で stack overflow を検出するのを忘れていたので、コンパイラ/VM に手を入れた。 しかし段々と let と lambda を区別するメリットがなくなってきた気がする。let は lambda に変換するってのでも良いかもと思ってしまう。 let は lambda の call より軽…

Numeric Tower の基礎固め終了

基礎固めが終了。次は仕様で定められている算術手続きを実装する。数えたら 190 個ほど。1日10個だと3週間かかります><。 Mosh では commiter を募集しています。手伝ってくれる方がいたらうれしいな。

Numeric Tower 実装中

下記の数値タイプ同士での加減乗除や比較演算を地味に実装中。組み合わせが多くてテストと実装が大変。 Fixnum(固定長整数) Bignum(多倍長整数) Flnum(浮動小数) Ratnum(有理数) Compnum(複素数) ほぼ機械的に淡々と実装とテストを繰り返す。

(exact? 1+5i)

複素数の内部表現は Object real, imag 。ふと気になって Gauche の実装を見てみたら real/imag は double だった。ってことは Gauche では複素数は正確数のリテラルで書かれても、正確数じゃないのか。 gosh> (exact? 1+5i) #f なるほどなるほど。しかし複…

複素数実装中

複素数で > (gt) を実装しなければいけないらしい。あれ?複素数に大小関係なんかあったっけ?と焦ったら仕様書の見間違いだった。