問題タブ [cons]
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.
reference - consセルへの参照
リストセルを指すように変数を設定するにはどうすればよいですか?
リスト内のすべての値に値を掛けるマクロを作成しようとしています。これは私が現在持っているものです:
n番目のセルを2回検索するので、これが最も効率的な方法ではないのではないかと心配しています。むしろ、n番目のセルを指すように変数を設定して、setf
そのセルの値を変更し、そのセル*
の値を計算に使用できるようにします。
さらに良いのはdolist
、変数をセル参照に設定して使用することです。これは可能ですか?
私がここにいる間、セルが1つあるときに、リスト内の次のセルを取得することもできますか。イテレータのようなもので、次のようなことができます。
しかし、ポインタの設定と参照セルの値の設定をどのように区別するのかわかりません。
私は理にかなっていると思います:)
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 である理由を説明します。
list - リスト内の特定の位置に要素を挿入する
リストの n 番目の位置に要素を追加する方法がわかりません。例えば:
大丈夫ですか?:
c - カウントコンスセルを効率的に参照する方法(サイクルの検出)?
私は(C11で)ある種のものを作る必要があり、Objective-C言語の場合liblisp
とほとんど同じように、基本的な機能を処理する必要があります。libobjc
編集
質問を一般的ではないものに書き直しています。
私は次のような実装を得ました:
したがって、コンス セルを作成できます (参照カウント オブジェクトでメモリ プールを使用します)。また、コンス セルがメモリ プール内にあるかどうかを確認するために使用することもできます (そのため、 (静的データのように)cons_is_managed
で作成されたのではなく、外部で定義されたセルを使用できます)。cons_init
ここで自動参照カウントを効率的に実装するにはどうすればよいですcons_set_car
か?cons_set_cdr
void *
ハーレムとカメの問題はここでは役に立ちません。各セルには 2 つの可能な方法があるため (そして、car または cdr がコンスの場合はどこにも行かない可能性があります)、それらはリスト、ツリー、またはグラフである可能性があります。
cons_set_car
それらを含むサイクルを見つけるために、おそらく on /で使用される外部 (管理されていない) conses を登録する必要がありますが、これを効率的cons_set_cdr
に行う方法はまだわかりません。
これは、グラフの一般的なサイクル (ノード上の最大 2 つの頂点) よりも制御されたコンテキストであるため、線形時間でこれを実行し、ガベージ コレクションを回避できる可能性はありますか (これが私のプラン B になります)。
主な問題は、これが関数型言語のコアであるため、これらの関数が( のように) 何度もobj_msgSend
呼び出され、ボトルネックになることです。
ありがとう。
別のアプローチでは、質問を簡単にするために、Objective-C + ARC や Vala のような参照カウントに基づく言語にコンス セルを実装するにはどうすればよいでしょうか?
recursion - スキーム car と cdr 再帰
次の関数で再帰がどのように機能するかを誰かに説明してもらえますか? 具体的には、関数がその基本ケースに到達したときに何が起こるかに興味があります。また、このコードで名前付き let が使用されているのはなぜですか? (私は名前付き let に慣れていません)
recursion - 宗派のリストを使用したスキームの変更のカウント
額面と金額のリストを指定して、スキームを変更する方法の数をカウントする関数を作成しています。私のコードは次のとおりですが、意図したとおりに動作しません。+ 演算子の代わりに cons を使用する必要がありますか? 下の 3 行目の基本ケースは空のリストにする必要がありますか?
テスト:
list - リストするコンス要素とスキームの要素へのコンスリスト
cons を使用して要素をリストに結合することと、cons を使用してリストをスキームの要素に結合することの違いは何ですか?
さらに、cons はどのように機能するのでしょうか。リストの末尾または先頭に要素を追加しますか?
ありがとう!