2010/03/19

TSS letting, scramble, fold2

11章に出てきたscrambleをlettingするエクササイズらしい。
foldでは書けないよなー、と思い探してみるとfold2なるものがgauche.collectionにありました。
; letting excersise scramble
(define (pick n lat)
(list-ref lat (- n 1)))
; The Seasoned Schemer
(define scramble
(lambda (tup)
(letrec
((P (lambda (tup rp)
(cond
((null? tup)(quote ()))
(else
(let ((rp (cons (car tup) rp)))
(cons (pick (car tup) rp)
(P (cdr tup) rp))))))))
(P tup (quote ())))))
(define (scramble tup)
(letrec
((P (lambda (tup rp)
(if (null? tup)
'()
(let ((rp (cons (car tup) rp)))
(cons (pick (car tup) rp)
(P (cdr tup) rp)))))))
(P tup '())))
; again
(define (scramble tup)
(letrec
((P (lambda (tup rp)
(if (null? tup)
'()
(let ((kar (car tup)))
(let ((rp (cons kar rp)))
(cons (pick kar rp)
(P (cdr tup) rp))))))))
(P tup '())))
view raw 1-scramble.scm hosted with ❤ by GitHub

; named let
(define (scramble tup)
(let loop ((tup tup)
(rp '()))
(if (null? tup)
'()
(let ((kar (car tup)))
(let ((rp (cons kar rp)))
(cons (pick kar rp)
(loop (cdr tup) rp)))))))
view raw 2-scramble.scm hosted with ❤ by GitHub

reverse格好悪い・・・。
; fold2
(use gauche.collection)
(define (scramble tup)
(reverse
(fold2 (lambda (e acc rp)
(let ((rp (cons e rp)))
(values (cons (list-ref rp (- e 1))
acc)
rp)))
'() '() tup)))
(scramble '(1 2 3 4 5 6 7 8 9))
view raw 3-scramble.scm hosted with ❤ by GitHub


追記


The Seasoned SchemerプログラミングGauche

0 件のコメント:

コメントを投稿