黄金四角形と黄金螺旋に興味があったので、つい買ってしまいました。
ちなみに黄金比に興味を持ったのは、SBRを読んだためです。
あと TOKYO STYLE (ちくま文庫) も買いました。
実はこれも以前から欲しいと思っていたものです。
コンビニとかによく置いてある「部屋がたくさん載ってる本」もついつい買ってしまいます。
listの中に指定した要素が入ってるかどうかっていうあれです。
letrec の使われ方が微妙に新鮮だったりする。
使われ方というか位置というか。
; member? | |
; The Little Schemer | |
(define member? | |
(lambda (a lat) | |
(cond ((null? lat) #f) | |
((eq? a (car lat)) #t) | |
(else (member? a (cdr lat)))))) | |
(member? 'b '(a b c)) | |
(member? 'd '(a b c)) | |
(define member? | |
(lambda (a lat) | |
(cond ((or (null? lat) | |
(not (eq? a (car lat)))) #f) | |
(else (member? a (cdr lat)))))) | |
(member? 3 '(1 2 3 4 5)) | |
(member? 6 '(1 2 3 4 5)) | |
; and or | |
(define (member? a lat) | |
(and (not (null? lat)) | |
(or (eq? a (car lat)) | |
(member? a (cdr lat))))) | |
(member? 'c '(a b c d e f)) | |
(member? 1 '(a b c d e f)) | |
; any | |
(use srfi-1) | |
(define (member? a lat) | |
(any (lambda (e) | |
(eq? e a)) | |
lat)) | |
(member? 'a '(a b c)) | |
(member? 'd '(a b c)) | |
; The Seasoned Schemer | |
(define member? | |
(lambda (a lat) | |
((letrec ((yes? (lambda (l) | |
(cond ((null? l) #f) | |
((eq? a (car l)) #t) | |
(else (yes? (cdr l))))))) | |
yes?) | |
lat))) | |
(member? 'a '(a b c)) | |
(member? 'd '(a b c)) | |
(define member? | |
(lambda (a lat) | |
(letrec ((yes? (lambda (l) | |
(cond ((null? l) #f) | |
((eq? a (car l)) #t) | |
(else (member? a (cdr l))))))) | |
(yes? lat)))) | |
(member? 'a '(a b c)) | |
(member? 'd '(a b c)) | |
(define-syntax letcc |
The Little Schemer, 4th Edition とその続き The Seasoned Schemer は、よく Lisp や Scheme の入門書として紹介されます。
初めての人のためのLISP[増補改訂版] の次あたりに読んでみてはどうでしょうか。
これ↑も読んでみたいのですが、無職でお金がないので購入するか迷ってます。
こういうのって、「読みたい」以前に「全部手元に欲しい・・・」っていう収集欲的なものが働きませんか。
Schemer シリーズと言いつつ、Java と ML を含んでいますが。
The Little Schemer, 4th Edition
car, cdr, cons, cond, eq?, null?, 再帰、高階関数、クロージャ、継続渡し、Y combinator, カリー化、Scheme で作る小さなLisp など。
letrec, let/cc, call/cc, 継続(渡し、呼び出し)、set!, if, scheme で作る Lisp など。
sxml の作者の方が scheme で作った miniKANREN という Prolog ライクな論理型言語について話が進むらしい。マクロも。
A Little Java, A Few Patterns (Language, Speech, & Communication)
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 Edition と A Little Java, A Few Patterns (Language, Speech, & Communication) は訳本があるようですね。絶版みたいですけど。
Scheme(スキーム)手習い―直感で学ぶLisp (COMPUTATION & SOFTWARE SCIENCE)
探せば他にもありそうですね。
The Little Schemer, 4th Edition は元々Little LISPer だったようです。
The Little LISPer: Trade Edition
; multirember -> multirember-f | |
; The Seasoned Schemer | |
(define multirember-f | |
(lambda (test?) | |
(lambda (a lat) | |
(cond ((null? lat) '()) | |
((test? a (car lat))((multirember-f test?) a (cdr lat))) | |
(else (cons (car lat) | |
((multirember-f test?) a (cdr lat)))))))) | |
((multirember-f eq?) 'a '(a b c a b c)) | |
; fold | |
(define (multirember-f test?) | |
(lambda (a lat) | |
(fold (lambda (e l) | |
(if (test? a e) | |
l | |
(cons e l))) | |
'() | |
lat))) | |
((multirember-f eq?) 'a '(a b c a b c)) | |
; 再帰結果は束縛可能 http://beta-reduction.blogspot.com/2010/02/define-multirember-lat-cond-null-lat-eq.html | |
(define (multirember-f test?) | |
(lambda (a lat) | |
(if (null? lat) | |
'() | |
(let ((b (car lat)) | |
(mr ((multirember-f test?) a (cdr lat)))) | |
(if (test? a b) | |
mr | |
(cons b mr)))))) | |
((multirember-f eq?) 'a '(a b c d a b c d)) | |
; letrec multirember-f - The Seasoned Schemer | |
(define multirember-f | |
(lambda (test?) | |
(letrec ((m-f (lambda (a lat) | |
(cond ((null? lat) '()) | |
((test? a (car lat))(m-f a (cdr lat))) | |
(else (cons (car lat) | |
(m-f a (cdr lat)))))))) | |
m-f))) | |
((multirember-f eq?) 1 '(1 2 3 4 5 1 2 3 1 2 3 1 2)) | |
; letrec multirember - The Seasoned Schemer | |
(define multirember | |
(letrec ((multirember | |
(lambda (a lat) | |
(cond ((null? lat) '()) | |
((eq? a (car lat))(multirember a (cdr lat))) | |
(else (cons (car lat) | |
(multirember a (cdr lat)))))))) | |
multirember)) | |
(multirember 'a '(a b a b a b c a)) |
; multirember | |
; How To Become A Hacker: 再帰結果は束縛可能 http://beta-reduction.blogspot.com/2010/02/define-multirember-lat-cond-null-lat-eq.html | |
(define (multirember a lat) | |
(if (null? lat) | |
'() | |
;; (car lat)も二回出てくるんでショートフォームitとして束縛 | |
(let ((it (car lat)) | |
;; 再帰部分もrecurと言う変数に束縛してしまう。 | |
(recur (multirember a (cdr lat)))) | |
(if (eq? a it) ;itの使いまわし | |
recur ;recurの使いまわし | |
(cons it recur))))) ;itとrecurの使いまわし | |
(define (multirember a lat) | |
(if (null? lat) | |
'() | |
(let ((it (car lat)) | |
(recur (multirember a (cdr lat)))) | |
(if (eq? a it) | |
recur | |
(cons it recur))))) | |
(define (multirember a lat) | |
(call/cc | |
(lambda (k) | |
(let ((it (car (if (null? lat) | |
(k '()) | |
lat))) | |
(recur (multirember a (cdr lat)))) | |
(if (eq? a it) | |
recur | |
(cons it recur)))))) |
;; chapter.12 | |
; multirember | |
; standard | |
(define (multirember a lat) | |
(cond ((null? lat) '()) | |
((eq? a (car lat))(multirember a (cdr lat))) | |
(else (cons (car lat) | |
(multirember a (cdr lat)))))) | |
(multirember 'a '(a b c d a b c d)) | |
; fold | |
(define (multirember a lat) | |
(fold (lambda (e l) | |
(if (eq? a e) | |
l | |
(cons e l))) | |
'() | |
lat)) | |
(multirember 1 '(1 2 3 1 2 3 1 2 3)) | |
; filter | |
(use srfi-1) | |
(define (multirember a lat) | |
(filter (lambda (e) | |
(not (eq? a e))) | |
lat)) | |
(multirember 'a '(a b c a b c)) | |
; the seasoned schemer | |
; y combinator | |
(define Y | |
(lambda (f) | |
((lambda (g) | |
(g g)) | |
(lambda (h) | |
(f (lambda (x) | |
((h h) x))))))) | |
((Y (lambda (f) | |
(lambda (n) | |
(if (zero? n) | |
1 | |
(* n (f (- n 1))))))) 5) | |
(define multirember | |
(lambda (a lat) | |
((Y (lambda (mr) | |
(lambda (lat) | |
(cond ((null? lat) '()) | |
((eq? a (car lat))(mr (cdr lat))) | |
(else (cons (car lat) | |
(mr (cdr lat)))))))) | |
lat))) | |
(multirember 'a '(a b c a b c a b c)) | |
(define multirember | |
(lambda (a lat) | |
(((lambda (f) | |
((lambda (g) | |
(g g)) | |
(lambda (h) | |
(f (lambda (x) | |
((h h) x)))))) | |
(lambda (mr) | |
(lambda (lat) | |
(cond ((null? lat) '()) | |
((eq? a (car lat))(mr (cdr lat))) | |
(else (cons (car lat) | |
(mr (cdr lat)))))))) | |
lat))) | |
(multirember 1 '(1 2 1 2 1 2 3)) | |
;; length | |
(define add1 | |
(lambda (n) | |
(+ n 1))) | |
;; (define length 'hoge) | |
;; (display length) | |
;; (define length | |
;; (with-module gauche length)) | |
(define length | |
(Y (lambda (length) | |
(lambda (l) | |
(cond ((null? l) 0) | |
(else (add1 (length (cdr l))))))))) | |
(length '(1 2 3)) | |
; letrec | |
(define multirember | |
(lambda (a lat) | |
(letrec ((mr (lambda (l) | |
(cond ((null? l) '()) | |
((eq? a (car l))(mr (cdr l))) | |
(else (cons (car l) | |
(mr (cdr l)))))))) | |
(mr lat)))) | |
(multirember 'a '(a b a b a b c a)) |
なんと言えば良いのかわかりません・・・。「hogeに束縛されているlengthを組み込みのものに戻す」、とか?
とにかく、(define length 'hoge)とかしちゃったのを、元のlengthに戻したい時。
(define length
(with-module gauche length))
1 初めての人のためのLisp 2 CARとCDRで世間を渡れば権兵衛もたじろぐ 3 解釈は評価なり・・・辞書なくして世は渡れず 4 基本関数を修了するや突然関数定義 なんと大それた・・・ 5 今度はcond再帰と再起を混同せぬように 6 またも再帰するから再帰なのだ 7 Gogogo・・・dododo・・・looplooploop・・・ やっぱりOは丸い 8 Lispの御本尊のお出まし 9 デートの前にリストの切り貼り 10 変態プログラム 11 シンボルを人前に曝す 12 ガールフレンドも買い物も関数引数でOK 13 Lispの解剖 その1 14 入出力がなければプログラムは生きていけぬ 15 Lispの解剖 とんでその2 16 大団円 対話性に関する対話 17 付録 Lispのまとめ
(目次:株式会社サイエンス社 株式会社新世社 株式会社数理工学社)
Lispの勉強会を名乗っていますが、Common Lisp ではなく Scheme の学習を進めています。Common Lisp はその後の予定。
隔週の土曜日、午前10時から行なっています。毎回、勉強 → ランチ → 雑談 という流れです。
今回の参加者は4人と少な目でした。しかし、今回は遠隔地からskypeで@cametan_001さんに参加頂き、いつもと違った面白さがありました。
あと Google wave すげー!リアルタイムコード共有的な意味で。
前回は「Schemeで高階関数を書いてみよう」ということで、リストから要素を取り除くrember手続きを書き、段階を追ってsrfi-1のfilter相当の高階関数rember-fに書き換えていく、というようなことをやりました。リストに要素を加えるinsertR, insertL, insert-g(高階関数)も。
rember は The Little Schemer に出てくるもので、Remove Member ということで良いかと思います。insertR, L, -g も同じく The Little Schemer に出てきます。
今回は、
というようなことがありました。
1はともかく、2は放置、3はループしかないかな?ということでした。
ところでsrfiって「サーフィ」って読むんですね。まんまと「えすあーるえふあい」って読んでました。
010からustreamとskypeでオンライン中継を行なうことにしました。
skypeの方、当初「9lisp」とATNDに書いてました。正しくは「qlisp」です。9lispで探された方、申し訳ありませんでしたorz
マイクが私の端末にしかなく、中継は終始グダグダになってしまいました。別途マイクを用意しようと思います。(次回準備できるかわかりませんが・・・)
グダグダな中継に付き合って下さった方々、ありがとうございました。
また次回からも行ないますので、気が向いたらのぞいてみてください。
@finalfusion さんに本を頂きました。
ありがとうございます!
頂いたのは以下の本です。
アドレナリンジャンキー プロジェクトの現在と未来を映す86パターン
入門Common Lisp―関数型4つの特徴とλ(ラムダ)計算
実は先月10日が誕生日だったのですが、その時も↓の2冊を頂ました!
ありがとうございます!
全体最適の問題解決入門―「木を見て森も見る」思考プロセスを身につけよう!
先日は熊本県立図書館から7冊頂きました。
ニートになった私は以前ほど気軽に本が買えなくなったので、ものすごくありがたいです。
しつこいようですが、@finalfusion さんありがとうございました!
(use srfi-1)(define (collatz n) (unfold (lambda (s) (= s 1)) (lambda (s) s) (lambda (s) (cond ((even? s)(/ s 2)) ((odd? s)(+ (* s 3) 1)) (else s))) n (lambda (s) (cons s '()))))(collatz 10); -> (10 5 16 8 4 2 1)
(use srfi-1)(define (collatz n) (let ((stop (lambda (s) (= s 1))) (term (lambda (s) (cond ((even? s)(/ s 2)) ((odd? s)(+ (* s 3) 1)) (else s))))) (unfold stop (lambda (s) (let ((v (term s))) (if (stop v) s (cons s (collatz v))))) term n (lambda (s) (cons s '())))))(collatz 3); -> ((3 (10 (5 (16 (8 (4 2 1) 2 1) (4 2 1) 2 1) (8 (4 2 1) 2 1) (4 2 1) 2 1) (16 (8 (4 2 1) 2 1) (4 2 1) 2 1) (8 (4 2 1) 2 1) (4 2 1) 2 1) (5 (16 (8 (4 2 1) 2 1) (4 2 1) 2 1) (8 (4 2 1) 2 1) (4 2 1) 2 1) (16 (8 (4 2 1) 2 1) (4 2 1) 2 1) (8 (4 2 1) 2 1) (4 2 1) 2 1) (10 (5 (16 (8 (4 2 1) 2 1) (4 2 1) 2 1) (8 (4 2 1) 2 1) (4 2 1) 2 1) (16 (8 (4 2 1) 2 1) (4 2 1) 2 1) (8 (4 2 1) 2 1) (4 2 1) 2 1) (5 (16 (8 (4 2 1) 2 1) (4 2 1) 2 1) (8 (4 2 1) 2 1) (4 2 1) 2 1) (16 (8 (4 2 1) 2 1) (4 2 1) 2 1) (8 (4 2 1) 2 1) (4 2 1) 2 1);; ((3;; (10;; (5;; (16;; (8;; (4 2 1) 2 1);; (4 2 1) 2 1);; (8;; (4 2 1) 2 1);; (4 2 1) 2 1);; (16;; (8;; (4 2 1) 2 1);; (4 2 1) 2 1);; (8;; (4 2 1) 2 1);; (4 2 1) 2 1);; (5;; (16;; (8;; (4 2 1) 2 1);; (4 2 1) 2 1);; (8;; (4 2 1) 2 1);; (4 2 1) 2 1);; (16;; (8;; (4 2 1) 2 1);; (4 2 1) 2 1);; (8;; (4 2 1) 2 1);; (4 2 1) 2 1);; (10;; (5;; (16;; (8;; (4 2 1) 2 1);; (4 2 1) 2 1);; (8;; (4 2 1) 2 1);; (4 2 1) 2 1);; (16;; (8;; (4 2 1) 2 1);; (4 2 1) 2 1);; (8;; (4 2 1) 2 1);; (4 2 1) 2 1);; (5;; (16;; (8;; (4 2 1) 2 1);; (4 2 1) 2 1);; (8;; (4 2 1) 2 1);; (4 2 1) 2 1);; (16;; (8;; (4 2 1) 2 1);; (4 2 1) 2 1);; (8;; (4 2 1) 2 1);; (4 2 1) 2 1)
(define (collatz n) (cond ((= n 1) n) ((even? n)(collatz (/ n 2))) ((odd? n)(collatz (+ (* n 3) 1))) (else n)))(collatz 10); -> 1(define (collatz n col) (cond ((= n 1)(cons n col)) ((even? n)(collatz (/ n 2)(cons n col))) ((odd? n)(collatz (+ (* n 3) 1)(cons n col))) (else col)))(collatz 10 '()); -> (1 2 4 8 16 5 10);; (unfold p f g seed tail-gen);; (if (p seed);; (tail-gen seed);; (cons (f seed);; (unfold p f g (g seed))))(use srfi-1)(define (collatz n) (unfold (lambda (s) (= s 1)) (lambda (s) s) (lambda (s) (cond ((even? s)(/ s 2)) ((odd? s)(+ (* s 3) 1)) (else s))) n (lambda (s) (cons s '()))))(collatz 10); -> (10 5 16 8 4 2 1)(use srfi-1)(define (collatz n) (let ((stop (lambda (s) (= s 1))) (term (lambda (s) (cond ((even? s)(/ s 2)) ((odd? s)(+ (* s 3) 1)) (else s))))) (unfold stop (lambda (s) (let ((v (term s))) (if (stop v) s (cons s (collatz v))))) term n (lambda (s) (cons s '())))))(collatz 3); -> ((3 (10 (5 (16 (8 (4 2 1) 2 1) (4 2 1) 2 1) (8 (4 2 1) 2 1) (4 2 1) 2 1) (16 (8 (4 2 1) 2 1) (4 2 1) 2 1) (8 (4 2 1) 2 1) (4 2 1) 2 1) (5 (16 (8 (4 2 1) 2 1) (4 2 1) 2 1) (8 (4 2 1) 2 1) (4 2 1) 2 1) (16 (8 (4 2 1) 2 1) (4 2 1) 2 1) (8 (4 2 1) 2 1) (4 2 1) 2 1) (10 (5 (16 (8 (4 2 1) 2 1) (4 2 1) 2 1) (8 (4 2 1) 2 1) (4 2 1) 2 1) (16 (8 (4 2 1) 2 1) (4 2 1) 2 1) (8 (4 2 1) 2 1) (4 2 1) 2 1) (5 (16 (8 (4 2 1) 2 1) (4 2 1) 2 1) (8 (4 2 1) 2 1) (4 2 1) 2 1) (16 (8 (4 2 1) 2 1) (4 2 1) 2 1) (8 (4 2 1) 2 1) (4 2 1) 2 1);; ((3;; (10;; (5;; (16;; (8;; (4 2 1) 2 1);; (4 2 1) 2 1);; (8;; (4 2 1) 2 1);; (4 2 1) 2 1);; (16;; (8;; (4 2 1) 2 1);; (4 2 1) 2 1);; (8;; (4 2 1) 2 1);; (4 2 1) 2 1);; (5;; (16;; (8;; (4 2 1) 2 1);; (4 2 1) 2 1);; (8;; (4 2 1) 2 1);; (4 2 1) 2 1);; (16;; (8;; (4 2 1) 2 1);; (4 2 1) 2 1);; (8;; (4 2 1) 2 1);; (4 2 1) 2 1);; (10;; (5;; (16;; (8;; (4 2 1) 2 1);; (4 2 1) 2 1);; (8;; (4 2 1) 2 1);; (4 2 1) 2 1);; (16;; (8;; (4 2 1) 2 1);; (4 2 1) 2 1);; (8;; (4 2 1) 2 1);; (4 2 1) 2 1);; (5;; (16;; (8;; (4 2 1) 2 1);; (4 2 1) 2 1);; (8;; (4 2 1) 2 1);; (4 2 1) 2 1);; (16;; (8;; (4 2 1) 2 1);; (4 2 1) 2 1);; (8;; (4 2 1) 2 1);; (4 2 1) 2 1)(for-each (lambda (e) (display e) (newline)) (collatz 3))
みんな大好きラムダ計算。ラムだけ遺産。裸無駄ぁ。スlambdaンク!
昨日ついったーで、計算論 計算可能性とラムダ計算の話が出ました。難しいよねーと。
とっつきやすい本や資料はないかなー。
googleだと大学の授業の資料などが、たくさんヒットしますね。
以前amazonのレビューを読んでこの本を購入しました。
計算論 計算可能性とラムダ計算 (コンピュータサイエンス大学講座)
私個人の感想は「難解・・・」。
同じ頃、ここ↓で見かけた論理と計算のしくみという本が気になります。