今日はとても長いです。 その分かなり濃い時間が過ごせたので有意義でした。 良い練習問題でした。 問題2.74 なんとフルスクラッチでコードを書かせる問題。 今までの理解度とかSchemeのコーディング力が問われる。 問題2.74 a fileはリストとして表現する。 リストの第1要素が事業所を区別する type tag である。 type tag は company 手続きにより取得できる。 (define (get-record file name) ((get 'get-record (company file)) file name)) (define (company file) (car file)) 問題2.74 b レコードはリストとして表現する。 リストの第1要素がレコードを区別する type tag である。 type tag は record-type 手続きにより取得
問題2.68 (define (encode message tree) (if (null? message) '() (append (encode-symbol (car message) tree) (encode (cdr message) tree)))) (define (encode-symbol char tree) (define (list-have? l e) (cond ((null? l) #f) ((equal? (car l) e) #t) (else (list-have? (cdr l) e)))) (if (leaf? tree) '() (cond ((list-have? (symbols (left-branch tree)) char) (cons 0 (encode-symbol char (left-branch tree)))) ((li
2.3.4 Huffman符号化木の話 Huffman符号、なんとも分かりやすい説明で感動。 これからは会話の随所に「Huffman符号がさ。」と散りばめよう。(嘘 SICPの該当箇所を伴侶の人に見せて読んでもらったら理解できたらしい。 IT系が苦手なのに恐るべし。 Huffman木をノートで書いてみる。ふむふむ。 おもしろいな。木ができる様子を視覚的に見せられたら良いんだけれどまぁ良いか。 (define (make-leaf symbol weight) (list 'leaf symbol weight)) (define (leaf? object) (eq? (car object) 'leaf)) (define (symbol-leaf x) (cadr x)) (define (weight-leaf x) (caddr x)) (define (make-code-tre
配列とか「リスト」と呼ばれるものとは違うのかな? 多次元を扱えるトコが良いトコ? 処理も入る「リスト」と分けて「データ」というのを強調してるのかな? gosh> (vector 0 1 2 3 4) #(0 1 2 3 4)#(...) が簡略記法ってこと? gosh> #(0 1 2 3 4) #(0 1 2 3 4)まさに。 文字型も入るかな? gosh> (vector #\H #\e #\l #\l #\o) #(#\H #\e #\l #\l #\o)うん。 混合はどうよ? gosh> (vector 0 "h" 1 "e" 2 "l" 3 "l" 4 "o") #(0 "h" 1 "e" 2 "l" 3 "l" 4 "o")うん。 make-vector で空ベクタを作れる: gosh> (define v (make-vector 5)) v gosh> v #(#<unde
順序づけられないリストとしての集合 (define (element-of-set? x set) (cond ((null? set) #f) ((equal? x (car set)) #t) (else (element-of-set? x (cdr set))))) (define (adjoin-set x set) (if (element-of-set? x set) set (cons x set)))ちなみに intersection = 「論理積」です。 (define (intersection-set set1 set2) (cond ((or (null? set1) (null? set2)) '()) ((element-of-set? (car set1) set2) (cons (car set1) (intersection-set (cdr set1)
2.3.2 記号微分 これはなかなか面白い。サボらずに全部やってみよう。 最終目標は例えば (deriv '(* x y) 'x)の結果がyになること。 クォートされることから分かる通りx, yはSchemeの変数ではない。 SICPにある通り derivは variable? same-varibale? sum? addend augend make-sum product? multiplier multiplicand make-productを用いて以下のように表現できる。 (define (deriv exp var) (cond ((number? exp) 0) ;定数の微分は0 ((variable? exp) (if (same-variable? exp var) 1 0)) ;微分の変数の識別 ((sum? exp) (make-sum (deriv (addend
今日から合成データ型ですってよ。文字列は文字のガッチンコみたいですよ。 文字列: gosh> "Hello, World!" "Hello, World!"世はなべて事もなし 文字から文字列を合成するには string という関数を使う: gosh> (string #\H #\e #\l #\l #\o) "Hello"一応やっておこう: gosh> (string "He" #\l #\l #\o) *** ERROR: character required, but got "He" Stack Trace: _______________________________________はい、文字列は引数にとれません。 グローバル変数を作って、 gosh> (define greeting "Hello; Hello!") greeting gosh> greeting "Hello
図形言語で学ぶべき部分は何でしょうか? この言語では組み合わされたオブジェクトはリスト構造ではなく、手続きとして表現されている おそらくここが一番大事なのではないかと考えます。 ただ実際にコードを書いて動かしてみないと理解するのは正直厳しいです。 transform-painter (define (transform-painter painter origin corner1 corner2) (lambda (frame) (let ((m (frame-coord-map frame))) (let ((new-origin (m origin))) (painter (make-frame new-origin (sub-vect (m corner1) new-origin) (sub-vect (m corner2) new-origin)))))))これが直感的にかなり分か
早くSchemeで絵を出したいので、 frame, painterの概念を学ぶところから進めようと思います。 幸い Gauche-glで線を引く部分は理解できているので、本文中の wave painterは実装できるとふんでいます。 フレーム座標写像について 文章を読んでもさっぱり分からず、うんうん唸って図を描いてみたら分かった。 人に説明する形で理解を確かめるテスト。 まず今回扱う図形や絵を 0<=x,y <=1 の正方形の中に描くというルールを決めます。 (この正方形のことを単位方形と呼んでいます。) そして例えば、ある図形(例えばうさぎの絵)を特定のフレーム内に表示したいとします。 うさぎの目は単位方形内の(x1, y1)という点としてあらわされているのですが、実際のフレームではどこの座標になるでしょうか? これを求めるのがフレーム座標写像です。(伝わったかな?) これで大体イメージ
gosh> #t #t gosh> 42 42 gosh> #\c #\c「単純データ型は自己評価的」らしい。「即値」とはまた違う感じかな? gosh> (quote xyz) xyz「シンボルは識別子をクォートしたもの」って感じかな? gosh> 'xyz xyz略記法。クォートしてる。 gosh> (symbol? 'xyz) #t gosh> (symbol? 42) #f 「Scheme のシンボルは通常、大文字と小文字を区別しません。」へぇ。 gosh> (eqv? 'Calorie 'calorie) #fあれ? #t になるはずなのに? どうも Gauche は他言語との可搬性を重視してデフォルトでは大文字小文字の区別をつけるらしい。RSR5に沿わないらしい。See: 「Gauche ユーザリファレンス: 2.4 大文字小文字の区別」 フムン。「goshインタプリタの起動時に
昨日は多忙で忘れてた。昼休みもついつい仕事してたし。 gosh> (char-ci=? #\a #\A) #t gosh> (char-ci<? #\a #\B) #t gosh> (char-downcase #\A) #\a gosh> (char-upcase #\a) #\Achar-ci=? とか char-ci gosh> (upcase "abcde") *** ERROR: unbound variable: upcase Stack Trace: _______________________________________ gosh> (string-upcase "abcde") *** ERROR: unbound variable: string-upcase Stack Trace: _______________________________________
計算機プログラムの構造と解釈を読んでScheme勉強していますといっても、いったい何の役に立つの?と思っている人が多いと思います。 僕も実際、考え方はかなり勉強になっていますがまだ仕事やMonaに結びつけることが出来ていません。 こういう状態が長く続くとモヤモヤとするものですが、もうすぐ図形言語の勉強に入るということもあって、「見た目重要」な部分にチャレンジしてみます。 ウィンドウを表示して絵を出したい! 画面描画にはGauche-glを使います。 Gauche-glはGaucheからOpen GLライブラリ(もしくは互換ライブラリ)を操作するためのライブラリです。 使い方・インストールはGauche-glのドキュメントを参照されると良いでしょう。 ここではひげぽんの以下のような環境での場合のインストール・動くまでを紹介します。 環境 Ubuntu(coLinux) Linux colin
2.2.3公認インターフェースとしての並びのつづき 問題2.37 一旦パス。 余裕があったらここに戻ろう。 mapの使い方の勉強になりそうな気がする。 問題2.38 上から順に 3/2 1/6 (1 (2 (3)))→間違い(1 (2 (3 ()))) (3 (2 (1)))→間違い(((() 1) 2) 3) 満たすべき性質は・・・演算の順序に結果が依存しないこと。 →答えを見たら結合則と書いてあった。 計算の順序を変えても同じ結果がでる場合に、その計算は結合法則を満たすと言う 問題2.39 (define (reverse sequence) (fold-right (lambda (x y) (append y (list x))) nil sequence))(define (reverse-2 sequence) (fold-left (lambda (x y) (cons y
2.2.3公認インターフェースとしての並び 「accumulate」の意味が分からないので辞書を引いた。 ━━ v. 積む, ためる; 積もる, たまる; 【コンピュータ】累算する. まずはaccumulateの動作を確認しよう。 (define (accumulate op initial sequence) (if (null? sequence) initial (op (car sequence) (accumulate op initial (cdr sequence))))) (accumulate + 0 (list 1 2 3 4 5))今までまじめに本書を読んでいる人ならば、accumulate関数は薄々パターンがあるなと思っていたものを抽出したものだと気づくと思う。 問題2.33 (define (map p sequence) (accumulate (lambda
問題 2.28 (define (fringe tree) (define (pair-to-list pair) (list (car pair) (car (cdr pair)))) (if (null? tree) '() (if (pair? (car tree)) (append (pair-to-list (car tree)) (fringe (cdr tree))) (append (car tree) (fringe (cdr tree))))))とか (define (fringe t) (if (null? t) '() (append (car t) (fringe (cdr t)))))ものの見事にはまってしまいました。 解答を見たらlist 関数の使い方をきちんと理解できていないことに気づかされた。 あとは if と condの使い分けも微妙。 正解はスマートだ
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く