Hatena::Groupsicp

EhrenのSICP学習場

2010-10-03

4章の問題解いてみてる

13:34

schemescheme動くようになったのでようやく問題が解けるので解いてみました。

これ以外を解くかはちょっと考えてる。先も読みたいしー。

ex4.1

;; 左
(define (list-of-values exps env)
  (if (no-operands? exps)
      '()
      (let ((priority (myeval (first-operands exps) env)))
            (cons priority
                  (list-of-values (rest-operands exps) env)))))

;; 右
(define (list-of-values exps env)
  (if (no-operands? exps)
      '()
      (let ((priority (list-of-values (rest-operands exps) env)))
            (cons (myeval (first-operands exps) env)
                  priority))))

JacklynnJacklynn2012/01/09 22:25That's 2 cvleer by half and 2x2 clever 4 me. Thanks!

pnlmvtpnlmvt2012/01/10 17:08QStrNV <a href="http://ktmyunxwpiwq.com/">ktmyunxwpiwq</a>

peuyjlpeuyjl2012/01/10 23:26MFthbl , [url=http://fxcnrvqvqvdn.com/]fxcnrvqvqvdn[/url], [link=http://pqljejrkvdfj.com/]pqljejrkvdfj[/link], http://osfeqianekge.com/

umgqlbumgqlb2012/01/12 23:17lSKHjJ <a href="http://lehbwtnucuat.com/">lehbwtnucuat</a>

sayqvfsayqvf2012/01/15 01:28zMEuOh , [url=http://hjzhhycxnwds.com/]hjzhhycxnwds[/url], [link=http://gvqafibkyjqj.com/]gvqafibkyjqj[/link], http://exhgwnbztgmx.com/

2010-09-22

メタサーキュラってみた

01:27

こちらに書くのは時間が空いてしまいましたがSICP4章を読み進めています。

4.1のScheme上でSchemeを動かす処理系が動いたのが、

あまりにもうれしかったのでポストしました!

処理系Gaucheを使っています。

基本的に写経すれば動くのですが、はまった箇所を列挙しておきます。

  • gaucheではtrue/falseは #t/#fで表すので事前に定義しておく
  • sicpではapply-in-underlying-schemeの処理を実装しないため、日本語版P227のコメント17番のように事前に以下のように定義しておく。
(define apply-in-underlying-scheme apply)

ソース(基本的にSICP写経


ToDo

  • コメントが全くないので追加する。
  • eval/applyの関係がまだ理解できてないので実装系を動かしながら学ぶ

MariluMarilu2011/04/10 20:01XKEvhr With the bases loaded you struck us out with that answer!

zodkihpdngzodkihpdng2011/04/24 11:00VfxMhM , [url=http://ifzisohbrdtf.com/]ifzisohbrdtf[/url], [link=http://yidiyqxbnorr.com/]yidiyqxbnorr[/link], http://tnlbjlhnhmnk.com/

TotaTota2012/10/06 17:18Pleasing you shluod think of something like that

ffvzywdffvzywd2012/10/08 03:50UmVWW6 , [url=http://vcqydkorlirh.com/]vcqydkorlirh[/url], [link=http://wgpguehrhreq.com/]wgpguehrhreq[/link], http://zxwfcjxbdaok.com/

tdumcetdumce2012/10/08 03:51cigM84 , [url=http://dexwduzeiiud.com/]dexwduzeiiud[/url], [link=http://vvffqftvehdb.com/]vvffqftvehdb[/link], http://wwbnnuionxtf.com/

lbvnhggepflbvnhggepf2012/10/08 17:34cSugGY <a href="http://tmwdcrdliyks.com/">tmwdcrdliyks</a>

oxpepxboxpepxb2012/10/10 01:50BH3wkV , [url=http://muhnzgwtigwr.com/]muhnzgwtigwr[/url], [link=http://xdptvoxweyvh.com/]xdptvoxweyvh[/link], http://hywdbdmamqan.com/

2010-01-11

3.1.2 代入を取り入れた利点

00:21

Gaucheでの疑似乱数生成

GaucheSICP読むときに使ってるのですが、randomという名前の関数はないみたい。

検索してみたところ、↓の情報を発見。先人に感謝!

ex3.5

(use srfi-27)
(define (random num)
  (* (random-integer num) 1.0))

(define (random-in-range low high)
  (let ((range (- high low)))
    (+ low (random range))))
               
(define (estimate-integral P x1 x2 y1 y2 trials)
  (define in-circle
    (monte-carlo trials
                 (lambda ()
                   (P (random-in-range x1 x2)
                      (random-in-range y1 y2)))))
  (* in-circle (* (- x2 x1) (- y2 y1))))

;; 単位円からPIを求める
(define (estimate-pi2 trials)
  (define (P x y)
    (<= (+ (* x x) (* y y)) 1))
  (estimate-integral P -1 1 -1 1 trials))

ex3.6

専用のrandのためにrand-updateを作成。

↓のページを参考に"線形合同法 - Wikipedia"の値を決めた。

(define my-rand
  (let ((x 1))
    (define (rand-update x)
      (modulo (+ (* x 1103515245) 12345) 2147483647))
    (define (reset new-value)
      (set! x new-value) x)
    (define (generate)
      (begin
        (set! x (rand-update x)) x))
    (define (dispatch m)
      (cond ((eq? m 'reset) reset)
            ((eq? m 'generate) (generate))
            (else
             (error "Unknown"))))
      dispatch))

((my-rand 'reset ) 1000)
(my-rand 'generate)

3.1.1 代入と局所状態(続き)

17:47

一応問題を全部解いたけど、どちらかというとメッセージパッシングとset!の練習の問題だから先を急ぐ人は別に解かなくてもいいのかも。

ex3.2

(define (make-monitored func)
  (let ((calls 0))
        (lambda (m)
          (cond ((eq? m 'how-many-calls?) calls)
                ((eq? m 'reset-count) (set! calls 0))
                (else
                 (begin (set! calls (+ calls 1))  (func m))
                 )
                )
          )
        ))

ex3.3

(define (make-acount balance password)
  (define (withdraw amount)
    (if (>= balance amount)
        (begin (set! balance (- balance amount))
               balance)
        "Insufficient funds"))
  (define (deposit amount)
    (set! balance (+ balance amount))
    balance)
  (define (dispatch pwd m)
    (if (eq? password pwd)
        (cond ((eq? m 'withdraw) withdraw)
              ((eq? m 'deposit) deposit)
              (else (error "Unknown request")))
        (error "Incorrect password")))
  dispatch)

ex3.4

(define (make-acount balance password)
  (define incorrect-types 0)
  (define (withdraw amount)
    (if (>= balance amount)
        (begin (set! balance (- balance amount))
               balance)
        "Insufficient funds"))
  (define (deposit amount)
    (set! balance (+ balance amount))
    balance)
  (define (call-the-cops)
    (error "call the cops!"))
  (define (dispatch pwd m)
    (if (eq? password pwd)
        (begin
          (set! incorrect-types 0)
          (cond ((eq? m 'withdraw) withdraw)
                ((eq? m 'deposit) deposit)
                (else (error "Unknown request"))))
        (begin
          (if (>= incorrect-types 6)
              (call-the-cops)
              (begin
                (set! incorrect-types (+ incorrect-types 1))
                (error "Incorrect password"))))))
  dispatch)

EasterEaster2012/01/10 06:53Why does this have to be the ONLY reliable srouce? Oh well, gj!

RayaneRayane2013/08/07 05:25That's a smart answer to a tricky qutesion

GauravGaurav2013/08/09 07:27Well done <a href="http://jakregph.com">arlitce</a> that. I'll make sure to use it wisely.

EniEni2013/08/15 13:24Just the type of ingihst we need to fire up the debate. http://yulljp.com [url=http://hfmrntv.com]hfmrntv[/url] [link=http://wmmuqfw.com]wmmuqfw[/link]

NollieNollie2016/05/11 00:42(Escctroniel) This TV has one of the smallest form factors of any of the 40″ flat screen LED TVs so fit in my rather small space 38 1/2″ x 24 1/2″. It has excellent picture and sound. The only reason that I rate it 4* instead of 5* is because it has rather limited inputs and outputs on the back panel (2 HDMI, 1 component video which can alternate as a composite video in) there is no VGA in for a computer, no S-video in, no audio out). It think it is an excellent value. Samsung obviously went with less inputs and outputs and putting their priority in the picture and sound quality of this TV.

2010-01-06

3.1.1 代入と局所状態

01:16

ついに三章突入。

3.1.1

三章からは状態の管理をするためにset!,beginなどが登場。

ついに副作用の話題が出始めました。

そしてカプセル化の話題もでました。関数内で関数の定義をしてカプセル化するのはJavaScriptと一緒ですね。

今後はset!についての説明があるらしい。ばっとみたところ3.1.2でメリット、3.1.3でデメリットの説明らしい。

問題3.1

(define (make-accumulator val)
  (lambda (num)
    (begin (set! val (+ val num)))))

;;確認用
(define A (make-accumulator 5))
(A 10) ;;15
(A 10) ;;25

眠いので今日はここまで。

HayatoHayato2010/01/09 20:03もし差し支えなければ、はてなにログインしていなくても閲覧できるようにしてもらえると嬉しいです。GoogleReaderで捕捉したいので。。。個人的な希望で申し訳ないです。

EhrenEhren2010/01/11 17:50ご要望にお応えして、はてなにログインしていなくても閲覧できるようにしましたよ。これからもよろしくです。

HayatoHayato2010/01/12 00:57ありがとう!早速フィード登録しました。

SwetaSweta2012/10/07 04:44I'm impressed! You've mnagaed the almost impossible.

ohnedrigohnedrig2012/10/07 18:12salsoJ <a href="http://bgmfwtduwzoe.com/">bgmfwtduwzoe</a>

kmpbowitfgkmpbowitfg2012/10/09 01:14Fs8Qni , [url=http://ojdbktwkqeyb.com/]ojdbktwkqeyb[/url], [link=http://eupuyqcbwoiq.com/]eupuyqcbwoiq[/link], http://howosmzivemk.com/

xpjsggxpjsgg2012/10/10 02:36p95O4K , [url=http://strsphkboprc.com/]strsphkboprc[/url], [link=http://ollqizxlsvpx.com/]ollqizxlsvpx[/link], http://rpglmcicvloq.com/

2010-01-05

2.4

01:10

SICP Lite #9 の宿題をやっておく

問題2.75

(define (make-from-real-imag x y)
  (define square (lambda (x) (* x x)))
  (define (dispatch op)
    (cond ((eq? op 'real-part) x)
          ((eq? op 'imag-part) y)
          ((eq? op 'magnitude)
           (sqrt (+ (square x) (square y))))
          ((eq? op 'angle) (atan y x))
          (else
           (error "Unknown op " op))))
  dispatch)

関数を返す関数を定義して、返した関数に対して引数で動きが変わるのをメッセージパッシングと呼ぶらしい。確かにメッセージを送っているようにも見える。


 問題2.76

名前新しい型追加新しい演算追加
明白な振り分けを持つ汎用演算全汎用選択子を変更演算追加のみ
データ主導流型追加のみ各型に対してインターフェース、内部手続きの追加
メッセージパッシング型追加のみ各型に対して演算追加が必要

新しい型、演算が追加された場合には、データ主導orメッセージパッシングならばOK

うーんでもこれあってるのかな。自信がありませぬ。

AliAli2012/10/06 07:20Free knowledge like this doesn't just help, it promote dmeorcacy. Thank you.

hrmmokhrmmok2012/10/06 23:52bunbti <a href="http://akzivlylybvv.com/">akzivlylybvv</a>

ameyuamuameyuamu2012/10/09 03:562v9QV7 , [url=http://nifemaxjsusp.com/]nifemaxjsusp[/url], [link=http://cyyzavyreqqm.com/]cyyzavyreqqm[/link], http://evfvibpktgng.com/