2010/08/04

「LISPにはscanlに該当する関数ってあるんでしょうか?」

指名ktkr!!力不足ですが、せっかくですので。
ところで、LISPにはscanlに該当する関数ってあるんでしょうか? > valvallowさん
正直わかりません、知りません、すみません。。Haskell 読めませんが、fold っぽいですね。取りあえず確認がてら同じようなものをでっち上げてみます。遅延評価でもなく Gauche 依存ですけれども。以下コード。

非常にカッコ悪いですね・・・。なんでこんなに難しそうになるわけ・・・。


素直に named-let で書いた方がよかったみたいです。


きっと R5RS の範囲の Scheme にはないんじゃないでしょうか。たぶん R6RS にも。srfi か Common Lisp にはあるかも?教えてエロい人!

追記

そうか。fold2 で書くにしても、こうすれば receive 取れて少しマシか。


追記2

毎度のことながら教えていただきました!
@valvallow (use gauche.collection)(define (scanl f x xs)(values-ref (map-accum (^(a acc)(let1 z (f a acc) (values z z))) x xs) 0))
なるほど、map-accum ですかー!ちょっと写経。

values-ref ってのもあるのか。


追記3

Clojure で書いてる人がいらっしゃる。

追記4

遅延評価だとこんな感じ?いや、良くわかりませんが・・・。


追記5

また教えていただきました!ですが、マニュアル見ても iterator->stream がよくわかりません。。
@valvallow (use srfi-1)(use util.stream)(define(scanl f x xs)(iterator->stream(lambda(n e)(until(null? xs)(n x)(set! x(f x(pop! xs))))(e))))
せっかくなので、インデント付けて gist に貼っつけました。


プログラミングGauche

0 件のコメント:

コメントを投稿