Gauche

疑似Continuationモナド

HaskellのContinuationモナドを雰囲気だけGaucheに移植してみる。 Contクラス まず、疑似Continuationモナドとして、Contクラスを作る。 Contクラスが持つrunContスロットは同名のgetter関数を持つ。 returnは全然ジェネリックファンクションになってないん…

モジュール関連

gosh> (current-module) #<module user> gosh> (module-precedence-list (current-module)) (#<module user> #<module gauche.gf> #<module gauche> #<module scheme> #<module null>) Builtin Module: null このモジュールはR5RSで述べられている"null environment"に相当します。 R5RSの構文要素への束縛だけを含んだモジュールです。 Builtin Modul</module></module></module></module></module></module>…

コロン

「:」をdefineしようとすると以下のエラーになる gosh> (define : cons) *** ERROR: Compile Error: syntax-error: (define : cons)R5RSには以下のように書いてある。 拡張アルファベット文字は、識別子の中で文字のように使用することができる。拡張アルフ…

util.matchの展開結果

すごい。 実際にexprの中身とマッチするかどうかを順に試していく、という方法ではなくて、 マッチさせるとしたらこういう処理になる、というプログラム自体を生成していたとは。 (出力結果は見やすいように整形した) gosh> (use util.match) gosh> gosh> (m…

自家製match-lambda

util.matchでは以下のようなパターンを使った関数が定義できないのがちょっと残念。 (use util.match) (define rm (match-lambda* ((_ ()) ()) ((x (x . ys)) (rm x ys)) ((x (y . ys)) (cons y (rm x ys)))))エラーメッセージ gosh: "error": Compile Error…

PostScriptもどき言語

昔書いた逆ポーランド記法で動くPostScriptもどき言語を掘り起こしてみた。 未来の自分のために(そんなときがくるのか?)コメントをつけておく。 ついでに、当時の自分が知らなかったmatch-lambda*とlet1を使うように書き換え。 インタプリタ本体 引数は3…

変数=値と書くletマクロ

Arc版withを書いててふと思った。 ローカル変数部か評価式本体かの区別は、括弧のかわりに=を使ったらよくね? (define-syntax letm (syntax-rules (=) ((_ (ks vs) k = v . r) (letm ((k . ks) (v . vs)) . r)) ((_ (ks vs) . body) ((lambda ks . body) .…

GaucheのArc化計画

実は単にマクロの練習としてArcを題材にしただけ。 Arc版if 3つ以上の引数が渡せてelseifの処理が書ける (define-syntax if (syntax-rules () ((_ a) a) ((_ a b . c) (cond (a b) (else (if . c))))))実行例 gosh> (if #f (print 1) #f (print 2) (print 3)…

メソッドチェイン風マクロ2

cutマクロみたいに「<>」でもいいかも. http://mono.kmc.gr.jp/~yhara/d/?date=20080203#p02 これいいかも。 というわけで、メソッドチェイン風マクロで計算結果の挿入位置を<>で指示出来るようにしてみる。 補助マクロins まず、補助マクロとしてリストの…

一般化されたset!

CommonLispのsetfと同じようなことは、set!で出来ると教えてもらった。 これをobject-applyと組み合わせれば、Arcの=と同じようなことも出来る。 Special Form: set! (proc arg …) expression 2番目の形式はSRFI-17に定義されている「一般化されたset!」です…

メソッドチェイン風マクロ

ネスト深くなるのが嫌で「これでGaucheでもRubyみたいにメソッドつなぎまくっちゃうもんね!」とか思ってこんなの書いた http://blog.livedoor.jp/dankogai/archives/50994188.html これなかなかいいじゃん。 マクロ定義 (define-syntax chain (syntax-rules…

無限リスト

エラトステネスの篩のGauche版を書いてみる。 (use util.stream) (define (mod? x y) (not (zero? (modulo x y)))) (define (sieve l) (stream-cons (stream-car l) (sieve (stream-filter (cut mod? <> (stream-car l)) (stream-cdr l)))))実行結果 gosh> (…

guess関数(未完成)

ついでにgauche版のguessも作ろうとしたがこちらは未完成。 (define (guess ans . arg) (map (lambda (mod) (hash-table-fold (module-table mod) (lambda (k v r) (if (with-error-handler (lambda (e) #f) (lambda () (eq? (apply v arg) ans))) (cons k r…

ARGF

RubyのARGFと似たようなことを、Gaucheでやってみる。 (define-module argf (export with-argf)) (select-module argf) (define (with-argf args thunk) (if (null? args) (thunk) (for-each (lambda (f) (with-input-from-file f thunk)) args))) (provide …