(wat-aro)

生きてます

2015-12-01から1ヶ月間の記事一覧

SICP 問題 4.23

本文中のanalyze-sequenceと問題文のanalyze-sequenceの比較. リーダーマクロを使って実行する. 本文のanalyze-sequence (define (analyze-sequence exps) (define (sequentially proc1 proc2) #?=(lambda (env) (proc1 env) (proc2 env))) (define (loop …

SICP 問題 4.22

letを使えるようにする. (define (analyze exp) (cond ((self-evaluating? exp) (analyze-self-evaluating exp)) ((quoted? exp) (analyze-quoted exp)) ((variable? exp) (analyze-variable exp)) ((assignment? exp) (analyze-assignment exp)) ((definit…

SICP 問題 4.21

;; a 以下の式が階乗を計算すること確かめた後,フィボナッチ数を計算する手続きを作る. ((lambda (n) ((lambda (fact) (fact fact n)) (lambda (ft k) (if (= k 1) 1 (* k (ft ft(- k 1))))))) 10) gosh> ((lambda (n) ((lambda (fact) (fact fact n)) (la…

SICP 問題 4.20

;; a ;; letrecをlet式に変換すし,導出された式として実装する. ;; eval (define (eval exp env) (cond ((self-evaluating? exp) exp) ((variable? exp) (lookup-variable-value exp env)) ((quoted? exp) (text-of-quotation exp)) ((assignment? exp) (e…

SICP 問題 4.19

(let ((a 1)) (define (f x) (define b (+ a x)) (define a 5) (+ a b)) (f 10)) これを同時定義する方法. delayとforceを使えばできそうだけどと考えました. 内部定義が変数を定義しているときは値をdelayで包んで, って考えたんですけど,評価する段階…

SICP 問題 4.18

本文中の変形であればうごく. ;; 3章で定義した手続きとマクロ (define (integral integrand initial-value dt) (define int (cons-stream initial-value (add-streams (scale-stream integrand dt) int))) int) (define (stream-map proc . argstreams) (…

SICP 問題 4.17

lambdaを評価すると新しくフレームが作られます. これを防ぐためにletでunassignmentを束縛するのではなくdefineで内部定義します. define-variable!はフレームに新たな変数を追加する手続きなので余計なフレームは作られません. scheme (define (scan-ou…

SICP4章 真理値のせいではまった.

(define (append x y) (if (null? x) y (cons (car x) (append (cdr x) y)))) これが動かなかったんですよ. はじめはeval-sequenceで(first-exp exp)をevalしていなかったとかそういうのだったんですけど, どうしても動かなくて. debug printでも(null? x…

SICP 問題 4.16

;; a (define (lookup-variable-value var env) (let ((target (env-loop var env (lambda (var vars vals) vals)))) (cond ((eq? target '*unassigned*) (error "Unassigned variable" var)) (target (car target)) (else (error "Unbound variable" var)))…

SICP 問題 4.16

;; a (define (lookup-variable-value var env) (let ((target (env-loop var env (lambda (var vars vals) (car vals))))) (cond ((eq? target '*unassigned*) (error "Unassigned variable" var)) (target target) (else (error "Unbound variable" var)))…

varとvalを間違えてはまった話

ちょっとしたミスにかなり時間取られました. スコープがどうなってるか調べようと色々手続き作ろうしていたらよくわからないエラーが出てしまい. はじめはappって名前のlambda式をdefineするとエラーが出るっていうよくわからない症状で. 途中でmy-apply…

SICP 問題 4.15

;; 引数の手続きpとオブジェクトaについて,式(p a)停止するかどうかを正確に判断するような手続きhalts? (define (run-forever) (run-forever)) (define (try p) (if (halts? p p) (run-forever) 'halted)) (try try) ;; まずこれが停止すると仮定する.す…

SICP 問題 4.14

;; M-EVAL中の手続きは先頭に'procedureがついたリスト. ;; 基層のLispのmapを使うとただのリストとして受け取ってしまうためにうまくいかない. (define primitive-procedures (list (list 'car car) (list 'cdr cdr) (list 'cons cons) (list 'null? null…

SICP 問題 4.13

(define (scan var vars vals proc) (cond ((null? vars) #f) ((eq? var (car vars)) (proc var vars vals)) (else (scan var (cdr vars) (cdr vals) proc)))) ;; 束縛された変数を解放するmake-unbound! ;; first-frameだけでに限定しないと (define (make-…

SICP 問題 4.12

;; scanとenv-loopを抜き出す. ;; 見つかった時の手続きをprocで渡す. (define (scan var vars vals proc) (cond ((null? vars) #f) ((eq? var (car vars)) (proc var vars vals)) (else (scan var (cdr vars) (cdr vals) proc)))) (define (env-loop var …

SICP 問題 4.11

;; フレームを束縛のリストとして表現 (define (make-frame variables values) (map cons variables values)) (define (first-binding frame) (car frame)) (define (rest-bindings frame) (cdr frame)) (define (binding-variable binding) (car binding)) …

SICP 問題 4.10

;; 後置式にする ;; 全部はめんどうなのでquoteだけ. ;; リストの最後の項か尋ねるlast? ;; 空リストは#fを返す. (define (last? lst) (if (null? lst) #f (null? (cdr lst)))) ;; リストの最後の項を取る選択子last (define (last lst) (if (last? lst) l…

SICP 問題 4.09

;; iteratorの実装 ;; whileの使用例 (while (< i 10) (begin (display i) (newline) (set! i (+ i 1)))) (let while () (if (< i 10) (begin (begin (display i) (newline) (set! i (+ i 1))) (while)))) ;; 破壊的です. (define (while? exp) (tagged-lis…

SICP 問題 4.08

let->combinationの変更ですんでいるのでevalは変更しなくていい. (define (named-let? exp) (symbol? (cadr exp))) (define (named-let-func-name exp) (cadr exp)) (define (named-let-parameters exp) (caddr exp)) (define (named-let-variables exp) (…

SICP 問題 4.07

let*をネストしたletで置き換える. ;; (let* ((x 3) ;; (y (+ x 2)) ;; (z (+ x y 5))) ;; (* x z)) ;; (let ((x 3)) ;; (let ((y (+ x 2))) ;; (let ((z (+ x y 5))) ;; (* x z)))) ;; let* (define (let*? exp) (tagged-list? exp 'let*)) (define (let*-…

SICP 問題 4.06

letを導入. lambdaに変形することで定義する. ;; (let ((a 1) (b 2) (c 3)) ;; (+ a b c)) ;; ((lambda (a b c) ;; (+ a b c)) 1 2 3) (define (let? exp) (tagged-list? exp 'let)) (define (let-parameters exp) (cadr exp)) (define (let-variables exp…

SICP 問題 4.05

make-ifに渡す前にclauseをpredicateとactionにわかる. (car action)に'=>があれば(cadr action)にpredicateを適用する. (define (expand-clauses clauses) (if (null? clauses) 'false ;; else 説は無い (let ((first (car clauses)) (rest (cdr clauses)…

SICP 問題 4.04

;; and (define (and? exp) (tagged-list? exp 'and)) (define (and-clauses exp) (cdr exp)) (define (eval-and exp env) (let iter ((clauses (and-clauses exp))) (if (null? clauses) 'true (let ((first (eval (car clauses) env))) (cond ((null? (cdr…

SICP 問題 4.03

;; evalをデータ主導スタイルに書き換える. ;; 本文で定義されたeval (define (eval exp env) (cond ((self-evaluating? exp) exp) ((variable? exp) (lookup-valiable-value exp env)) ((quoted? exp) (text-of-quotation exp)) ((assignment? exp) (eval-…

SICP 問題 4.02

;; 本文のeval (define (eval exp env) (cond ((self-evaluating? exp) exp) ((variable? exp) (lookup-valiable-value exp env)) ((quoted? exp) (text-of-quotation exp)) ((assignment? exp) (eval-assignment exp env)) ((definition? exp) (eval-defini…

SICP 問題 4.01

;; 評価順によらず,左から右に評価するlist-of-values (define (list-of-values exps env) (if (no-operands? exps) '() (let ((first-eval (eval (first-operand exp) env))) (cons first-eval (list-of-values (rest-operands exps) env))))) ;; 右から左…

gauche-modeでシングルクオートを補完されないようにする

smartparens-modeをアップデートしたらgauche-modeでシングルクオート'が補完されて''になってしまいました. 以前はsmartparens.elの該当箇所, (defcustom sp-lisp-modes '(cider-repl-mode clojure-mode clojurec-mode clojurescript-mode clojurex-mode …

SICP 問題 3.82

(define (random-in-range x1 x2) (+ x1 (random-integer (- x2 x1)))) (define (estimate-integral p x1 x2 y1 y2) (stream-map (lambda (n) (* n (- x2 x1) (- y2 y1))) (monte-carlo (stream-map p (stream-map (lambda (x) (random-in-range x1 x2)) int…

SICP 問題 3.81

(use srfi-19) (define (rand-update x) (modulo (+ (* x 1103515245) 12345) 2147483647)) ;; 命令のストリームを引数にとる (define (rand stream) (define (randoming s) (if (number? s) (random-update (time-nanosecond (current-time))) (random-upda…

SICP 問題 3.80

なかなかテスト通らなくて困りました. 結局iLを書く位置をvCの次にしたら動きました. 元々そこにはdvCがあって, (scale-stream iL (/ -1 C)))がiLの初期化前に行われたのが原因でした. (define (RLC R L C dt) (lambda (vC0 iL0) (define vC (integral (…