Scheme

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

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がよくわからない

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

コマンドライン引数パーザのインタフェース

getoptとかって言語(やライブラリ)によってかなり使い方が違っていて,いつも困る.しかも,どれも(慣れるまで)それなりに分かりにくくて,どう書くのがその言語 "らしい" のかよくわからないことが多い.特にOCamlのArg.parseは何故か副作用ばりばりでやり…

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 (…

auto-complete.elとscheme-complete.elを連携させてみた

auto-complete.elとscheme-complete.elと,それぞれのソースを読みながら頑張った.一先ず動く所まで漕ぎ着けたのがこれ. (add-to-list 'ac-modes 'scheme-mode) (defvar ac-source-scheme-complete '((candidates . (lambda () (all-completions ac-target…

scheme-completeの設定を修正した

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

Schemeで補完始まった

Scheme 補完 でぐぐったら出てきたのがここ↓ 汝の隣人のブログを愛せよ | LOVELOGこれは始まった! でもこれだと,行頭以外でインデントを直せないので,eval-after-loadに一行追加してみた. (define-key scheme-mode-map [(control tab)] 'lisp-indent-lin…

文字名

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

tree-map-fold

tree-map-foldとfoldで引数の順番が違ってちょっとはまった. foldは(fold proc seed lis ...)だけどtree-map-foldは(tree-map-fold tree-map proc seed). まぁ,tree-map-foldにtree-mapを沢山渡したりはあんまりしない気はするけど,これはどうなんだろう…

多値を返す手続きの命名規則の謎

car+cdrは+なのに,min&maxやquotient&remainderは&.何故か統一されてない. よく,car&cdrと書いてしまう.

tree-mapの謎

hash-table-mapとhash-table-for-eachはあるのに,tree-map-mapとtree-map-for-eachは何故無いんだろう.語呂が悪いから? hash-table(手続き)はあるのに,tree-mapはない. tree-map-minはペアを返すのに,tree-map-successorは多値を返す. gosh> (define …

難解言語を学ぶにはまず処理系から

ということで,GrassインタプリタをSchemeで書いてみた.拾いもののHello, worldが動いたから大体できてると思う.ただtrueとfalseが実装できてるかどうかはよく解らない. 最後にスタックトップをそれ自身を引数として呼ぶという仕様のせいで,コピペ生成し…

gaucheのeval

(eval `(define ,(string->symbol "foo") 3) "bar") (print foo) ; => 3 あれ?(interaction-environment)とかが返す値じゃないといけないんじゃなかったっけ? gaucheだけ?

マクロのデバッグ

マクロの練習にcutを作っていたら,デバッグしにくくて困ったので,macro-debugを作ってみた. マクロを一段階ずつ展開,表示してくれる. (define-syntax my-cut (syntax-rules (<> helper) ((_ helper (args ...) (expr ...)) (lambda (args ...) (expr ..…

マクロ

よくわからなくて放置してたので,練習してみる. まずはfor. (define-syntax for (syntax-rules () ((_ (i start end) b1 ...) (let1 k end (let loop ((i start)) (if (< i k) (begin b1 ... (loop (+ i 1))))))))) (for (i 3 8) (print i)) とりあえず動…