2010/03/17

named let

相変わらず末尾再帰が苦手です。困ったときはfold, fold, fold。でもfoldだってなんでもできるわけじゃないですよね。
Twitter / いわた: fold「オレにだって……できないことぐらい…ある…」
そしてこれ↓を知らなかった事実。
;; named let構文
    (let name ((var expr)
               ...)
        body ...)

    ;; これは次のコードと等価
    (letrec ((name (lambda (var ...)
                      body ...)
             ))
      (name expr ...))

ちょいと試しに・・・
fold
; fold
(define (my-reverse ls)
(fold cons '() ls))
(my-reverse '(1 2 3 4 5))
; -> (5 4 3 2 1)
view raw fold.scm hosted with ❤ by GitHub

letrec
; letrecc
(define (my-reverse ls)
(letrec ((r (lambda (l acc)
(if (null? l)
acc
(r (cdr l)
(cons (car l) acc))))))
(r ls '())))
(my-reverse '(1 2 3 4 5))
; -> (5 4 3 2 1)
view raw letrec.scm hosted with ❤ by GitHub

named let
; named let
(define (my-reverse ls)
(let loop ((l ls)
(acc '()))
(if (null? l)
acc
(loop (cdr l)
(cons (car l) acc)))))
(my-reverse '(1 2 3 4 5))
view raw namedlet.scm hosted with ❤ by GitHub

The Seasoned Schemer

0 件のコメント:

コメントを投稿