`(Hello ,world)

ツッコミ、添削大歓迎です。いろいろ教えてください。

2008-11-25

SICP-4.1 The Metacircular Evaluator を読んだ

よくある、SchemeSchemeを実装するのはこの辺が原点だったのか。関数の動作をソース自身で説明できるほど関数の中身をブレークダウンするので、ものすごくわかりやすいプログラムだなぁ、と感動。

Google Video に動画があったのでそれも見た:

Error 404 (Not Found)!!1

Error 404 (Not Found)!!1

Schemeわかってれば授業見てても内容わかるし面白いんだけど…こんなのを授業でパソコンを使わずに黒板を前に延々話を聞かされたらトラウマになって絶対Lisp嫌いになるよなぁ。「こんなの何に使うんだよ」「だいたい先生も括弧閉じるのに手間取ってわざわざ数えてるじゃん、なんちゅう非実用な言語」と必ず思うはず。

結局のところ、自分で手を動かさない限り覚えられない罠。

mokehehemokehehe2008/12/13 08:37R5RS 4.1.4 に、「一つの<変数>が<仮引数部>に複数回現れることはエラーである」と書かれている

トラックバック - http://cadr.g.hatena.ne.jp/mokehehe/20081125

2008-03-30

Amazon.comでのSICPの評価

| 00:49

Amazon.comでのSICPのページを見たら、Peter Norvig 先生がベストレビューだった。本人かどうかわからないけどpaul grahamもレビューを書いている。他にも有名人がいるかと見てみたけど、LokiAndrei Alexandrescuくらいしかわからなかった。

それにしても本当に星5個と1個ではっきりわかれてるな。1個の人は「退屈」とか『不親切」とかのコメントが多い。理解できないと評価もよくなりようがないよね。

Gauche-gd で図形言語

| 12:28

ImageMagickのインストールにつまづいてしまったので、gdを試してみた。無事にインストールできて、SICPの図形言語ができました。

f:id:mokehehe:20080330122615p:image

#!/usr/local/bin/gosh

(use graphics.gd)

(load "./pict-lang.scm")

;; gd interface

(define *im* #f)

(define (screen w h . rest)
  (let-optionals* rest ((r 255)
                        (g 255)
                        (b 255))
                  (set! *im* (gd-image-create w h))
                  (gd-image-color-transparent *im* (color r g b))
                  (gd-image-interlace *im* 1)))

(define (outimg)
  (current-gd-image-format (if (memq 'png *gd-features*) 'png 'gif))
  (write *im*))

(define (color r g b)
  (gd-image-color-allocate *im* r g b))

(define (line col x0 y0 x1 y1)
  (gd-image-line *im* x0 y0 x1 y1 col))


;; test painter

(define wave
  (let ((p01 (make-vect 0.42 1.00)) (p02 (make-vect 0.58 1.00))
        (p03 (make-vect 0.00 0.80)) (p04 (make-vect 0.35 0.80))
        (p05 (make-vect 0.65 0.80)) (p06 (make-vect 0.00 0.60))
        (p07 (make-vect 0.30 0.60)) (p08 (make-vect 0.40 0.60))
        (p09 (make-vect 0.60 0.60)) (p10 (make-vect 0.70 0.60))
        (p11 (make-vect 0.20 0.55)) (p12 (make-vect 0.30 0.55))
        (p13 (make-vect 0.35 0.50)) (p14 (make-vect 0.65 0.50))
        (p15 (make-vect 0.20 0.45)) (p16 (make-vect 1.00 0.40))
        (p17 (make-vect 0.50 0.20)) (p18 (make-vect 1.00 0.20))
        (p19 (make-vect 0.25 0.00)) (p20 (make-vect 0.40 0.00))
        (p21 (make-vect 0.60 0.00)) (p22 (make-vect 0.75 0.00)))
    (segments->painter
      (list (make-segment p01 p04)
            (make-segment p04 p08)
            (make-segment p08 p07)
            (make-segment p07 p11)
            (make-segment p11 p03)
            (make-segment p06 p15)
            (make-segment p15 p12)
            (make-segment p12 p13)
            (make-segment p13 p19)
            (make-segment p20 p17)
            (make-segment p17 p21)
            (make-segment p22 p14)
            (make-segment p14 p18)
            (make-segment p16 p10)
            (make-segment p10 p09)
            (make-segment p09 p05)
            (make-segment p05 p02)))))

(define wave2 (beside wave (flip-vert wave)))
(define wave4 (below wave2 wave2))

(define (rotate4 painter)
  (let ((half (beside painter (rotate90 painter))))
    (below half (rotate180 half))))

(define (divide-x painter n)
  (if (> n 0)
      (let ((sub (divide-x painter (- n 1))))
        (below (beside (rotate270 sub) (rotate180 painter)) (beside painter (rotate90 sub))))
    painter))

(define test-painter
;  (square-limit wave 4)
;  (rotate4 (flip-vert (flip-horiz (corner-split wave 4))))
  (divide-x wave 5)
  )

(define-constant WIDTH  256)
(define-constant HEIGHT 256)

(define (draw-line v0 v1)
  (let ((x0 (floor->exact (xcor-vect v0)))
        (y0 (floor->exact (- HEIGHT (ycor-vect v0))))
        (x1 (floor->exact (xcor-vect v1)))
        (y1 (floor->exact (- HEIGHT (ycor-vect v1)))))
    (line (color 0 0 0) x0 y0 x1 y1)))

;; Entry point
(define (main args)
  (screen WIDTH HEIGHT)
  (let ((frame (make-frame
                (make-vect 0 0) (make-vect WIDTH 0) (make-vect 0 HEIGHT))))
    (test-painter frame))
  (outimg)
  0)
トラックバック - http://cadr.g.hatena.ne.jp/mokehehe/20080330

2008-03-22

SICP第2章

| 07:00

2章を読み進めてるけど、あまり面白くない。1章は出てくる例がどれもビルディングブロックとして組みあがっていくのを強く感じてとてもわくわくしたんだけど、2章はSchemeの文法というか基本的な話が多くてそれほど面白くない。クロージャがデータ構造としても使えるってので面白い話が出てくるのではないかと期待しますが…。

トラックバック - http://cadr.g.hatena.ne.jp/mokehehe/20080322