問題タブ [lazy-sequences]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
491 参照

scheme - 素数を生成する際の「アプリケーション:プロシージャではない」

最初の100個の素数を出力しようとしていますが、エラーが発生し続けます。

アプリケーション:手順ではありません。与えられた引数に適用できるプロシージャが必要です:(#)引数...:[なし]

エラーは、ここのtake$プロシージャに表示されます。

ここにすべての私のコードがあります:

あなたが提供できるどんな助けにも感謝します。

0 投票する
3 に答える
364 参照

stream - 2つの値を交互に

私はコードを持っています

結果は1,2,3.です。1,2,1,2,1,2。を取るように変更するにはどうすればよいですか。

私はfの中で短所を試しましたが、うまくいきませんでした。何か案は?

0 投票する
1 に答える
302 参照

stream - ストリーム内の再帰

私はコードを持っています

sは力のような流れである可能性があります

私の機能

'(2 4 8 16 32)を与えます。

ここで、ストリームパワーを取得して別のストリームを提供できるストリーム(add-ten)を定義したいので、それを呼び出すと

'((10.2)(10. 4)(10. 8)(10. 16)(10. 32))を与えます。

0 投票する
1 に答える
1955 参照

file-io - line-seq が clojure.lang.LazySeq ではなく clojure.lang.Cons を返すのはなぜですか?

line-seq の ClojureDocs エントリ ( http://clojuredocs.org/clojure_core/clojure.core/line-seq ) と Stack の質問 ( In Clojure 1.3, How to read and write a file ) に対する受け入れられた回答によると、 java.io.BufferedReader が渡された場合、line-seq は遅延 seq を返す必要があります。

しかし、これを REPL でテストすると、タイプは clojure.lang.Cons としてリストされます。以下のコードを参照してください。

lazy-seq 呼び出しで line-seq 呼び出しをラップすると、lazy seq が得られますが、ドキュメントによると、これは必要ないはずです: とにかく line-seq は lazy seq を返す必要があります。

注: REPL (私は nrepl を使用しています) 内では、レイジー seq が完全に実現されているように見えます。ただし、Speclj でテストすると同じ問題が発生します。さらに、怠惰な seq を実現することは、とにかく何が起こっているのかと関係があるとは思いません。

編集:私は、コンスの末尾に怠惰なseqがあるとmobyteの回答が言った後、ソースコードをチェックしに行きました...

この cons の呼び出しは、line-seq の戻り値の型が clojure.lang.Cons である理由を説明します。

0 投票する
2 に答える
364 参照

matrix - smalltalk の遅延リスト s 式行列

そのため、LazyMatrix という名前の smalltalk で作成するクラスがあります。このクラスにはインスタンス変数が 1 つしかなく、Object 以外のサブクラスになることはできません。LazyMatrix のインスタンス変数はブロックと呼ばれ、バックでなければなりません。LazyMatrix を次のように初期化します。

値を設定する方法があります

このメソッドは、新しいブロックを [#(ij value).[nil]] として設定することにより、ブロックを再定義します。後続の各呼び出しでは、ブロックに 3 の配列が追加されるため、[#(ij 値).[#(ij 値).[nil]]] のように展開され、s 式または「遅延リスト」によく似ています。

したがって、このブロックの先頭 (つまり [#(ij value) ) とこのブロックの末尾 (つまり [#(ij value).[nil]] ) にアクセスする必要があります。これを smalltalk で行うにはどうすればよいですか? ブロックで value を呼び出すと末尾が返されることはわかっています...今度は先頭を返す必要があります。

0 投票する
2 に答える
1708 参照

clojure - Clojure でテキスト処理のパフォーマンスを向上させる方法は?

Clojure についてもっと学ぶ方法として、単純なデスクトップ検索エンジンを Clojure で書いています。これまで、私のプログラムのテキスト処理段階でのパフォーマンスは非常に悪かったです。

テキスト処理中に私はしなければなりません:

  • 不要な文字をクリーンアップします。
  • 文字列を小文字に変換します。
  • ドキュメントを分割して単語のリストを取得します。
  • 各単語をドキュメント内の出現箇所に関連付けるマップを作成します。

コードは次のとおりです。

Haskell でこの問題を別の方法で実装したので、次の出力でわかるように両方を比較しました。

Clojure のバージョン:

Haskell バージョン:

Clojure 実装での ( string -> lazy sequence ) 変換がパフォーマンスを低下させていると思います。どうすれば改善できますか?

PS: これらのテストで使用されるすべてのコードとデータは、ここからダウンロードできます。

0 投票する
2 に答える
5929 参照

clojure - Clojure:contains を呼び出す慣用的な方法は? 遅延シーケンスで

LazySeq に要素が含まれているかどうかを判断する慣用的な方法はありますか? Clojure 1.5 の時点で、呼び出すとcontains?IllegalArgumentException がスローされます。

1.5 より前は、私の知る限り、常に false を返していました。

contains?LazySeq の呼び出しは無限になる可能性があるため、返されない可能性があることを知っています。しかし、そうではないことがわかっていて、熱心に評価されても気にしない場合はどうなりますか?

私が思いついたのは次のとおりです。

しかし、それはまったく正しくありません。より良い方法はありますか?