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とかで使えるように。どこにどうやって集めたら良いかなー。
ところでgitもgist便利だなー。
さらに余談
私が Gauche や Scheme, Common Lisp をやる目的ってなんだろう。
- Gauche をバリバリ書けるようになりたい。
- 仕事に使う。
- 作りたいものがある。
- Lisp / Scheme を極めたい。
ちょっと考えてみたけど、何か明確な目的ってない。
やっぱりポチポチ書いて「お、動くなー。」とか「うわ、これすげー。」とか「何これ、意味わがんね。どうなってんだ。」ってやるのが楽しいからかな。「悟り体験したい」でFA?そうなるとやっぱCLのマクロか・・・。別にそれだけじゃないか。
というか別に理由を探る理由もないか。
0 件のコメント:
コメントを投稿