2010/03/29

defmacro: or

gensymはgenerate symbolでしょうか。
プログラミングGauche

syntax-rules: if

マクロとは式の変換です。 

プログラミングGauche

syntax-rules: when, unless

define-macroとdefine-syntax。

プログラミングGauche

defmacro: when, unless

実は、マクロについては「プログラミングGauche」をサラッと眺めただけだったりします。

プログラミングGauche

2010/03/28

member?, let/cc

こういうのもありかな。

The Little Schemer, 4th EditionThe Seasoned Schemer

TSS deep

The Seasoned Schemer 16章。

(deep 3)
; -> (((pizza)))

というような手続きを書け、とのこと。無理やり(?)fold-rightなんかで書いてみたり。

続きのdeepR, deepMなど。

The Seasoned Schemer

内包表記

この機構は豊富な操作手続を提供しているので、リストジェネレータとい うだけではなく、ジェネリックなループ構文(Common Lisp の loop マ クロ並みに強力/邪悪だという人もいます)を提供しています。
プログラミングGauche

TSS set!

The Seasoned Schemerの15章になって初めて出てきたset!。set!ってのはこういうのだよーという章。



cond, and, or

1
2
3
4
(and a b)
; -> (cond (a b) (else #f))
(or a b)
; -> (cond (a #t) (else b))
The Little Schemer, 4th Edition

また出てきた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))))))