結城浩のSICP日記 RSSフィード

2006-05-13

今後の予定 今後の予定 - 結城浩のSICP日記 を含むブックマーク

SICP日記と銘打っているけれど実質Scheme日記と化している件。はさておき、今後の予定です(って誰に言ってるんだか)。

いろんな言語で頭を柔軟に。

SRFI 42: Eager Comprehensions SRFI 42: Eager Comprehensions - 結城浩のSICP日記 を含むブックマーク

SRFI 42: Eager Comprehensionsを使ってパスカルの三角形を書き直してみます。

(use srfi-42)

(define (combination n k)
  (cond ((= k 1) 1)
        ((= k n) 1)
        (else (+
          (combination (- n 1) k)
          (combination (- n 1) (- k 1))))))

(define (line n) (list-ec (: k 1 (+ n 1)) (combination n k)))
(do-ec (: n 1 11) (print (line n)))

実行結果です。

(1)
(1 1)
(1 2 1)
(1 3 3 1)
(1 4 6 4 1)
(1 5 10 10 5 1)
(1 6 15 20 15 6 1)
(1 7 21 35 35 21 7 1)
(1 8 28 56 70 56 28 8 1)
(1 9 36 84 126 126 84 36 9 1)
  • combinationはそのまま。
  • lineはこんな風にlist-ecで一行に。
(define (line n)
  (let loop ((k 1) (result '()))
    (cond ((> k n) (reverse result))
          (else
            (loop (+ k 1)
              (cons (combination n k) result))))))
;↓↓↓↓
(define (line n) (list-ec (: k 1 (+ n 1)) (combination n k)))
  • named-let mainもdo-ecで一行に。
(let main ((n 1))
  (cond ((<= n 10)
          (print (line n))
          (main (+ n 1)))))
;↓↓↓↓
(do-ec (: n 1 11) (print (line n)))

Danさんの問題 Danさんの問題 - 結城浩のSICP日記 を含むブックマーク

Danさんの「AUTOLOADって他でどうやるの」にshiroさんがgauche版を書いていらしたので、半写経。

;a.scm
(use srfi-13)

(define-class <unichars> () ())
(define-method slot-missing ((c <class>) (u <unichars>) name)
  (ucs->char (string->number (string-drop (x->string name) 1) 16)))

(define (main . args)
  (define u (make <unichars>))
  (print (ref u 'u5c0f)))
  • define-classの引数を増やした(そのままだとエラーになった)。
  • string-drop用にsrfi-13をuseした。
  • 単独のファイルとして実行するためmain関数をdefineした。

実行結果です。

> gosh a.scm > a
> dump a
00000000 E5 B0 8F 0D 0A

足し算表 足し算表 - 結城浩のSICP日記 を含むブックマーク

1+1から9+9までの足し算表をCSV形式で出力します。

(let outer-loop ((x 1))
  (cond ((< x 10)
          (let inner-loop ((y 1))
            (cond ((< y 10)
                    (format #t "\"~s+~s=~s\"," x y (+ x y))
                    (inner-loop (+ y 1)))
                  (else (newline))))
          (outer-loop (+ x 1)))
        (else (newline))))

実行結果です。

"1+1=2","1+2=3","1+3=4","1+4=5","1+5=6","1+6=7","1+7=8","1+8=9","1+9=10",
"2+1=3","2+2=4","2+3=5","2+4=6","2+5=7","2+6=8","2+7=9","2+8=10","2+9=11",
"3+1=4","3+2=5","3+3=6","3+4=7","3+5=8","3+6=9","3+7=10","3+8=11","3+9=12",
"4+1=5","4+2=6","4+3=7","4+4=8","4+5=9","4+6=10","4+7=11","4+8=12","4+9=13",
"5+1=6","5+2=7","5+3=8","5+4=9","5+5=10","5+6=11","5+7=12","5+8=13","5+9=14",
"6+1=7","6+2=8","6+3=9","6+4=10","6+5=11","6+6=12","6+7=13","6+8=14","6+9=15",
"7+1=8","7+2=9","7+3=10","7+4=11","7+5=12","7+6=13","7+7=14","7+8=15","7+9=16",
"8+1=9","8+2=10","8+3=11","8+4=12","8+5=13","8+6=14","8+7=15","8+8=16","8+9=17",
"9+1=10","9+2=11","9+3=12","9+4=13","9+5=14","9+6=15","9+7=16","9+8=17","9+9=18",

でも、普通はdotimesマクロを使ってこう書くんでしょうか。

(dotimes (i 9)
  (dotimes (j 9)
    (let ((x (+ i 1)) (y (+ j 1)))
      (format #t "\"~s+~s=~s\"," x y (+ x y))))
  (newline))
(newline)

追記:

Gaucheの父、shiroさんからSRFI 42: Eager Comprehensionsを教えていただきました。ありがとうございます。ちなみにeagerはlazyの逆なのですね。

(use srfi-42)
(do-ec (: x 1 10) (: y 1 10) (format #t "~a+~a=~a," x y (+ x y)))

[]HTML Help HTML Help - 結城浩のSICP日記 を含むブックマーク

ひげぽんさん、ありがとうございます。

higeponhigepon2006/05/12 21:39いえいえ。
もともとGaucheはリファレンスが充実しているところが素晴らしいですね。

shiroshiro2006/05/13 17:36ごく単純なループでは確かに再帰は冗長に見えますね。srfi-42を使うとこう書けます。
(use srfi-42)
(do-ec (: x 1 10) (: y 1 10) (format #t "~a+~a=~a," x y (+ x y)))

トラックバック - http://sicp.g.hatena.ne.jp/hyuki/20060513