--- title: lambdaでてきた author: kazu634 date: 2008-07-29 wordtwit_post_info: - 'O:8:"stdClass":13:{s:6:"manual";b:0;s:11:"tweet_times";i:1;s:5:"delay";i:0;s:7:"enabled";i:1;s:10:"separation";s:2:"60";s:7:"version";s:3:"3.7";s:14:"tweet_template";b:0;s:6:"status";i:2;s:6:"result";a:0:{}s:13:"tweet_counter";i:2;s:13:"tweet_log_ids";a:1:{i:0;i:4171;}s:9:"hash_tags";a:0:{}s:8:"accounts";a:1:{i:0;s:7:"kazu634";}}' categories: - gauche - Lisp ---

asin:4873113482:titlde]で勉強してる。

lambdaでてきた

(define (length lis)
(fold (lambda (a b) (+ b 1))  lis))

無名の手続きを定義できる…らしい。まだよくわかっていない。

for-eachをつかう

gosh> (for-each (lambda (x) (print "> " x)) '(a b c))
> a
> b
> c
#<undef>

他の言語では構文になっているものがSchemeでは手続きfor-eachとして提供されているのは、手続きにしておくことでfor-eachそのものを別の「手続きをとる手続き」に渡すことができるからです。

例を見せられて、腑に落ちた。こんなのありなんだ。

;; (if (list? elt) ... )は
;; treeが'((1 2 3) (4 5 6))みたいなとき
;; を念頭に置いているよ。
(define (tree-walk proc tree)
(for-each (lambda (elt)
(if (list? elt)
(tree-walk proc elt)
(proc elt)))
tree))

procにprintを入れるなんてありなんですね。そうですね。

次は66ページから。

プログラミングGauche

プログラミングGauche