sicp

並列時の実行順序の組み合わせの数

久しぶりに,sicpを読んでみた。 (x y z) (a b c)で20通りなのはほんとなのかな? (use srfi-1) (define (f s1 s2) (cond ((and (null? s1) (null? s2)) '()) ((null? s1) (cons (car s2) (f s1 (cdr s2)))) ((null? s2) (cons (car s1) (f (cdr s1) s2))) (e…

(sicp53)問題4.14,4.15

4.14 make-lambdaで取り付けられたtag'procedureを基底の処理系が評価する手段をもって無いためerrorになる。 以下詳しく (記憶が確かなら)define、set!を使わない箇所では、副作用を利用していない。 なので、置き換えで評価される様子を表すことができる…

(sicp54)問題4.16

カッコひとつ足りないバグに2時間くらい費やした。 4.16 a ただcheckをつけるだけ(わかりやすいように手続きでくくる) (define (lookup-variable-value var env) (define (unassigned-varriable-checker pair) (if (eq? (cdr pair) '*unassigned*) (error …

(sicp51)問題4.13

一度束縛した変数の束縛を取り除く構文make-unbound!を作る。 問題には、すべての環境から取り除くべきか、現在の環境のみから取り除くか選べと書いてあった。 現在の環境からのみ取り除く方がいいと考えてそのように実装した。 (現在の環境以外の束縛も取…

(sicp51)put-getの修正と問題4.11〜4.12

以下のことに気づいたので修正 put/getの引数の順序はop, typeの順だった(前のはtype, op) install-evalの部分を少し変える必要がありそう。*1 あと、evalのgetの部分も あー、変えなくていいのか。(get 'eval 'if)とかはif形式のオブジェクトに対するeval…

(sicp50)m4.4〜m4.8

追記 putとgetの引数の順序が逆だった。後で直す。 i 以前書いたput/getのファイルがどこかにいってしまったので書き直した 本当はdolistとかdotimesとかdoとかもつくろうとしたけど、飽きた。 一応まともに動く。 ;;; M-Eval input: (define (mymap proc l)…

久しぶりなのでハフマン木のところを復習してみた。

時間を決めて、コードを書いてみた。 関数を作る度にテストしていったら、とても楽に進められた。 1時間ちょっとでハフマン木の部分の問題が全部解けた(と思う。計算量みつもりとか以外) 書いたコード (define (make-leaf symbol weight) (list 'leaf symb…

(sicp50)m4.9のdoの修正と4.10

4.10 好きな制御構造の作成 dotimesを作ってみた。(何か大げさな様な気もするけど) ;;使用例 (let ((fact 1)) (dotimes (e 10 fact) (set! fact (* fact (+ 1 e))))) ;; gosh> 3628800 named-letを使った再帰に置き換えて定義する。 (define (run-dotimes …

(sicp49)m4.8,m4.9

合っているか自信無いです>< 4.8named-letを作る (define (named-let->definition exp) ;(letを外した式をもらう。 (let ((name (car exp)) (arguments (cadr exp)) (body (caddr exp))) (let ((vars (map car arguments)) (exps (map cadr arguments))) (…

(sicp48)m4.3~m4.7

今日やった分。 4.3 データ主導の形に変更。gets/putsはてきとうに(putsはわざわざ作らなくてもいいかも) #| ;;getの中身を作るためのelisp (defun make-func-mem (beg end) (interactive "r") (let ((mem '())) (save-excursion (goto-char end) (while (a…

(sicp47)m4.1~4.2

いつやったかは忘れた。(upし忘れてた) ;;eval/applyは元の関数を覆い隠さない様に@をつけよう (define (@eval exp env) (cond ((self-evaluating? exp) exp) ((variable? exp) (lookup-variable-value exp env)) ((quoted? exp) (text-of-quotation exp)) …

(sicp46)m3.73~m3.80

defineの部分をletrecに変えるところ以外は、特に変わったところはない。 @map=stream-map (でも、最後の方とかは、教科書に書いてある図を頼りにcodeに変換しただけのような気がします><) (use my-stream) (define (@add s1 s2) (@map + s1 s2)) (define…

javascriptでstream

sicpの中にstreamというデータ構造が出てきます。 streamを使うと無限の長さのデータを表せるらしいです。 でも、streamが分かっているのか分かっていないのかよく分かりません><。 他の言語でstreamのようなものが実装できたら、分かっているということに…

(sicp45)m3.60~m3.72

面倒なのでstream-*が@*になってます。 stream-map -> @map stream->list -> @>list (use my-stream) ;; m3.60 ;;a0, a1, a2,... ;; (define (mul-series s1 s2) (@cons (* (@car s1) (@car s2)) (@add (mul-series s1 (@cdr s2)) (@scale (@cdr s1) (@car s…

(sicp44)m3.50~3.59

dead-lockのところ どうしても興味が持てないので飛ばしました>< stream 初めはutil.streamを使用しました。 sicpのコードの通りに書いても無限ループになってしまいました ここを参考に追加しました。 http://sicp.naochan.com/memo.pl?p=stream.scm (def…

(sicp42)sicp3.4.2の20種類を表示する

「'(a b c) '(x y z)」の順序を保ったままの組み合わせ。(20個ある) (define (my-remove item seq) (filter (lambda (x) (not (eq? item x))) seq)) (define (orderd-perm . args) (define (each-car-with-nil seqs) (fold (lambda (x init) (if (null? x) i…

(sicp42)m3.38~m3.40

m3.38 ;;面倒なので、コードを書こう。 (define (Peter balance) (set! balance (+ balance 10))) (define (Paul balance) (set! balance (- balance 20))) (define (Mary balance) (set! balance (- balance (/ balance 2)))) (define (permutation s) (if …

(sicp41)m3.33~m3.37

3.37のcopはmacroで作った方がいいのかもしれない。 ;;m3.33 (define (averager a b c) (let ((double (make-connector)) (ans (make-connector))) (multiplier double c ans) (adder a b ans) (constant 2 double)) 'ok) (define A (make-connector)) (defi…

(sicp40)m3.29~m3.32

途中からファイルを2つに分割した。 useが一度読み込んだファイルを再度読みこまないことに気づかなかった。 しばらく、どうして変更が反映されないんだろうと考えてしまった。 (あと、面倒だったのでutil.queueを使いました><) (use lc-module); lc-modu…

(sicp37)m3.27

memo化 (define (make-table) (let ((table (cons '*table* '()))) (define (insert! key value) (let ((record (assoc key (cdr table)))) (if record (set-cdr! record value) (set-cdr! table (cons (cons key value) (cdr table)))))) (define (lookup k…

(sicp38)m3.24~m3.26

3.24 equal?以外の述語をとるようにする。 関数を受け取るようにしてみた。 (define (make-table . key) (let ((local-table (list '*table*)) (same-key? equal?)) (define (assoc key records) (cond ((null? records) #f) ((same-key? key (caar records)…

(sicp36)m3.20~m3.21

(define (front-ptr queue) (car queue)) (define (rear-ptr queue) (cdr queue)) (define (set-front-ptr! queue item) (set-car! queue item)) (define (set-rear-ptr! queue item) (set-cdr! queue item)) (define (empty-queue? queue) (null? (front-pt…

追記

上のcycle?だとcarの所でできた循環を見つけることができない。 (define no-ret2 ;;carのところで循環するループ (let ((lst (list 1 2 3))) (set-car! (cdr lst) lst) lst)) (define rets (list ret3 ret4 ret7 no-ret no-ret2)) ;;m3.18 (define (cycle? s…

(sicp35)m3.12~3.19

他の人って図の所はどうやって書いているんだろう? (define orig-pair (cons '() '())) (define (get-new-pair) orig-pair) ;;get-new-pairはlispの実装に必要らしい。 (define (my-cons x y) (let ((new (get-new-pair))) (set-car! new x) (set-cdr! new …

(sicp34)m2.87〜2.88

(define (install-polynomial-package) ;;internal procedure ;;represantation of poly (define (make-poly variable term-list) (cons variable term-list)) (define (variable p) (car p)) (define (term-list p) (cdr p)) (define (same-variable? v1 v2…

(sicp33)m2.83~m2.84

疲れた><。 type-x>y?は作ってみたけど使わなかった。 (比較する度に階数を計算するのは効率が悪そうだし…) ;;m2.83 """ 順序 integer -> rational -> real -> complex """ (define (install-raise-package) (define (integer->rational i) (make-rational…

m2.81

(use pre-sicp2) """ pre-sicp.scmにput-coercionなどを書いた """ (define (scheme-number->complex n) (make-complex-from-real-imag (contents n) 0)) (put-coercion 'scheme-number 'complex scheme-number->complex) (let ((t (make-scheme-number 3)))…

(sicp?)put/getの修正

put/getには2つのバグがありました リストをkeyにして正しく検索できない。 失敗するとそこで終了してしまう。 '(test test)などのリストのkeyで正しく検索できない問題 リファレンスにしっかりと書いてありました。 >< http://practical-scheme.net/gauch…

(sicp31)m2.79~2.80

もう少し真面目にしたほうがいいかもしれない。 ;;2.79 ;;generic function equ? をつける。 ;;面倒なので、同じ型で同じ値以外は#fを返すようにする。 (define (install-equ?) (define (equ? x y) (apply-generic 'equ x y)) (define (same-type? x y) (eq?…

(sicp30)m2.77~m2.78

この先の問題もけっこう楽にできそう。 ;;m2.77 (use ggc.debug.trace) (let () (trace apply-generic) ;; (untrace) (define z (make-from-real-imag 3 4)) (magnitude z)) ;; 4:user> 0:(apply-generic magnitude (complex rectangular ... ;; 1: (apply-g…