2010/02/11

TSS sum-of-prefixes

The Seasoned Schemer
TSS =The Seasoned Schemer ということで。
sum-of-prefixes は (2 1 9 17 0) を渡すと (2 3 12 29 29) が返ってくる。(1 1 1 1 1) を渡すと (1 2 3 4 5) が返ってくる。そんな手続き。

;; sum-of-prefixes
; (2 1 9 17 0) -> (2 3 12 29 29)
; (1 1 1 1 1) -> (1 2 3 4 5)
; letrec
(define sum-of-prefixes
  (lambda (tup)
    (letrec ((f (lambda (t p)
                  (if (null? t)
                      '()
                      (let ((v (+ (car t) p)))
                        (cons v
                              (f (cdr t) v)))))))
      (f tup 0))))
; fold
(define sum-of-prefixes
  (lambda (tup)
    (reverse (fold (lambda (e r)
                     (cons (+ e (if (null? r)
                                    0
                                    (car r)))
                           r))
                   '()
                   tup))))
; pair-fold
(use srfi-1)
(define sum-of-prefixes
  (lambda (tup)
    (reverse (pair-fold (lambda (rest ret)
                          (cons (+ (car rest)
                                   (if (null? ret)
                                       0
                                       (car ret)))
                                ret))
                        '()
                        tup))))
(define sum-of-prefixes-b
  (lambda (sonssf tup)
    (if (null? tup)
        '()
        (let ((a (+ sonssf (car tup))))
          (cons a (sum-of-prefixes-b a (cdr tup)))))))
(define sum-of-prefixes
  (lambda (tup)
    (sum-of-prefixes-b 0 tup)))
(sum-of-prefixes '(2 1 9 17 0))
; -> (2 3 12 29 29)
(sum-of-prefixes '(1 1 1 1 1))
; -> (1 2 3 4 5)






余談

まだ let も letrec も出てきてないし、ネストした define も出てきてない。そういえば letrec は 「Y combinator の代用」みたいな登場の仕方だったような・・・。

もう一つ手続きが必要な時は別途-bを付加した手続きを定義するスタイルの様子。↑の sum-of-prefixes-b みたいな。

The Little Schemer でも The Seasoned Schemer でも問題をそのまま1対1で変換したようなコード。
自分なりに書いてみるも、なかなかスッキリ書けない。

こういう小粒問題をどこかに集めたいなー。9LISPとかで使えるように。どこにどうやって集めたら良いかなー。


ところでgitgist便利だなー。


さらに余談
私が Gauche や Scheme, Common Lisp をやる目的ってなんだろう。
  1. Gauche をバリバリ書けるようになりたい。
  2. 仕事に使う。
  3. 作りたいものがある。
  4. Lisp / Scheme を極めたい。
どれも当てはまらない。4は無理。1,2,3も別に・・・。ニートだし。
ちょっと考えてみたけど、何か明確な目的ってない。

やっぱりポチポチ書いて「お、動くなー。」とか「うわ、これすげー。」とか「何これ、意味わがんね。どうなってんだ。」ってやるのが楽しいからかな。「悟り体験したい」でFA?そうなるとやっぱCLのマクロか・・・。別にそれだけじゃないか。


というか別に理由を探る理由もないか。

The Little Schemer, 4th EditionThe Seasoned Schemer

0 件のコメント:

コメントを投稿