問題タブ [language-design]
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.
java - Java にブロックスコープの変数宣言がないのはなぜですか?
次のメソッドは、内側のブロックが外側のブロックと同じ名前の変数を宣言しているため、機能しません。どうやら変数は宣言されているブロックではなく、宣言されているメソッドまたはクラスに属しているようです。ちょっとだけ影:
私がこれまでに使用したほぼすべてのブロック スコープ言語は、これをサポートしていました。これには、学校でインタープリターとコンパイラーを作成した簡単な小さな言語も含まれます。Perl はこれを行うことができ、Scheme や C でさえ可能です。PL/SQL でさえこれをサポートしています!
この Java の設計上の決定の根拠は何ですか?
編集:誰かが指摘したように、Javaにはブロックスコープがあります。私が尋ねている概念の名前は何ですか? それらの言語設計クラスからもっと思い出せたらいいのにと思います。:)
language-design - Adobe Acrobat 9 はどのように作られたのですか?
Adobe Acrobat 9 がどのように作られたか分かる人はいますか? GUI のルック アンド フィールが好きで、どのように作成されたのか興味があります。具体的には、それを作成するために使用されたプログラミング言語は何ですか?
syntax - あなたの言語の「ハングアップ」は何ですか?
最近の言語対言語に関する質問を興味深く読みました... Perl 対 Python、Python 対 Java、ある言語が別の言語よりも優れている可能性はありますか?
私が気づいたことの 1 つは、私たちの多くが言語を嫌う非常に表面的な理由を持っているということです。私たちはこれらのことに一目で気づき、私たちをオフにします。私たちはおそらく完全に優れた言語を避けています。気にすれば 2 秒で好きになったり無視したりすることをおそらく学べる機能の結果です。
まあ、私は次の男と同じくらい罪悪感があります. ここに行きます:
- Ruby: 私が目にするすべての Ruby のサンプル コードは、この
putsコマンドを使用しています。これは一種の幼稚なイディッシュ語の解剖学的用語です。そのため、Ruby コードを真剣に受け止めるべきなのに、真剣に取り組むことができません。 - Python: 初めて見たとき、意味のある空白の部分ににやにや笑ってしまいました。それから数年は避けました。今はそれ以外はほとんど使っていません。
- Java: identifiersThatLookLikeThis は好きではありません。正確な理由はわかりません。
- Lisp: すべての括弧に問題があります。重要性と目的が異なるもの (関数の宣言、変数の代入など) は構文的に区別されておらず、何が何であるかを学ぶのが面倒です。
- Fortran: すべて大文字だと目が痛いです。最新のコードをそのように書く必要がないことは知っていますが、ほとんどのサンプル コードは...
- Visual Basic:
Dim変数の宣言に使用されるのが気になります。GW-BASIC が配列の次元にのみ使用されていた古き良き時代を覚えているからです。
一見したところ、どの言語が適切に見えましたか? Perl、C、QBasic、JavaScript、アセンブリ言語、BASH シェル、FORTH。
さて、汚れた洗濯物を放映したので...あなたの洗濯物を聞きたい. あなたの言語のハングアップは何ですか? 気になる表面的な特徴は何ですか?それらをどのように乗り越えましたか?
c# - コンストラクターの署名と静的メソッドをどのように強制しますか?
(子) クラスに、C# または Java で特定のシグネチャまたは特定の静的メソッドを持つコンストラクターを強制する方法はありますか?
明らかに、これにインターフェイスを使用することはできません。使用が制限されることはわかっています。私が役に立つと思う例の 1 つは、次のようなデザイン ガイドラインを適用する場合です。
例外
すべてに 4 つの標準コンストラクターが必要ですが、それを強制する方法はありません。これらをキャッチするには、FxCop (C# の場合) などのツールに頼る必要があります。
演算子
2 つのクラスを合計できることを指定する規約はありません (C# の operator+ を使用)。
この制限を回避する設計パターンはありますか? C# または Java の将来のバージョンでこの制限を克服するために、言語に追加できる構成要素は何ですか?
java - C、C++、Java、次は何ですか?
言語の次の進化はどのようになると思いますか?
ruby - Arduino 制御のドリンク ディスペンサー (バー モンキー) を制御するための Ruby DSL の改善に助けが必要です
私が取り組んでいる Arduino プロジェクトを制御するために、Ruby で DSL を書いています。バルディーノ。これは、飲み物を提供するためにソフトウェア制御されるバー モンキーです。Arduino は、シリアル ポートを介してコマンドを受け取り、どのポンプをどれだけの時間オンにするかを Arduino に伝えます。
現在、レシピ (以下を参照) を読み取り、それを出力します。シリアル通信のコードは、以下で言及した他のアイデアと同様に、まだ作業する必要があります。
これは私の最初の DSL であり、以前の例に基づいて作業しているため、端が非常に荒いです。批評、コードの改善 (Ruby DSL のベスト プラクティスやイディオムに関する適切なリファレンスはありますか?)、または一般的なコメント。
私は現在、DSL の大まかなドラフトを持っているので、飲み物のレシピは次のようになります ( Github リンク):
これは順番に解釈され、現在は次のようになります ( Github リンク):
これは DSL の良いスタートですが、もう少しうまく実装できると思います。私が以下に持っていたいくつかのアイデア:
- 材料の名前とそれが接続されている番号ポンプを使用して、利用可能な「材料」を定義します。たぶんハッシュを使用していますか?材料 = {"水" => 1, "ウォッカ" => 2}. このようにして、成分が解釈されると、a)シリアルポートを介してポンプ番号を送信し、続いてArduinoが分配するオンス数を送信しますb)成分が存在しないことをユーザーに伝え、中止するため、何も分配されませんc)変更された場合、新しい成分を簡単に変更または追加できます。
- DSL の主な目的である、レシピをコードのように見えないようにすることは、レシピ ビルダーを構築することでしょうか? 利用可能な材料を使用して、ユーザーに飲み物の名前、含まれる材料、およびその量を尋ねますか?
Github プロジェクトはこちら です。気軽にフォークしてプル リクエストを作成したり、他のユーザーが見られるようにコードの提案や例をここに投稿したりしてください。興味があれば、Ruby Arduino 開発フレームワークを使用した Arduino コードはこちらにあります。
アップデート
Orion Edwards のレシピに対する提案を反映するために、少し変更してクリーンアップしました。現在は次のようになっています。
ハッシュも追加しました(キーは成分であり、値はそれが接続されているポンプ番号です)。これは大きな進歩をもたらしたと思います。今のところ、さらなる提案のために質問を開いたままにしますが、最終的には Orion の回答を選択します。更新された DSL コードはこちらです。
syntax - ポストオペレーターの組み合わせ?
プレインクリメント演算子とポストインクリメント演算子はよく知られています。
そして、この原則を拡張する「複合演算子」:
私はしばしば「結合後の演算子」が必要でした。これにより、次のことが可能になります。
明らかに、これは交換不可能な演算子でのみ実際に有用であり、構文が借用されていても、意味は前/後インクリメントから変更されます。
そのような演算子を提供する言語を知っていますか?なぜそれがより一般的ではないのですか?
scripting - 「ユーロパント」タイプのユニバーサル スクリプト言語を作成する際の障害は何でしょうか?
今週、いくつかのスクリプト言語を行ったり来たりしてみて、どれもどれも似ていることに気づきました。それでも、私は常にGoogle(または最近はSO)に、「instanceof」と「endswith」のローカルでの同等物や、インターフェイスを宣言する正しい構文などの詳細を覚えてもらうようにしています。
これは、(人間の)言語であるEuropontoを思い出させました。漠然とした英語の構文と、漠然としたロマンス語/ゲルマン語/スラブ語の語彙を選択するだけで、すべて問題ありません。
では、スクリプト言語で同じことをしようとするとどうなるでしょうか。今日、Python スタイルのインデントされたブロックに興味がありますか? 罰金!プロトタイプ オブジェクトを使用しますか? Ok!いくつかのライブラリ関数の PHP 名のスペルを覚えることしかできませんか? 問題ない!
とにかく、それはワイルドでクレイジーなアイデアです。具体的な答えを認める質問が必要なので、次のように締めましょう。
[Python、Ruby、PHP、Perl、shell、JavaScript] のすべてのネイティブ構文とライブラリ関数を許可し、言語間でコード ブロックと関数名を自由に混在させることができるスクリプト言語を作成する際の最も重大な競合は何でしょうか。 ?
そして、特定の構造はステートメント レベルで一貫している必要があるとしましょう。したがって、次を許可します。
しかし、そうではありません。
競合には次のようなものがあります。パーサーのあいまいさ。名前の衝突; オブジェクトまたは関数またはクロージャの矛盾するセマンティクス。など。その範囲は非常に大きな問題になると思いますが、教えてください。
最初から「コミュニティ ウィキ」として開始するので、楽しい質問だと思うが、より厳密にしたい場合は、自由に編集してください。
programming-languages - 最も興味深い非主流言語は?
コンパイラ、インタプリタ、言語に興味があります。
あなたが知っている、忘れられた、または知られていない、最も興味深い言語は何ですか? さらに重要なことは、なぜですか?
私はコンパイル言語、インタープリター言語、VM 言語の両方に興味がありますが、Whitespace や BF のような難解な言語には興味がありません。
もちろん、オープン ソースはプラスになるでしょう。
programming-languages - オフサイドのルールをどのように実装しますか?
トリックを実行するジェネレーターを既に作成しましたが、オフサイドルールを実装するための最良の方法を知りたいです。
手短に:オフサイド ルールとは、このコンテキストでは、インデントが構文要素として認識されることを意味します。
これは、使用可能な形式でインデントをキャプチャするトークナイザーを作成するための疑似コードのオフサイド ルールです。言語によって回答を制限したくありません。
このレイアウタは、一度に複数の NEWLINE を生成することはなく、インデントが発生しても NEWLINE を生成しません。したがって、解析ルールは非常に単純なままです。かなり良いと思いますが、それを達成するためのより良い方法があればお知らせください。
しばらくこれを使用しているうちに、DEDENT の後にとにかく改行を発行するのが良いことに気付きました。この方法では、INDENT DEDENT を式のトレーラーとして保持しながら、NEWLINE で式を区切ることができます。