Scheme

コードバトン

Scheme コードバトンに参加しました 渡されたバトン http://gist.github.com/274246 from http://cadr.g.hatena.ne.jp/g000001/20100111/1263218782 渡したバトン http://gist.github.com/275132 to http://d.hatena.ne.jp/leque/20100114/p1 やったこと こ…

let/cc とか

書く書く詐欺になってしまった。schemeでループを使う際の注意事項 map で書いてある処理を途中で中断してそれまでの結果を得たい、という場合には、let/cc と fold を組み合わせると自然に書けるかもしれない このとき、 let/cc で得る継続を with-*-file …

Emacs で文字関連のリテラルに色をつける

Emacs の scheme-mode では、 #\x のような文字リテラルに色がつかないのですが、以下の設定を追加すると色つきにできます。 (add-hook 'scheme-mode-hook (lambda () (add-to-list 'scheme-font-lock-keywords-2 '("#\\\\\\(\\w+\\|.\\)" . font-lock-strin…

gensym 続き

gensym をテストの間だけ結果が予めわかるようなものに挿げ替えて、テストケースをそれに合わせて書いた(前回のお話) テストされるコードの実装が変わって、 gensym の呼び出しの順番が変わった場合に、テストを書き換えねばならないことが発覚した テスト用…

match で a*b が書けないわけ

多分後で書くもう書かない パターンマッチとは条件分岐である 再帰 分割統治

gensymを使ったコードのテスト

gensymを使ってリストを返すコードのテストをしたいんだけど、単純にはできないので、マクロを書いたという話。(似たような話題はどこにでもありそうだし、どっかで読んだ気もするけど忘れた) ;; できない (test* "シンボルを生成するコード" `(a b c ,(gens…

min-scheme と mini-scheme

処理系の流れとしては、mini-schemeを受けとる→より単純なmin-schemeに変換→cps変換→closure変換→register割り当て+抽象マシンコード生成→実マシンコード生成、なんだけど、min-schemeに変換のところをすっとばしてCPS変換を実装してた。min-schemeへの変換…

巨大な一個の関数モデル

schemeのトップレベルってどいういう扱いなんだ?という話はよくある話な気がするけど、まあ最初は巨大な一個の関数ということにしておいても問題は無いだろう。また問題が出てきたら考える。

letrec と let*

一ヶ月以上前の話に今更反応するエントリ → http://mywiki.jp/itkz/SICP+%93Ǐ%91%8D%C0%92k%89%EF/2008-02-08/R5RSでは内部 define の評価順は不定です(letrec と等価とされています)。で、unkoの場合は let* を使うとうまくいきます。let* は上から順に評価…

プリプロセッサだった

そうか、それでいいのか……。コメントの中で終了記号が出てきたらどうか、とかクオートされてたら、とかは考えなくても良かったのか。世の中のテンプレートエンジンってのはそういうもんらしい。 aescm ") ;; ?> (print "?>") ?>?> (print "?>") ?>コメント中…

テンプレートエンジン

構造化された HTML 出力をしようとしてるけど、僕が欲しかったのは Scheme 用の汎用な(erbやらphpのような)テンプレートエンジンなのかもしれないな。 <html> <head> <title><%#h= title %></title> </head> <body> <h1>hogehoge</h1> <% (for-each (lambda (comment) %> <p class="comment"> <span class="date"><%#h= (date-of comment) %></span> <span class="content"><%#h= (c</span></p></body></html>…

テンプレートのおはなし

あらすじ HTML でテンプレートを持ちたい ssax:xml->sxml で読みこむと default namespace が全部展開されてしまう。doctype宣言がなくなる。(のでそのままHTMLするとダサい) 適宜編集した sxml を最初から持っておこう でもいちおうテンプレートっぽい処理…

木の変更

上にも書いた、木の更新のしかたが分からなくて驚いたという話。なんか基本的なことのような気がするんだけど……どうやればいいんだろう。sxml で表現された HTML テンプレートをいじろうと思ったのですが、複雑な木の一部を変更する方法が分からなくて、結局…

リストの途中に挿入

リストの途中に挿入ってどうやるのが良いのかと思って時間を測ってみました。あまり一般的な状況設定じゃないですが。破壊的でいいなら多分 set! がいちばん速いだろうと思うけど、他に良い方法があればそれを使いたいなあと思いつつ set! が速いことを確か…

油分け算

前の記事の続きLispUser.netを参考に、見るからに冗長だったところを直した。 #!/usr/bin/env gosh ;; -*- coding: utf-8 mode: scheme -*- (use util.queue) (use util.match) (use util.combinations) (use srfi-1) ;; node (define (make-node state pare…

油売り算

LL魂の問題ページこの記事の続きやった!油売り算、僕にも出来たよ! #!/usr/bin/env gosh ;; -*- coding: utf-8 mode: scheme -*- (use util.queue) (use util.match) (use srfi-1) ;; node (define (make-node state) (let1 x (make-vector 3 ()) (vector-se…

状態付き Quine

scheme 処理系に食わせたら ruby のプログラムになって、それを ruby に食わせたらもとの scheme プログラムになって、以下繰り返し、というプログラムを書いてみました。もっと複雑になるかと思ったらそうでもなかった。 (let ((s "(let ((s %p)(r %p)) (fo…

基本の Quine

Quine とは「実行したプログラムそのものを出力するプログラム」のことです。これを書くことはプログラマの伝統的な遊びの一つと言われています。今日、人生初の Quine を書きました。 ;; その 1 ((lambda (x) (print `(,x ',x))) '(lambda (x) (print `(,x …

case-lambda

こういうのがあるのか!続き http://enbug.tdiary.net/20070125.html#c01 gauhce.night で僕が shiro さんにお聞きした話と同じ話だ……。let-keywords* と match-lambda の組み合わせ、なるほど。統一的な方法……。dan さんが、XML でいうタグの属性みたいな、…

Twitter.scm の手直し

関数を生成する関数を書いた Twitter の API のオプション引数に対応 ;; 誰かの friends 一覧。 ;; 認証は要らないのでアカウント情報のかわりに #f を渡す。 (for-each (lambda (x) (format #t "~a: ~a~%" (ref* x 'user 'name) (ref x 'text))) (twitter-f…

Kahua チュートリアル

Lisp プログラマはプリミティブなものを積み上げて世界を構築していくのがうまいなあと思いました。Lisp というのはそういう人たちの為の言語なんだなあ。

ネストのレベル

Scheme でプログラムを書いてるとすごくネストが深くなって変だなあと思ってたけど、begin0 とか and-let* とかそういうのをつかえばいいのか。やっぱコードは読まんといかんねえ。

画面が出た次は

Scheme で GUI ってことは、次は図形言語かな……やっぱ。なんかアレだけど。こんな感じで、イベントを取得しました。 (define-module cwsdl (use c-wrapper) (c-load "SDL/SDL.h" :import '(SDL_Init SDL_SetVideoMode SDL_PollEvent SDL_Quit SDL_Wait SDL_D…

今日の一行

今日の一行(お題)2進符号列 への解答 (use srfi-1) (define (gray n) (map (lambda (x) (logxor x (ash x -1))) (iota (expt 2 n)))) (define (main args) (map (cut format (current-output-port) "~4,'0',B\n" <>) (gray 4)) (load "./bitdiff.scm") (prin…

今日の一行

今日の一行(お題)flips への解答組み合わせの数え上げは util.combinations にあると教えて頂きました。自然数のリストを並べ替えて、それをもとに引数を並び替える、というのがダサい。生成された関数では、すでに並び替えが終わっている、と言う風に出来な…

今日の一行

今日の一行(お題)ビット変化列 への解答。こんな単純な話なのだろうか?題意を読み間違えてる?ビット数を固定すると良いことがあるんだろうか。 (define (bitdiffs seq) (define (logdiff i j) (logcount (logxor i j))) (define (bitdiffs_ i s) (if (null…

2進数リテラル

#b0110 ;; => 6 (integer->char #b1100001) ;; => #\a

Gaucheを読む

http://nao.no-ip.info/index.cgi?Gauche%20%a4%f2%c6%c9%a4%e0 Gaucheを読 む、始めました。何から始めれば良いのか分からなかったので、main から読むことにしました。 多分、初期化のところが半分位終わったら飽きてきて repl に移ったりすると 思う。 ひ…

var1 var2 っていう変数があって、 hoge? っていう述語があって、二つの変数のうち hoge? であるほうを hoge 、そうじゃない方を other にバインドしたい時って、ありますよね? (if (or (hoge? var1) (hoge? var2)) (let ((hoge (if (hoge? var1) var1 var2…