問題タブ [language-implementation]
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.
lisp - 特殊な形式を通常の値として扱うことを許可すると、どのような結果になるでしょうか?
Clojure では、特別なフォームを引数として渡すことも、変数に保存することもできないことがわかりました。
ラケット/スキーム:
それはいいですね。特別なフォームをラップする関数を書いて、その関数を渡すことができることはわかっています。
しかし、Lisp にこの制限がある理由と、これを許可するとどのような悪影響があるかを知りたいです。それを可能にする主要な方言はありますか?
map - バインディングがマップのタイプに影響するのはなぜですか?
私はREPLで遊んでいて、奇妙な振る舞いをしました。
すべての小さなリテラルマップはのインスタンスだと思いましたが、。PersistentArrayMap
でバインドされている場合はそうではないようですdef
。使用するdef
と、Clojureが私のlitteマップに別の表現を選択するのはなぜですか?おそらく奇妙な実装の詳細に過ぎないことは知っていますが、興味があります。
functional-programming - 純粋な関数型言語での Prolog の実装
Prolog を実装するための単純な疑似コード アルゴリズムに大いに感謝します。疑似コードは純粋な関数型言語用と見なされます。
python - Pythonリストの追加が同種でなければならないのはなぜですか?
Pythonの内部(CPythonまたは他の実装)に精通している人は、リストの追加が同種である必要がある理由を説明できますか?
上記が上記のトランスクリプトx+"foo"
の最終値と同じ値を返さないのはなぜですか?x
この質問は、ここでのNPEの質問に続くものです。Pythonのリストの動作+ =反復可能であるかどうかは、どこにでも文書化されていますか?
更新:異種の作業は必須ではないことを私は知っています+=
(しかし、そうします)。同様に、異種の作業が+
エラーである必要はありません。この質問は、なぜ後者の選択がなされたのかについてです。
リストにシーケンスを追加した結果が不確実であると言っても過言ではありません。それが十分な異議である場合、異質性を防ぐことは理にかなってい+=
ます。Update2:特に、Pythonは常に演算子の呼び出しを左側のオペランドに委任するため、「何をするのが正しいか」という問題は発生しません。左側のオブジェクトが常に支配します(右側に委任しない限り)。
Update3:これが設計上の決定であると主張する人のために、(a)それが文書化されていない理由を説明してください。または(b)文書化されている場合。
Update4:「何を[1] + (2, )
返す必要がありますか?」の直後にx
最初に保持されている変数の値と等しい結果値を返す必要があります。この結果は明確に定義されています。[1]
x+=(2, )
c# - ArrayListの内部実装
うまくいけば、これは重複ではありません。
何よりもまず、ArrayListが最良の選択ではないことは知っていますが、これは単なる好奇心です。
簡単に言うと、ArrayListの実装について疑問に思っていました。私はそれがストレージに配列を使用していることを調べて理解しました。
アレイの場合、次の場合:
arrは配列の最初の要素を指し、整数として入力されているため、コンパイラーはジャンプ先を認識しています。
さて、ArrayListは型がないので、コンパイラが次の項目がどこにあるかをどのように把握できるのか疑問に思いました。コンパイラがポインタ演算を実行できるように、データが何であるかを示すオーバーヘッドがあると思います。
結果として、ArrayListは、前に何があるかを知る必要があるため、データにジャンプすることはできないため、他の型指定されたコレクションよりもはるかに低速である必要があります。これはLinkedListと非常によく似ています。
functional-programming - 関数型言語の実装方法
命令型言語と関数型言語の違いを学ぼうとしています。
また、クロージャとガベージ コレクタの実装方法についても学びたいと思います。そこで、関数型言語のインタープリターを実装してみることにしました。
私は関数型言語に詳しくないので、関数型言語を設計するのは難しすぎます。単純な関数型言語の構文とセマンティクスに関するリソースはありますか? これを行う方法に関するチュートリアルは非常に役立ちます。
ruby - __FILE__が大文字で__dir__が小文字であるのはなぜですか?
Ruby 2.0.0-p0では、__dir__
現在実行中のファイルのディレクトリに簡単にアクセスできるように変数が導入されました。
__dir__
大文字であるのに小文字であるのはなぜ__FILE__
ですか?
c# - System.String はその文字列をどのように保存しますか
.NET を使いこなすには、.Net-Framework 自体と、Microsoft がすべての優れた機能をどのように実装しているかを調べることが役立つことがわかりました。前回、逆コンパイラを使用して の実装をSystem.String-Class
調べ、String-Object が実際の文字列を格納する方法を調べました。私は自分自身で最大のクラスに驚き、実際の文字列がクラスのどの部分を保存するかを明確に識別できませんでした。
クラスの開始部分と終了部分を示す逆コンパイルの 2 つのスクリーンショットを次に示します。
(最初のスクリーンショット[System.Reflection.DefaultMember("Chars")]
の最初の行) および/またはプロパティpublic extern char this[int index]
(2 番目のスクリーンショットの中央) が探しているものだと思います。
それは正しいですか? はいの場合、どのように機能しますか?
c++ - C/C++ によるコンパイルとコンパイラのバグ/制限
私は高水準 (Lisp のような) 言語を C (または、例外が十分に有用であることが判明した場合は C++) でコンパイルすることによって実装する可能性を検討しています。これは、多くのプロジェクトが以前に使用した戦略です。もちろん、これは C コードを生成するものであり、手動で作成するものとは異なり、おそらくいくつかの次元では複雑さを超えています。
最近の C コンパイラは、通常の使用では非常に信頼性が高いですが、異常なストレス下でのエッジ ケースにどのようなバグが潜んでいるのかを知るのは困難です。
これらの事実の偶然が不幸につながるかもしれないと私は思います。
主要なコンパイラ (GCC、Microsoft C++、Clang など) のかなり最近のバージョンで、生成されたコードがエッジ ケースのバグ/制限を超える既知のケースはありますか、またはケースを見つける良い方法はありますか?