問題タブ [chez-scheme]
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.
scheme - スキーム内の遅延フィルタリングされたリストが大量のメモリを消費するのはなぜですか?
私は現在、スキームのもう少し高度な機能を使用することを学んでおり、遅延リストで障害にぶつかりました。
基本的に、私は無限の遅延生成リストを作成し、それに遅延フィルターを適用して、単一の要素のみを取得しようとしています。私の望みは、これがメモリをほとんど消費しないことでした: フィルタは一度に 1 つの要素だけを調べ、以前のエントリを保存する必要はありません。これが私の試みです:
したがって、明確にするために、ここでの「遅延リスト」は、(force)
d のときに を生成するプロシージャです。これがスキームの「標準的な」怠惰なリストなのかどうかはわかりませんが、私にとって最も理にかなっているのは変種でした。(head . tail)
head
tail
(lazy-arithmetic-sequence a b)
関数は(遅延して)無限リストを生成しますa, a+b, a+2b, a+3b, ...
このlazy-filter
関数は問題の核心です。述語と遅延リストを取り、フィルタリングされたすべての要素を含む遅延リストを返します。強制されると、入力リストを調べて、含める必要がある最初の要素を見つけ、残りのリストの遅延フィルターで処理されたその要素を返します。
これをテストするために、次の行を実行します。
もちろん、これはかなり無意味なフィルター (「このリストで 0 から無限大までの値が 10 億の要素を見つける」) ですが、ポイントはコードをテストすることです。問題は、これが途方もない量のメモリを消費することです。数秒以内に数ギガバイトに達し、速度が低下する兆候は見られません。その理由はわかりません。
ガベージ コレクターがリストから生成されたメモリを再利用しない理由がわかりません。ループインlazy-filter
は末尾再帰であり、レイジーリストへの参照は他にないため、GC はそのメモリをすべてむさぼり食うべきだと思います。レイジー フィルター ループの反復ごとにガベージ コレクターを実行するバージョンも作成しましたが、もちろん役に立ちませんでした。
私の疑いは、私が見ていないリストの先頭にぶら下がっているいくつかの参照があるということです. delay
同様に、 in lazy-filterによって作成されたクロージャーは、どういうわけかseq
参照をハングアップさせているか、何かです。
これを書き直して、無限のメモリを消費しないようにするにはどうすればよいですか?
それが違いを生む場合、私は Chez Scheme を実行していますが、問題はスキームの実装ではなく、私にあると思われます
scheme - この式が 4 に評価されるのはなぜですか (call/cc)
申し訳ありませんが、この単純な継続の例は 4 に評価されますが、その理由がわかりませんでした:
Chez スキーム 9.5.3
scheme - Chez Scheme の SRFI 実装
私は Chez を初めて使用し、さまざまな維持されているリポジトリと維持されていないリポジトリが存在することを考慮して、明確さを求めています。
R6RS SRFI ライブラリ (特に Chez スキーム用) を取得するための一般的に好まれる単一のソース リポジトリはありますか?
個々の SRFI ドキュメントを検索するのに適したhttps://srfi.schemers.org/について知っています。すべてのドキュメントといくつかのスキーム コードの tgz がありますが、tgz にはバージョンまたはリリース情報がありません (ただし、タイムスタンプはかなり最新のhttps://srfi.schemers.org/srfi.tgzであることを示唆しています)。
R6RS の場合、ほとんどの SRFIは次のリポジトリの下に個別のリポジトリとして見つけることができます。これは、すべてのコードを取得するのはあまり現実的ではありません 。
そして、他のさまざまなレポ、たとえば:
https://github.com/arcfide/chez-srfi
https://github.com/ovenpasta/thunderchez
https://github.com/dharmatech/surfage
https://bazaar.launchpad.net/~scheme-libraries-team/scheme-libraries/srfi/files
最近活動しているのは、幸いにも Chez に焦点を当てているようで、chez-srfi と thunderchez だけです。
chez-srfi は最近アクティブになったようで、実行する要件を解決してからディレクトリをlink-dirs.chezscheme.sps
ソフトリンクすると、標準のインポート参照を使用して動作するようです - .chez-srfi
srfi
(import (srfi :N lib))
(import (srfi sN lib))
つまり、Thunderchezを使用して同様の成功を収めたということです。
使いやすく、積極的に最新の状態に保たれていれば、どのレポを使用するかについては完全に無知です。これを提供する明確な好ましい選択肢はありますか、それとも個人的な意見に基づいたより表面的な選択肢ですか (その場合は、ここで質問するのではなく、自分で作成します!)。
scheme - 相対パスでファイルをロード
現在のディレクトリ内にファイルをロードするchezschemeを使用all-codes
ただし、ディレクトリを親ディレクトリに変更して試してみると:
読み込み中の例外: all-codes/ch4-mceval.scm で失敗しました: そのようなファイルまたはディレクトリはありません:
私のディレクトリは次のように表示されます
現在のレベルで 'all-codes' から scm コードをロードするにはどうすればよいですか?
macros - (Chez) ラムダを非表示にするためのスキーム マクロ
より冗長なラムダ式を非表示にするための短縮構文を作成するマクロを作成したいと思いますが、マクロの作成方法を理解するのに苦労しています (マクロの使用に対する議論であることがわかります)。
この例を考えると:
with-alist
次のような最後の 2 つの式を記述できるマクロ を書きたいと思います。
アドバイスや提案はありますか?