2010/04/13

LOL tree-leaves

これはtree-leaves%%までで十分だと思いましたが、どうなんでしょう。
予測できる使い方の範囲では、これが最も直感的で贅肉のない方法だと思う。
らしい。個人的には、むしろ直感的でなくなっているように思いますが・・・。
;; tree-leaves
;; LOL 4.3 P.103~
(use srfi-1)
(define (tree-leaves% tree result)
(fold-right (lambda (e acc)
(cons (cond
((null? e) e)
((list? e) (tree-leaves% e result))
(else result))
acc))
'() tree))
(tree-leaves% '(2 () #t (a . b)) 'leaf)
; -> (leaf () leaf leaf)
(define (tree-leaves%% tree test result)
(fold-right (lambda (e acc)
(cons (cond
((null? e) e)
((list? e) (tree-leaves%% e test result))
((test e) (result e))
(else e))
acc))
'() tree))
(tree-leaves%% '(1 2 (3 4 (5 6)))
(lambda (x)
(and (number? x)(even? x)))
(lambda (x)
'even-number))
; -> (1 even-number (3 even-number (5 even-number)))
(define-macro (tree-leaves tree test result)
`(tree-leaves%% ,tree
(lambda (x)
,test)
(lambda (x)
,result)))
(tree-leaves '(1 2 (3 4 (5 6)))
(and (number? x) (even? x))
'even-number)
; -> (1 even-number (3 even-number (5 even-number)))
view raw tree-leaves.scm hosted with ❤ by GitHub


ところで、Gaucheで書くにあたり、何の気なしにfold-rightで書きましたが、これだとLOLに書かれているようなドットリストではうまくいきませんね。
fold-rightは関係ないですね。

このtree-leavesのところで「アナフォラ」という単語が出てきました。アナフォリックマクロ楽しみです。


LET OVER LAMBDA Edition 1.0

0 件のコメント:

コメントを投稿