予測できる使い方の範囲では、これが最も直感的で贅肉のない方法だと思う。らしい。個人的には、むしろ直感的でなくなっているように思いますが・・・。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
;; 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))) |
ところで、Gaucheで書くにあたり、何の気なしにfold-rightで書きましたが、これだとLOLに書かれているようなドットリストではうまくいきませんね。
このtree-leavesのところで「アナフォラ」という単語が出てきました。アナフォリックマクロ楽しみです。
0 件のコメント:
コメントを投稿