2010/03/19

TSS leftmost, let/cc, named-let

let のこんな使い方は驚きました。begin とか progn と同等と考えて良さそうですね。
(let () a b . . .)


コードの方↓は、なんともゴチャゴチャしてしている。

ところで明日は 9LISP

; letcc leftmost
; The Seasoned Schemer
(define leftmost
(lambda (l)
(let/cc skip
(lm l skip))))
(define lm
(lambda (l out)
(cond
((null? l)(quote ()))
((atom? (car l))(out (car l)))
(else (let ()
(lm (car l) out)
(lm (cdr l) out))))))
(leftmost '(((a) b (c))))
; -> a
; again
(define leftmost
(letrec
((lm (lambda (l out)
(cond
((null? l)(quote ()))
((atom? (car l))
(out (car l)))
(else
(let ()
(lm (car l) out)
(lm (cdr l) out)))))))
(lambda (l)
(let/cc skip
(lm l skip)))))
(leftmost '(((a) b (c))))
; again
(define leftmost
(lambda (l)
(letrec
((lm (lambda (l out)
(cond
((null? l)(quote ()))
((atom? (car l))
(out (car l)))
(else
(let ()
(lm (car l) out)
(lm (cdr l) out)))))))
(let/cc skip
(lm l skip)))))
(leftmost '(((a) b (c))))
; again
(define leftmost
(lambda (l)
(let/cc skip
(letrec
((lm (lambda (l out)
(cond
((null? l)(quote ()))
((atom? (car l))
(out (car l)))
(else (let ()
(lm (car l) out)
(lm (cdr l) out)))))))
(lm l skip)))))
(leftmost '(((a) b (c))))
; again
(define leftmost
(lambda (l)
(let/cc skip
(letrec
((lm (lambda (l)
(cond
((null? l)(quote ()))
((atom? (car l))
(skip (car l)))
(else (let ()
(lm (car l))
(lm (cdr l))))))))
(lm l)))))
(leftmost '(((a) b (c))))
(define (leftmost l)
(let/cc skip
(letrec
((lm (lambda (l)
(if (null? l)
'()
(let ((kar (car l)))
(if (list? kar)
(let ()
(lm kar)
(lm (cdr l)))
(skip kar)))))))
(lm l))))
(leftmost '(((a) b (c))))
; named let
(define (leftmost l)
(let/cc skip
(let loop ((l l))
(if (null? l)
'()
(let ((kar (car l)))
(if (list? kar)
(let () ; begin
(loop kar)
(loop (cdr l)))
(skip kar)))))))
(leftmost '(((a) b (c))))
(leftmost '((() (a) b (c)))

The Seasoned SchemerプログラミングGauche

2 件のコメント:

  1. Scheme の begin には面白い特徴があります。
    新しいスコープを作らないのです。

    例えば ↓ こんなコードでエラーが起こりません。
    (begin (define a 1))
    (display a)

    a はトップレベルで定義されたことになります。
    記事中のコードは begin と let のどちらを使っても問題ないと思いますが、同等と考えていると不意につまづくこともあるかもしれません。
    begin のこの性質はマクロを書くときに必要になることがあります。

    返信削除
  2. ご指摘ありがとうございます!
    全然、等価じゃないみたいですね^^;

    返信削除