Gauche

method-missingを作ってみた

勢い余って「適用できるメソッドがなければ method-missing を呼び出す」機能を作ってみた. (define-generic method-missing) (define-class <method-missing-generic> (<generic>) ()) (define-method apply-methods ((gf <method-missing-generic>) methods args) (if (null? methods) (apply method-missing gf arg</method-missing-generic></generic></method-missing-generic>…

Hello, polyglot!

きっかけ: るびま これを読んでpolyglotするかーって思った. 今回のコンセプトは 初めてなのでやさしくHello, world! 好きな言語を盛り込む 140文字以下 以下,Schemeと言いつつGauche決め打ちである. ソースコード できあがったのがこれ. ;(#)={-"^<"v '…

c-wrapperのインストール

c-wrapper,c-wrapper は更新されていないけど http://hg.koguro.net/c-wrapper で更新されていた.ダウンロード→タグからダウンロードできる. ./DIST gen ./configure CC=/usr/bin/gcc make DYLD_INSERT_LIBRARIES=/usr/lib/libffi.dylib make check普通に…

パターンガードとGaucheのutil.match

最近のHaskellにはパターンガードというものがあるらしい. {-# LANGUAGE PatternGuards #-} addLookup alist x y | Just m <- lookup x alist , Just n <- lookup y alist = m + n | otherwise = 0 main = print $ addLookup [(1, 2), (3, 4)] 1 3 -- => 6 …

動的環境を指定してthunkを呼ぶ

shift/reset と動的環境の関係についていろいろ考えていた時に出てきた副産物. (use util.match) (define (capture/de proc) (match (let/cc de (list (proc de))) ((r) r) (thunk (thunk)))) (define (with/de de thunk) (let/cc cont (de (.$ cont thunk)…

Gaucheのリファレンスマニュアルをビルド

texi2html 1.70 が入っていたのだけどうまくいかなかった(1時間経っても終わらなかった)ので texi2html 1.82 をインストール.ソースのdoc下で make htmls で40秒程でできた.make html とするとひとまとめになったhtmlが出来上がる.texi2htmlの--splitオプ…

compute-cplを読む

Gaucheのclass.cより引用. /* * compute-cpl */ ScmObj Scm_ComputeCPL(ScmClass *klass) { ScmObj seqh = SCM_NIL, seqt = SCM_NIL, ds, dp, result; /* a trick to ensure we have <object> <top> at the end of CPL. */ ds = Scm_Delete(SCM_OBJ(SCM_CLASS_OBJECT), k</top></object>…

のゼロ元オブジェクトを作ってみた

(use gauche.collection) (use gauche.mop.singleton) (define-class <zero-collection-meta> (<singleton-meta>) ()) (define-class <zero-collection> (<collection>) () :metaclass <zero-collection-meta>) (define-method call-with-iterator ((class <zero-collection>) proc :key start) (proc (^ () #t) (^ () (err…</zero-collection></zero-collection-meta></collection></zero-collection></singleton-meta></zero-collection-meta>

R5RSの数値リテラルっぽいものをGaucheのparser.pegでパーズした(2)

前回から虚部の i の代わりに!も使えるようになったのとr進数(r>1)が使えるようになった.あと $try が足りない所があったので足したり.最早,R5RSの数値リテラルっぽいものではなくなってきている. 前回の36進数の虚部が汚いという問題.コメントも頂いた…

R5RSの数値リテラルっぽいものをGaucheのparser.pegでパーズした

R5RSの数値リテラルのサブセットを拡張したもののパーザをparser.pegで書いた.具体的には小文字しか使えないのと 123### を削って小数を10進以外でも書けるようにした感じ.あと36進数と指数マーカに^を追加. parser.pegはundocumentedでよく分からないの…

Scheme golf tips

あなごる用 Haskell golf の教科書を読んで「俺もこういうの書きたい!」と思って書いてみた.(思ってから書くまでに1年くらい経ってるけど) アマチュアゴルファーなので至らぬ所もありありだけど,今後のScheme界とあなごる界の盛り上がりを願ってこの文章…

Gaucheで素数ストリーム

エラトステネスの篩 (define (divisor? x y) (eqv? 0 (remainder x y))) (define-constant +primes+ (stream-cons 2 (stream-filter prime? (stream-iota -1 3 2)))) ;; (define (prime? n) ;; (not (stream-any (cut divisor? n <>) (stream-take-while (cu…

Gaucheが落ちた

$ gosh -V Gauche scheme shell, version 0.9 [utf-8,pthreads], i386-apple-darwin9.8.0 $ gosh gosh> (define-class <foo> () ()) <foo> gosh> (define-method foo ((self <foo>))) #<generic foo (1)> gosh> ((car (class-direct-methods <foo>))) something's wrong. $ 落ちたッ!第三部完! (</foo></generic></foo></foo></foo>…

tree-mapの比較関数のデフォルト値

gosh> (coerce-to <tree-map> '(("a" . 1) ("b" . 2))) WARNING: unknown keyword :size *** ERROR: real number required: "a" これは=と ついでに変な警告出てる.</tree-map>

delayは要らない子?

Gaucheのような (lazy 3) を許す処理系だと,実はdelayを使う意味ってなかったりする?

Gauche-readlineがまともに動いた

以前の日記でGauche-readlineが怪しい動きをしていたのが,動くようになった. 今までの挙動: $ DYLD_INSERT_LIBRARIES=/usr/local/lib/libreadline.dylib gosh-rl WARNING: Quote character setting is not supported by the library. gosh> gosh-rl でハマ…

iotaの誤差

gosh> (iota 5 3 0.1) (2.9999999999999996 3.0999999999999996 3.1999999999999997 3.3 3.4) gosh> (+ 3 0.1) 3.1何故?

map-acc

こんな感じのsum-accを書きたかったんだけど,なかなか綺麗に書けない. (sum-acc '(1 2 3 4)) ; => (1 3 6 10) 累積和のリストっていうのかな. 累積ってことでgauche.collectionのmap-accumを使ってみる. (use gauche.collection) (define (sum-acc lis) …

hash-tableとtree-mapの非一貫性

alist->tree-mapとtree-map->alistは組み込みだけど,alist->hash-tableとhash-table->alistはutil.listに入っている. hash-tableとtree-mapは似てるようで(両方なのに)何かと一貫性がない.tree-map-mapがないとか(以前書いた). hash-tableは決められた4…

metaclassをchange-classで変えようとしたら怒られた

gosh> (define-class <hoge> () ()) <hoge> gosh> (define-class <hoge-meta> (<class>) ()) <hoge-meta> gosh> (change-class <hoge> <hoge-meta>) *** ERROR: %transplant-instance: classes are incompatible between #<class #f> and #<class <hoge>> Stack Trace: _______________________________________ 0 (%transp…</class></class></hoge-meta></hoge></hoge-meta></class></hoge-meta></hoge></hoge>

map-reverseってないのね

Gaucheって,というかSRFI-1ってmap-reverseみたいなのってないのね. OCamlにはrev_mapがあるからそのノリで勝手に当たり前のようにあると思ってたけどそんなことはなかった. append-reverseはあるのに…

文字列の補間と共有サブストラクチャの併用でエラー

0.8.14と0.9で確認. gosh> #`",'(#0=+ #0#)" "(+ +)" gosh> #`",(#0=+) ,(+)" "0 0" gosh> #`",(#0=+) ,(#0#)" *** ERROR: unmatched parenthesis in interpolating string: ",(#0=+) ,(#0#)" Stack Trace: _______________________________________ 0 (wit…

call-with-iteratorがよくわからない

何故こういう仕様なのか?どこに疑問を持ったかというと,コールバックに渡される二つの関数が,「無引数で何度も呼び出され,違う値を返すことを期待される」こと.つまり副作用必至なのだ.多分. どうせなら関数的に書きたいよね. というわけで,副作用…

Gaucheで継続と例外の実行時間を比較してみた

継続と例外をそれぞれ大域脱出に使って,実行時間を比較してみた.3回計測して中央値をとった. $ gosh -V Gauche scheme interpreter, version 0.8.14 [utf-8,pthreads]まず,最も単純な例. (use srfi-42) (time (do-ec (: i 0 100000) (call/cc (lambda (…

importした識別子をexportできないのは仕様?

$ gosh gosh> (define-module hoge (define foo 3) (export foo)) #<undef> gosh> (define-module fuga (import hoge) (export foo)) #<undef> gosh> (import fuga) #<undef> gosh> foo *** ERROR: unbound variable: foo Stack Trace: _______________________________________ g</undef></undef></undef>…

マクロではまった

define-syntaxでmatchを呼ぶとエラーになる.バグらしい. http://practical-scheme.net/wiliki/wiliki.cgi?Gauche%3aBugs%3alog9#H-w44n66 しゅーん. マクロ怖いなぁ.マクロを生成するマクロの"..."にもバグあるらしいし.

標準入力ポートを閉じてみた

gosh> (close-input-port (standard-input-port)) #<undef> gosh> *** IO-CLOSED-ERROR: I/O attempted on closed port: #<iport(closed) (stdin) 0x9db40> Stack Trace: _______________________________________ gosh> *** IO-CLOSED-ERROR: I/O attempted on closed port: #<iport(closed) (stdin) 0x9db40> Stack Trace…</iport(closed)></iport(closed)></undef>

scheme-completeの設定を修正した

うまく動いていると思ったのだが,composeを使おうとして,補完がうまくできないことに気付く.R5RSとsrfiの範囲は補完できるようだ.ぐぐってみると,ChickenとGaucheには対応しているらしい.しかしEmacsの設定ファイルにはちゃんと設定をコピペしてある.…

readlineが動かない

readlineがなくて不便なので,http://practical-scheme.net/gauche/packages-j.htmlにあるreadlineを試してみた.が,使い方が解らない.サンプルらしきものを試したら動いたには動いたが,挙動が怪しい.普通にインタプリタから使う方法も解らなかったで,…

文字名

gosh> #\page #\x0c gosh> #\tab #\tab gosh> #\lf #\newline gosh> #\cr #\return gosh> #\nul #\null gosh> #\sp #\space gosh> 今日の発見: #\pageだけ文字名で表示されない. リファレンスには書いていないが,#\spと#\nulが使える. R5RSで定義されて…