2007-01-01から1年間の記事一覧

リスト修行 素因数分解(2)

どうやら、前回の素因数分解にはバグがあったみたい(修正しました)という訳で、素因数分解を速度アップしながら改善していこう〜 問題点 前回は、素数を作ってから、素因数分解してました。これだと必要とする全ての素数を作らないとダメ。この問題点を改善…

リスト修行 約数のリスト(2)

素因数分解まで出来ちゃいました、素因数分解から組み合わせ(部分集合の集合)を求めて再び約数に挑戦します。 組み合わせ 確か練習問題(2.32)にあったなぁと思いつつ。SICPをめくる。あぁ、全然理解できなかった奴だ・・・。頑張って理解しよう。ちょっと汚…

リスト修行 素因数分解

エラトステネスのふるいで素数リストが求まったので、素数リストを元に素因数分解をしよう。 素因数分解 結構簡単 (define (factor n) (define p (primers n)) (define (iter m l) (cond ((null? l) (= m 1) '()) ((zero? (modulo m (car l))) (cons (car l)…

リスト修行 素数のリストを求める

調べてみると、約数のリスト高速化には素数が必要だということがわかった。どうやら約数という奴を真面目に求めると結構辛いことがわかってきたぞ。ちょっと失敗だ。そんなわけでエラトステネスのふるいを書いてみる。参考文献無しで書けるかな。 一回目 リ…

リスト修行 約数のリストを求める

久しぶりにリスト修行をしよう。 約数 今回のテーマは約数にした。wikipediaによると、約数 - Wikipedia 50 の正の約数は 1, 2, 5, 10, 25, 50 の 6 個 おぉ、リスト向き!!と思ったので、修行してみる。 再帰で 再帰で解いてみる。 (define (divisor n) (def…

SICPを読む(71) 問題2.59 - 2.60 順序づけられないリストとしての集合

次は集合の表現に入ります。微分よりましかな。 集合について Rubyの方がちょっとわかりやすい。 和集合 [1, 2, 3] | [3, 4, 5] #=> [1, 2, 3, 4, 5] 積集合 [1, 2, 3] & [3, 4, 5] #=> [3] Rubyは集合に強いね。 特徴 特徴として、順序が無いってこと。 [3,…

SICPを読む(70) 問題 2.57-2.58 記号微分(2)

微分を一気に乗り切るぞぉ〜。 問題 2.57 いやぁ、大失敗。失敗例。 (define (make-sum-iter ex2) (fold-right (lambda (ex l) (cond ((=number? ex 0) l) ((and (number? ex) (pair? l) (number? (car l))) (cons (+ ex (car l)) (cdr l))) (else (cons ex …

Gaucheでまとめてテスト

1個1個に分かれてると、どうもモジュール感がないので、どか~んとまとめてとテストしたい。 #!/usr/bin/gosh (use gauche.test) (test-start "test**-test-start!!") (define (test** title list) (test-section title) (for-each (lambda (l) (test* (cadr …

SICPを読む(69) 問題 2.56 記号微分

うっは。微分だよ。ビブン。苦手な分野だとすっかりご無沙汰になってしまう。2章は数学が無くてステキ!とか思ってたけど、大間違いかもしれない。頑張って乗り越えるぞー。 記号微分について 微分を題材に扱ってるけど、微分はどうでもいい話で、結構重要な…

Gaucheのコードリーディングを少し

Gaucheのコードリーディングをちょっと始めました。長いソースでも落ち着いて読めば読めるもんだなぁと思ってみた。 気付いたこと。 僕のSchemeとGaucheでは、設計上大きな違いがある事に気付いた。vm.cより。 static void run_loop() { /* 初期化 */ for (;…

defineな疑問

なぜ関数の先頭じゃないとdefine出来ないのかイマイチわからない。 Gauche gosh> (lambda () 1 (define x 2)) *** ERROR: Compile Error: syntax-error: the form can appear only in the toplevel: (define x 2)「only in the toplevel」トップレベルだけ。…

Schemeをつくろう(17) eval

なんだかんだ色々迷走しながらも、なんとかここまでまとまりました。lambdaが大体出来上がってきました。出来ることといえば、lambda位なんですが、クロージャらしきモノもあります。 ポイントとか evalの基本はeval(オブジェクト, 環境)で評価します。 (+ x…

文法エラーについて

なかなか興味深い。 Gauche gosh> (define (x)) x gosh> (x) #<undef> gosh> (define (y 3)) y gosh> (define (z n n) (+ n n)) z gosh> (z 1 2) 2通った。Gaucheは文法エラーがゆるいらしい。引数チェックすると重くなるからだと思われる。 MzScheme > (define (x)</undef>…

Schemeをつくろう(16) lambda(2)

そういえば、重大な事を確認してなかった。 read > (define f (lambda (x) (lambda (y) (+ x y)))) <closure> read > ((f 1) 2) 3おぉ。クロージャ。Schemeっぽいっす!! Schemeエンジンをかなり改善中。いい感じになってきた。</closure>

Schemeをつくろう(15) lambda

とうとう作っちゃった。 input> ((lambda (x y) (+ x y)) 1 2) 3かなりはりぼて(笑でも、 再帰できるよ!! input> (define sum input> (lambda (n) input> (if (= n 10) input> n input> (+ n (sum (+ n 1)))))) input> (sum 0) 55=追加したので、再帰もでき…

Schemeをつくろう(14) シンボルテーブルづくり(2)

やっぱり、配列じゃマズかったのでシンボルテーブル作りなおし。 「やっぱりシンボルテーブルもリストじゃないとマズイ」 文字はユニークになったけど、シンボルがユニークじゃない!!重大なミスでした。ハイ。ということで、文字列型を追加。といっても・・…

Schemeをつくろう(13) シンボルテーブルづくり

僕のSchemeではシンボルは「文字列」という極めて単純な作りになってます。シンボルが文字列だと色々問題点がありそうなので、問題点をピックアップしながら対策を練っていきます。 問題点 シンボルが文字列だと、 重い シンボルの比較が重い メモリ食いまく…

Schemeをつくろう(12) 関数らしきもの

実験がうまくいってきたので、Lispの原点を目指してみます。 まずは変数登録 変数を登録しておこう。 debug> (define a 1) 1 debug> (define b 2) 2 debug> (define c 3) 3環境に変数a,b,cが登録されました。 そういえばクオートがあった クオートしておいて…

Schemeをつくろう(11) 実験中

ポインタ渡し、値渡し、ポインタ渡し、値渡し・・・。 #include <stdio.h> void frame_b(int *env) { *env = 30; } void child(int env) { printf("child : before : %d\n", env); frame_b(&env); printf("child : after : %d\n", env); } void frame_a(int *env) { *</stdio.h>…

Schemeをつくろう(10) SICPの問題を僕のSchemeで解く

簡単な所から攻めてみます。クオートも特別な関数のようです。 構文要素の追加 字句&構文解析にひとこと加えてっと。 case '\'' : return cons(symbol("quote"), cons(read_to_stream(s),null())); 'があったら、要素を(quote 中身)で囲みます。 文法の追加…

Schemeをつくろう(9) if

さて、構文という奴に取りかかります。あぁ、Schemeには構文がないんだっけ。でもifは構文だよな。マテ、値を返すから式か?・・・構文の定義がイマイチ微妙です。 あんまり細かいことは気にせず進みます。 ifの挙動 ifはdefineと同じように特別な関数です。…

Schemeをつくろう(7) ビルトイン関数の登録。

足し算だけじゃ寂しくなってきたので、ビルトイン関数を登録したいと思います。 新たなオブジェクト定義 ビルトイン関数を実行させようと思うと、新たなオブジェクトが必要となるので、function型を作ります。 struct function { int length; struct object …

環境破壊

環境の考察。 Gauche gosh> (define a (define b 1)) a gosh> b 1へぇぇ。 MzScheme > (define a (define b 1)) stdin::10: define: not allowed in an expression context in: (define b 1)出来なかった。 ついでに SBCL * (defvar a (defvar b 1)) A * a 1…

SICPを読む(68) 問題 2.53 - 2.55 記号データ

2.3に入ります。記号データってのは、シンボルのこと? 問題 2.53 シンボルとmemqの問題。 (list 'a 'b 'c) ; (a b c) (list (list 'george)) ; ((george)) (cdr '((x1 x2) (y1 y2))) ; ((y1 y2)) (cadr '((x1 x2) (y1 y2))) ; (y1 y2) (pair? (car '(a short…

Schemeをつくろう(8) 環境について。

さて、環境について考えてみます。ここら辺はSICPに書いてあるハズなんですが、まだ「全く読んでいない」ので「僕の想像」で作ってみることにします。 復習 まず、環境をリストで作りました。 ((cons . function:0x8049307[2]) (cdr . function:0x8049360[1]…

CLとSchemeの違い(大文字小文字の区別)

大文字と小文字の区別について。gauche。 gosh> (CAR '(a b c)) *** ERROR: unbound variable: CARSBCL。 * (CAR '(a b c)) A * (cDr '(a b c)) (B C)へぇぇぇ。CLはシンボルを大文字で管理してるのかな。 似てるようで全然違う言語。

SICPを読む(67) SICPを読む(67) 問題2.52 図形言語卒業

さて、やってきました。図形言語最後の課題。 「なんか作ってみろ」 とのことなので、自由に遊んでみました。 いちおうラムダのつもりです。座標系にキレ気味で作ったので(笑 結局、普通の座標系(左上が0,0)にしました。やっぱゼロは左上だよ。うん。 マイ図…

SICPを読む(66) 絨毯?

図形言語も進めます。あとちょっと。

スゲー良い言葉

ガウディ本「この本の目的」より。スゲー良い言葉なので書き留めておく。 プログラマにとって最も困難な、かつ最もやりがいのある仕事はプログラムを書くことではなく、抽象(abstraction)を設計することである。 プログラムを書くことが好きか?と言われると…

Schemeをつくろう(6) GCCの関数評価順序

C(GCC)の関数評価順序はちょっと予想に反する挙動を示す。 問題 GCCで表示される値は? printf("test> ", printf("1 "), printf("2 "), printf("3 "), printf("4 ")); 正解は、 正解 4 3 2 1 test> まとめ 勘弁して(泣 毎回ハマる。