読めるし分かるのですが、書けません・・・。
call/ccはわかりませんorz
「再帰結果を束縛」というのは、文字通りの意味でなく、先に底まで再帰して底から戻ってくるときに分岐を行なう、ということで良いんでしょうか。
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
; 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)))))) |
0 件のコメント:
コメントを投稿