さかもとのブログ

つらつらと

gauche

foldを使う

簡単にまとめると、明示的な再帰を用いるプログラミングスタイルはよろしくないと言うこと。Haskellwikiにもそう書かれている。良い関数型プログラマは再帰を用いず再帰をパターン化した高階関数を使うのだそうだ。 maoeのブログ ということで,OnLispを少し…

継続は多値で返ってくる

継続を呼び出すと,継続に渡された変数は”多値”で返ってくる. そのため,receiveを使わなければ,すべてを受け取ることはできない(と思われる). 以下の簡単プログラムで実証してみた. (define cont #f) (receive (a b) (call/cc (lambda (c) (set! cont c…

継続:コルーチン(1)

SICPと平行して,プログラミングGaucheに取り組む. 今回は19.8のコルーチン.SICP前にこれに取り組んだときは手も足も出なかった... 今回は理解できた気がする. コルーチン機構を作り出すマクロは以下のもの. (use util.queue) (define *task* (make-queu…

継続理解再開

id:rsakamot:20090502:1241226261では,継続わからないとつぶやいた.そしてそのまま放置してSICPへと移行した.SICP4.3では,継続(call/ccは使わず,ひたすら関数を渡す)を用いて,amb評価器を実装した. 細かい動きは理解し切れていない気がするが,おおよ…

random関数

Gaucheユーザリファレンスより (use math.mt-random) (define m (make <mersenne-twister> :seed (sys-time))) (mt-random-integer m 1000) (define (rand) (mt-random-integer m 1000)) こうしておくと, gosh> (rand) 164 gosh> (rand) 69(rand)で乱数が生成される.</mersenne-twister>

上書きしてしまった組み込みの関数をもとに戻すには

(define 関数名 (with-module gauche 関数名))

ubuntu8.04にgauche-gl

apt-get install gauche-glでインストールできるが,使おうとすると, libgauche-math3Dがどうかこうとかというエラーがでて使えないので,結局ソースを ./confiure make make installで入れた.

CentOS5.3にgauche-glをインストール

とりあえずgauche-glを取ってきて, freeglutを入れて,./configureをしたら, checking GL/glx.h usability... yes checking GL/glx.h presence... yes checking for GL/glx.h... yes checking GLUT/glut.h usability... no checking GLUT/glut.h presence... …

letとlet*の紛らわしい例

((lambda (x) (let ((x 3) (y (+ x 2))) (* x y))) 2) => 12 ((lambda (x) (let* ((x 3) (y (+ x 2))) (* x y))) 2) => 15

継続わからない...

現在Gauche第19章6節に取り組み中なのだが,継続がいまいち分からない.特に (define-syntax for-each-ext (syntax-rules () [(_ break next lambda-expr arg-list ...) (let ((arg1 (list arg-list ...))) (call/cc (lambda (break) (apply for-each (lambda…

まるで手続き型のschemeプログラム

明日のゼミの課題だった,Cを解析して,ニーモニック風のコードを出すプログラムがとりあえず完成. しかしまるで手続き型のよう.しかもときどきperlかのようなところもある. しかも”コンパイルエラー”は未実装. とまぁ問題点を挙げればきりがない.しか…

call-with-input-file,call-with-output-file

(define (count-chars filename) (call-with-input-file filename (lambda (in) (let loop ((c (read-char in)) (count 0)) (cond [(eof-object? c) count] [else (write c) (loop (read-char in) (+ count 1))]))))) (count-chars "read-char.scm") (define…

第9章演習問題(P.112)

(define (delete-1 elt lis . options) (if (member elt lis) (let-optionals* options ((cmp-fn equal?)) (define (loop lis) (cond [(null? lis) '()] [(cmp-fn elt (car lis)) (cdr lis)] [else (cons (car lis) (loop (cdr lis)))])) (loop lis)) lis)) …

第8章演習問題(P.101)

(define (my-any-pred . pred) (lambda (x) (define (my-any-pred-core preds x) (cond [(null? #?=preds) #f] [((car preds) x) #t] [else (my-any-pred-core (cdr preds) x)])) (my-any-pred-core pred x))) (define (my-any-pred . pred) (lambda (x) (co…

第7章練習問題

(define (tree-walk walker proc tree) (walker (lambda (elt) (if (list? #?=elt) (tree-walk walker proc elt) (proc elt))) tree)) (define (numbers-only-for-tree walker) (lambda (proc lis) (walker proc #?=(my-filter (lambda (x) (or (number? x) …

第6章練習問題

(define (my-length lis) (define (loop a n) (if (null? a) n (loop (cdr a) (+ 1 n)))) (loop lis 0)) (define (my-length lis) (if (null? lis) 0 (+ 1 (my-length (cdr lis))))) (my-length '(1 2 (4 5) 3)) (define (my-filter pred lis) (define (loop…