scheme

c-wrapperでcairoを弄ってみた

(use c-wrapper) ;; (use gauche.process) ;; (c-ld (process-output->string "pkg-config --libs --cflags cairo")) ;; (c-include (glob "/usr/include/cairo/cairo*.h") :include-dirs "/usr/include/cairo") (c-load (glob "/usr/include/cairo/cairo*.h…

c-wrapperを初めて使った。

これはおもしろいかもしれない。 c-wrapepr? gaucheから他の言語のライブラリを使うためのライブラリ CとObjective-Cに対応しているみたい。 install こんな感じで wget http://homepage.mac.com/naoki.koguro/prog/c-wrapper/c-wrapper-0.5.5.tgz gauche-p…

gauche-readlineに気づかなかった。

emacsを立ち上げるのも面倒な時に便利。ここで知った。 install方法(ubuntu) sudo aptitude install libreadline-dev #readline-devが入ってなかった wget http://www.netlab.is.tsukuba.ac.jp/~yokota/archive/Gauche-readline-20070707.tar.gz gauche-pack…

LaTexの環境を整える。

texとか使ったの初めてなので、何か面倒なことをしているような気がします。 インストール http://d.hatena.ne.jp/hayamiz/20081111/1226403768に書いてあったものをapt-getでインストールした。 (何を入れたらいいのか分からなかったのですごい助かりました…

l99をschemeで解いてみる

cadrグループの人の日記でl99を知ったのでschemeで解いてみる。 P26あたりから難しくなってきた。 P26 組み合わせを作る問題*1 最初に書いたもの(nCnとnC0には対応してない) (define (combination n l) (if (<= n 1) (map list l) (apply append (unfold (…

気づいたことをまとめる

今日分かったこと gaucheで式を一つだけ実行 module-exportではすべての手続きを調べられない aproposで手続きを調べられる nkfで"--overwrite"を使うと楽に文字コードを変更できる findの"-print0"と対応するのはxargsの"-0" ファイル名に空白が使われてい…

gaucheの補完用のelispを書いたりした

説明とか(あとで書く) 作ったもの get-procedure-list.scm gauche-completion.el get-procedure-list.scm (use file.util) (use srfi-1) (define (%filter file) (guard (e (else '())) (call-with-input-file file (lambda (in) (port-fold (lambda (line…

8パズルを解くプログラムを作ってみた

もっと効率の良い方法とかあるかも><。 (use srfi-1) (use gauche.sequence) ;;[1 2 3] ;;[4 5 6] ;;[7 8 ()]という形にしたら終了 ;;※空白は'()で表す。 ;;※上の表の状態はプログラム上では「(1 2 3 4 5 6 7 8 ())」と表す。 (define (make-state l) (if …

現在のカーソル位置の単語をdescribeで調べる

gaucheだと(describe 何か)で調べることができる。 こんなものを定義しておくとらくかもしれない。 (defun scheme-describe-current-word () (interactive) (let ((buf "*d*")) (with-output-to-temp-buffer buf (let ((target (substring-no-properties (cu…

schemeで例外処理ってどうするんだろう?

例えば、与えられたリストをすべてかけた値が欲しいときなどに、0を発見したら処理を中断して0を返すようにしたい。こういうときに、例外が使えると便利そう。 ocamlだとこんな感じ exception ZeroFound (* 例外の定義 *) let product l = try List.fold_lef…

(途中経過)anythingで関数の補完

一応動いた。中のコードの意味とかよく分からないまま作っているので変なところがある気がします。*1 使用しているもの anything-dabbrev-expand.el gca.el (require 'gca) (require 'anything-dabbrev-expand) (unless (boundp 'anything-initial-input) (d…

named-let

やっと、named-letの意味が分かった。 手続きの定義と最初の実行を同時にやっているような感じだ。 (使い道は、末尾再帰にする時の中部分の記述に使うくらいしか思いつかない) 例えば、与えたlistの要素を反転させる手続きreverseがあったとして、 (define…

htmlの変換

http://www.thinkit.co.jp/article/74/2 http://d.hatena.ne.jp/guyon/20080528/1211986261 を見ておもしろそうだったので、やってみました><。 していること S式で表したhtmlを実際のhtmlに変換して出力する。 S式で表したhtml (define gauche-page '(htm…

shellから起動とemacsから読み込むのとでの速度の違い

計算時間がたりない 昨日のことは勘違いらしいです。コメントをもらいました。 関数の処理時間が短すぎると、実際の関数以外の部分でたくさん時間がかかる。 同じ処理を何度か繰り返したりして関数の処理時間を長くするといい。 どれくらいが十分な処理時間…

rubyとschemeでmemo(fib)

sicpでやったfibonachi数の計算のmemo化をrubyでもしてみる rubyのコード class Memoize def initialize @a = [] end def memo_fib n @a[n] = @a[n] || fib(n) end def fib n case n when 0 0 when 1 1 else fib(n-2) + fib(n-1) end end end #benchmark用 m…

rubyで書いたプログラムをgaucheでも

gaucheの方が書きやすかったです。 処理を頭の中で分割しやすいような気がします。 (define (f seed) (define (enhance l) (map (lambda (x) (if (list? x) (enhance x) (map (cut * x <>) seed))) l)) enhance) (define (ntimes-function f n) (lambda (x) …

pascalの三角形

昔は、こんな風に作ってた。 でも、この方があとで見たとき分かりやすいような気がする。 (明示的な再帰を避けるとあとで読みやすいのかもしれない) (define (shift-left seq) (cons 0 seq)) (define (shift-right seq) (reverse (shift-left seq))) (defi…

unfoldの使い方を把握する

foldと対になるunfoldという関数が存在するみたい。 fold unfold list -> anything anything -> list foldは使い方が大体分かったような気がする。 でも、unfoldの使い道がよくわからない。 しばらく、unfoldを使ってできそうなことを探してみようと思った。…

(sicp36)sicp m3.6 ~ 3.8

;;m3.6 ;;線形合同法で乱数をつくる。 (define (rand A B M) ;M > A > 0 ;M > B > 0 ;B, M が互いに素 ;A - 1 がmの持つすべての素因数で割り切れる ;M%4=0 => (A-1)%4=0 ;M > Xn ;;面倒なのでA,B,Mの値を以下からパクります>< ;;http://wiki.fdiary.net/v…

(sicp35)m3.1 ~ m3.5

やる気がでないので、3章を先に始める。 ;;m3.1 (use srfi-1) (define (make-accumulator sum) (lambda (n) (set! sum (+ sum n)) sum)) (define A (make-accumulator 5)) ;;適用する回数によって値が変わる。 (map (lambda (x) (A 10)) (iota 10)) ;; gosh>…

project euler problem 18

下から上がっていった方が楽。 (define (f seq) (define (iter result rest) (match rest ((a b . _) (iter (cons (cons a b) result) (cdr rest))) (_ (reverse result)))) (iter '() seq)) (f '(1 2 3)) ;;=> ((1 . 2) (2 . 3)) (define (g seq1 seq2) (le…

project-euler problem 17

これはキモい。 thirtyがthirityになっていることに気づくのに苦労しました>< パターンマッチがとても便利でした (define (num->list n) (define (iter re n) (if (= n 0) re (iter (cons (remainder n 10) re) (floor (/ n 10))))) (iter '() n)) (define…

gaucheのリファレンス

gaucheをインストールすると、日本語のリファレンスが一緒に入っているはずです。便利です。 (確か、ubuntuだとdefaultで入っていた気がします><) もし、emacsを使っているなら、.emacsに以下を付け加えると"C-ci"でリファレンスが見れるようになります…

deepmapってこんな感じでいいのかな?

(define (deepmap p f seq) (apply (lambda (x y) (let ((fx (f x)) (fy (f y))) (if (eqv? fx (p fx fy)) x y))) seq)) (deepmap min car '((3 p) (2 q))) ;; => (2 q) applyじゃだめだった。 引数の数が3つの時、失敗する。 (foldみたいな感覚でいたけど…

プログラミングgauche買った

本屋さんに行ったら プログラミングgaucheが置いてあったので買いました。 とりあえず、9章まで読みました。 多値って便利ですね (define (even>odd? . args) (receive (evens odds) (partition even? args) (> (length evens) (length odds)))) (even>odd? …

strange-fold

sicpのaccumulate-nのところで出てきた。 ((1 2 3) (4 5 6) (7 8 9) (10 11 12))こんな感じの並びを簡単に作れたらいいなー srfi-1の中にこんなのがあった drop take これがあれば楽に作れるかもしれない (use-srfi 1) (define (f lst n) (if (null? lst) '(…

練習メニューをschemeでもやってみよう。

今回は"サイコロの目がすべてでるまでサイコロを振る" (use srfi-27) (random-source-randomize! default-random-source) (define (dice-roll) (define (roll state history count) (let ((n (+ 1 (random-integer 6)))) (print n) (print "state: " state) …