ytaki
STkからGaucheに乗り換えました. 日本語記述を扱いやすいので重宝してます.
Web: http://nbk.bz/ , email: y@nbk.bz
KiloへのGauche組み込み
($date)
15年以上ぶりのWiLiKi更新…マジか.
現在,KiloにいろんなLISP処理系(Gaucheの他にはGNU Guile,Chibi-Scheme,ECL)を組み込んで遊んでいます.概要はこちらのTwitter投稿から.
https://twitter.com/ytaki0801/status/1377852782389043200
Gaucheについては,Scm_EvalCStringが未定義でも値を返してくれるのと,write-to-string/SCM_BIND_PROCのScm_ApplyRec1とその戻り値のSCM_STRING_BODY_START/SCM_STRING_BODY変換のおかげで,eval-last-sexp相当(と括弧対応)が割といい感じに使えてます.なお,実際に組み込んでいるコードは,チュートリアルサイトのStep 130を用いています.
Kilo自体がUTF-8未対応ということもあって,readline代わりの学習用くらいしか用途がなさそうですが,需要があればGauche-kilo(Kilo-gauche?)みたいに独立してGutHubとかに上げることも考えてます.いや,他の処理系については対応があまり進んでないのと,今の複数処理系対応コードだとライセンス管理が酷いことになりそうというか….
NetBSD/macppc での Gauche 0.8.4 ビルドの不具合
(2005/06/25 19:51:47 PDT)
メーリングリストに詳細を投げようかと思ったけど,対象がかなり ピンポイントな気がするのでここにさりげなく書いておく(をい).
Gauche:NetBSDにも書きましたが,NetBSD/macppc 2.0.2 で Gauche 0.8.4 を make すると,メモリ不足で compile.c のコンパイルが コケました.詳細は以下の NetBSD のメーリングリストのメールを参照.
http://www.jp.netbsd.org/ja/JP/ml/port-powerpc-ja/200506/msg00003.html
http://www.jp.netbsd.org/ja/JP/ml/port-powerpc-ja/200506/msg00005.html
メモリ 256 MB のまま使おうとする時点で無謀なのかもだけどorz. MacOS X (10.3 Panther)でも compile.c のコンパイルがいつまで経っても 終わらず ^C で止めちゃいました(^^;).
- (2005/07/24 22:35:42 PDT) ちなみにTiger(gcc 4.0.0)での話ですが、1GHz、メモリ2GBのPowerBook G4でcompile.cのコンパイルに16分(秒ではなく)ほどかかります。時間がかかるだけでコンパイル自体は成功しますが。
- Shiro(2005/07/24 23:16:52 PDT): Gauche-0.8.5のcompile.cの場合、 G4 1.42GHz, 256MBメモリ、Tigerの環境で3分20秒でした。律速はメモリではない?
- ytaki(2005/07/25 02:52:14 PDT): PowerPC ではないのですが,内輪向け WiLiKi に利用しているマシンが Celeron 533MHz + 256MB メモリ + Plamo Linux 2.0 + gcc 2.95.3 という構成で, ここでの 0.8.5 compile.c のコンパイル時間がなぜか 19 分ほどかかりました(^^;). CPU か gcc が古い(?)せいなのかとも思ったのですが,同じ 0.8.5 compile.c で, Celeron 533 MHz + 192MB メモリ + NetBSD/i386 2.0 + gcc 3.3.3 で 30 秒, Pentium4 2.4GHz + 512MB メモリ + Vine Linux 2.6 + gcc 2.95.3 で 5 秒,と, どうにも原因が掴めません.…というか,書いてて混乱してきました(苦笑).
とりあえず上記メールにもあるように,-O2 で行われる最適化の一部をはずせば その他は特に問題なく,make check も全て通ってます.これは,0.8.4 を 入れた後に現在の CVS 版をビルドしても同様でした.なお,上記で gencomp に 言及してますが明確な根拠はありません(ダメじゃん).
- Shiro: ふーむ。compile.cの中身はほとんどがCのデータ定義で、 通常のCプログラムソースと全く異なるため、オプティマイザがものすごく 効率の悪いことをしてしまうとかそういう問題かもしれません。 compile.cを-O2で最適化する意味はほとんど無いはず (Cのコードは 初期化時にしか走りません)、当面-O2外しで対応して頂ければと思います。 compile.scm自体がかなり大きいのでいずれは分割すると思いますが…
- ytaki: 早速どうもです.これも上記メールに書いてますが,同じ NetBSD (付属の gcc 3.3.3)でも i386 ではメモリ 192MB で普通にコンパイルできてますんで, パフォーマンス改善するとしたらあるいは gcc 側なのかもしれませんね(^^;). gcc 4 が NetBSD/macppc でも使えるようになったらもう一度試してみたいと 思っています.
- ytaki(2005/06/26 09:34:57 PDT): この件なのですが,ちょっと面白いことがわかりました. CVS 版でも同じと書きましたが,CVS 版でも最適化をはずしてコンパイルを通して インストールし,全く同じ CVS 版コードを更にもう一度ビルドすると,今度は 最適化をはずさなくてもそのままコンパイルが通りました.理由は省略しますが(^^;), bootstrap の妙といったところでしょうか.もちろん,今後の compile.scm 等の 改良によってはまた compile.c のサイズが大きくなる可能性もあるのですが, 0.8.5 あたりは NetBSD/macppc でもそのままでコンパイルが通るかもしれません.
- ytaki(2005/07/01 21:16:05 PDT): 0.8.5 を試したところ,やはり修正なしでコンパイルが 通りました.最適化の対象内容にも依存すると思われるため,compile.c のサイズが どの程度まで小さければ通るのかははっきりしていません(^^;).
- ytaki(2005/07/24 18:13:07 PDT): NetBSD/macppc の最新リリース版である 2.0.2 の 付属 gcc は 3.3.3 なのですが,gcc 3.4.4 をソースコードからビルドして, これを使って Gauche 0.8.4 を make したところコンパイルが通りました (make check も全て OK).ただし,compile.c のコンパイルだけで 90 秒ほど かかりました(^^;).今回の件は NetBSD の pkgsrc の Gauche 対応絡みなので,付属の 3.3.3 でコンパイルできないと具合が悪いという 背景もあるのですが,gcc 側の問題の方が大きいような気がします.
srfi-42
(2005/06/07 01:33:02 PDT)
Gauche 0.8.4 にsrfi-42が 入っていたので,早速以前書いた内包表記を試してみました.
gosh> (use srfi-42) #<undef> gosh> (list-ec (: x 5) (if (even? x)) (: y 5) (if (odd? y)) (list x y)) ((0 1) (0 3) (2 1) (2 3) (4 1) (4 3)) gosh> (string-ec (: x "今日は良い天気でした") (if (char<=? #?亜 x)) x) "今日良天気"
良かった,合ってた(をい).
- ytaki(2005/07/25 01:25:01 PDT): はて,『#\亜』が『#?亜』に変更されているんですが… (下の『#?1』も).後者は少なくとも Gauche 的(?)には通らないので,特定の ブラウザによって自動変換されたとかなのでしょうかとか.←自信がないらしい
10進数<->2進数の小数表現対応
(2005/05/25 04:33:39 PDT)
とある理由で適当に作ったのですが,書き捨てはちょっともったいない 気がしたのでここに貼り付け.
(define (string->number-bindecimal str) (define (decimal dlist n) (if (null? dlist) 0 (+ (decimal (cdr dlist) (/ n 2)) (if (equal? (car dlist) #?1) n 0)))) (let ((pnum (string-scan str "."))) (if pnum (let ((istr (substring str 0 pnum)) (dstr (substring str (+ pnum 1) (string-length str)))) (+ (string->number istr 2) (decimal (string->list dstr) 0.5))) (string->number str 2)))) (define (number->string-bindecimal num) (define (decimal dnum ret) (if (or (= dnum 0) (> (string-length ret) 10)) ;; 10桁未満固定 ret (let* ((r (* dnum 2)) (x (if (>= r 1) (- r 1) r)) (c (if (>= r 1) "1" "0"))) (decimal x (string-append ret c))))) (let* ((inum (inexact->exact (truncate num))) (dnum (- num inum))) (string-append (number->string inum 2) (if (zero? dnum) "" (decimal dnum "."))))) (string->number-bindecimal "1111.01") => 15.25 (string->number-bindecimal "1111.111") => 15.875 (number->string-bindecimal 1024.125) => "10000000000.001" (number->string-bindecimal 0.625) => "0.101" (string->number-bindecimal (number->string-bindecimal 123.456)) => 123.455078125
n進数化は難しくないと思うけど,需要なさそうだしなあ(苦笑).
Pocket Scheme
(2005/05/09 19:55:55 PDT)
他の処理系の話ですが(^^;),本来の Windows CE 版だけでなく Windows NT/2000 版がある上に,Unicode にも対応していることを 最近知りました(正規表現は 8 ビットキャラクタ限定みたいですが). 簡易エディタもついていて,Scheme 布教用(?)に最適かも.