05/08/10 22:19:54
>>650氏のコードを自分の想定した入力形式に書き換えてみました。
(define (proc arg)
(let loop ((rest arg) (temp '()) (result '()))
(if (null? rest)
(reverse (if (null? temp) result `(,(proc (reverse temp)) ,@result)))
(let ((node (car rest)))
(if (< (car node) 2)
(loop (cdr rest) '()
(if (null? temp)
`(,(cadr node) ,@result)
`(,(cadr node) ,(proc (reverse temp)) ,@result)))
(loop (cdr rest)
`(,(cons (- (car node) 2) (cdr node)) ,@temp) result))))))
(proc '((0 a) (0 b) (2 c) (4 d) (12 dd) (4 e) (2 f) (2 g) (4 h) (6 i) (2 j) (0 k) (2 m)))
=>(a b (c (d ((((dd)))) e) f g (h (i)) j) k (m))
(< (car node) 2)の箇所はインデント幅が奇数だったら小さい側へ切捨てる処置です。