ラベル The Little Schemer の投稿を表示しています。 すべての投稿を表示
ラベル The Little Schemer の投稿を表示しています。 すべての投稿を表示

2010/10/06

新しい「Scheme手習い」amazonに並んだっぽい!

Scheme手習い


絶版になった旧版の方、高けぇ(笑)表紙はどんなのだったんだろう。

追記


原書はこちら。
The Little Schemer, 4th Edition

2010/04/29

TSS TLS atom?

無駄に複雑に書き直した話。

The Little Schemer, 4th Edition と The Seasoned Schemer に出てくる、atom?手続き。


上が本の序文に記載されているもので、下が書き直したもの。
The Little Schemer, 4th EditionThe Seasoned Schemer

2010/03/28

member?, let/cc

こういうのもありかな。

The Little Schemer, 4th EditionThe Seasoned Schemer

また出てきたYコンビネータ。Y!。

また出てきました。今度はThe Seasoned Schemerに。The Little Schemerでも9章で出てきました。理解できなくて散々書きました。
Yコンビネータは、いろんなサイトや解説記事を読みましたが、結局The Little Schemerが一番わかりやすかったです。The Seasoned SchemerではY!が出てきます。「!」ということで、副作用ありです。side effectです。その名もY-bang。ワイバーンみたい。
The Little SchemerThe Seasoned Schemer合わせて20章のうちで、初めて副作用が出てくるのが15章です。ここまで代入などを使わずにきて、急に使うことになるとさすがに気持ち悪く感じますね。

ちなみにY!が出てくるのは16章です。
Thunk you, Peter J. Landin.
だそうです。
1
2
3
4
5
6
7
8
9
10
11
12
(define Y!
 (lambda (L)
  (let ((h (lambda (l)(quote ()))))
   (set! h
    (L (lambda (arg)(h arg))))
   h)))

(define Y-bang
 (lambda (f)
  (letrec
   ((h (f (lambda (arg)(h arg)))))
   h)))
あれ、でも下のY-bangは副作用あるか?

そういえば、Yコンビネータはこれを見たときに、理解のきっかけになりました。
1
2
3
4
5
6
7
((lambda (f) 
   (f f 10)) 
 (lambda (f n) 
   (cond 
    ((< 0 n) 
     (print "hello") 
     (f f (- n 1))))))


2010/02/24

Schemerシリーズ 5つ + α

The Little Schemer, 4th Edition とその続き The Seasoned Schemer は、よく Lisp や Scheme の入門書として紹介されます。

初めての人のためのLISP[増補改訂版] の次あたりに読んでみてはどうでしょうか。

これ↑も読んでみたいのですが、無職でお金がないので購入するか迷ってます。

こういうのって、「読みたい」以前に「全部手元に欲しい・・・」っていう収集欲的なものが働きませんか。

 

Schemer シリーズ

Schemer シリーズと言いつつ、Java と ML を含んでいますが。

The Little Schemer, 4th Edition The Little Schemer, 4th Edition

car, cdr, cons, cond, eq?, null?, 再帰、高階関数、クロージャ、継続渡し、Y combinator, カリー化、Scheme で作る小さなLisp など。

The Seasoned Schemer The Seasoned Schemer

letrec, let/cc, call/cc, 継続(渡し、呼び出し)、set!, if, scheme で作る Lisp など。

The Reasoned Schemer The Reasoned Schemer

sxml の作者の方が scheme で作った miniKANREN という Prolog ライクな論理型言語について話が進むらしい。マクロも。

A Little Java, A Few Patterns (Language, Speech, & Communication) A Little Java, A Few Patterns (Language, Speech, & Communication)

The Little MLer The Little MLer

 

Java のと ML のは持ってないので よく知りませんが、読んでみたいです。

ML といえば Caml , Ocaml, F# ですよね。

 

サンプルとエクササイズ

The Little Schemer, 4th Edition の9章が、The Seasoned Schemer は13章がサンプルとして公開されているようです。

 

PostScript ファイルなので viewer がない方はこちら。

Google Books では The Reasoned Schemer は読めないみたいですね。

 

訳本

The Little Schemer, 4th EditionA Little Java, A Few Patterns (Language, Speech, & Communication) は訳本があるようですね。絶版みたいですけど。

Scheme(スキーム)手習い―直感で学ぶLisp (COMPUTATION & SOFTWARE SCIENCE) Scheme(スキーム)手習い―直感で学ぶLisp (COMPUTATION & SOFTWARE SCIENCE)

Javaとピザとデザインパターン Javaとピザとデザインパターン

 

 

Erlang, JavaScript, Ruby ・・・

探せば他にもありそうですね。

 

その他

The Little Schemer, 4th Edition は元々Little LISPer だったようです。

Little LISPer (3rd Edition) Little LISPer (3rd Edition)

The Little LISPer: Trade Edition The Little LISPer: Trade Edition

Little LISPer Little LISPer

The Little Lisper The Little Lisper

Little Lisper 13-7005 05 Little Lisper 13-7005 05

 

関連

2010/02/09

member?

The Little Schemer のmember?
(define member?
  (lambda (a lat)
    (cond ((null? lat) #f)
          ((eq? a (car lat)) #t)
          (else (member? a (cdr lat))))))
The Little Schemer のmember? その2
(define member?
  (lambda (a lat)
    (cond ((null? lat) #f)
          (else (or (eq? a (car lat))
                    (member? a (cdr lat)))))))
もっとすっきり書くには?
(define member?
  (lambda (a lat)
    (eq? a (find (lambda (e)
                   (eq? a e)) lat))))
こんな感じか?
(define member?
  (lambda (a lat)
    (any (lambda (e)
           (eq? a e)) lat)))
Scheme手習い

2010/02/08

9LISP - 009

9LISP の 009 回目を開催してきました。

午前中は9LISP、午後はKPFの第五回という楽しい一日でした。
内容はshunsukさんのこちらの記事をどうぞ。
9LISP では引き続きThe Little Schemerをテキストとして使用しています。
今回からはテキストを頭から順に進めていくスタイルを止めて、下記ポイントに絞って進めていくことになりました。
The Little Schemerでは末尾再帰とマクロについては扱われていませんし、継続渡しスタイル(CPS)の例も複雑で、正直わかりづらいです。
この辺はまたそのうち検討するということで。

継続についてはThe Little Schemerの続きであるThe Seasoned Schemerでページを割いてあるのでそちらも検討してみます。

今回は高階関数の例題を書いてみよー!ということでやってみました。
9LISP の参加者には高階関数やクロージャってなんぞ?な人から、息をするように使う人までいろんな人が参加しています。

高階関数やクロージャというのは、「概念そのものより説明することの方が難しい」という話が前回も出ていました。その点で「値渡しと参照渡し」とか「ポインタ」に似てるよねーと。たぶん継続もそうなんだろうね、ということでした。

ということで、説明うんぬんより実践あるのみということで以下の例題をやりました。
  1. 指定した要素をlistから削除するrember関数を定義する(つまりsrif-1のfilterのような関数)。
  2. list内に要素oldが存在した場合、その隣に要素newを挿入するinsert関数を定義する(挿入位置をパラメータの関数に任せる)。
実際にはまず非高階な関数を定義して、高階関数に書き換えてみる、という手順で進めました。
The Little Schemerの流れと同じです。
rember(非高階)


(define rember
  (lambda (a lat)
    (cond
     ((null? lat) lat)
     ((eq? a (car lat))(cdr lat))
     (else (cons (car lat)
                 (rember a (cdr lat))))))) 
multirember(非高階)

 (define multirember

  (lambda (a lat)
    (cond ((null? lat) lat)
          ((eq? a (car lat)) (multirember a (cdr lat)))
          (else (cons (car lat)(multirember a (cdr lat)))))))
rember*(非高階)

 (define rember*

  (lambda (a l)
    (cond ((null? l) l)
          ((atom? (car l)) (cond ((eq? a (car l))(rember* a (cdr l)))
                                 (else (cons (car l)(rember* a (cdr l))))))
          (else (cons (rember* a (car l))
                      (rember* a (cdr l)))))))
rember-f(高階)

 (define rember-f

  (lambda (test? a l)
    (cond ((null? l) l)
          ((test? a (car l)) (rember-f test? a (cdr l)))
          (else (cons (car l)
                      (rember-f test? a (cdr l)))))))
rember-f(高階)

 (define rember-f

  (lambda (test?)
    (lambda (a l)
      (cond ((null? l) l)
            ((test? a (car l))((rember-f test?) a (cdr l)))
            (else (cons (car l)
                        ((rember-f test?) a (cdr l))))))))
multirember-f(高階)

 (define multirember-f

  (lambda (test?)
    (lambda (a lat)
      (cond ((null? lat) lat)
            ((test? a (car lat))((multirember-f test?) a (cdr lat)))
            (else (cons (car lat)
                        ((multirember-f test?) a (cdr lat))))))))
というような流れです。2のinsertも同じように。

2のinsertの方は、The Little Schemerでは以下のような解答となっています。

 (define insert-g

  (lambda (seq)
    (lambda (new old l)
      (cond ((null? l) l)
            ((eq? old (car l))(seq new old (cdr l)))
            (else (cons (car l)
                        ((insert-g seq) new old (cdr l))))))))
参加者の方からも「冗長だよねー。」とか「きっともっとスマートに書けるはずだよねー、でもどう書いたらスマートだろう?」というような声がありました。

私もそう思います。ということで、考えて書いてみましたが、こんなんでどうでしょうか。srfi-1のfold-rightを使用しています・・・。


(define insert-g
  (lambda (set-f)
    (lambda (new old lat)
      (fold-right (lambda (e l)
                    (cond ((eq? old e)(set-f new old l))
                          (else (cons e l))))
                  '()
                  lat))))

ところd、foldって言語によってfold, reduce, inject, aggregateというように呼び名が違うらしいですね。

The Little Schemer, 4th EditionThe Seasoned Schemer