問題タブ [dsl]

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 投票する
6 に答える
12292 参照

java - Java で自然な DSL を作成するのに最適なツールは何ですか?

数日前、私はブログ エントリ ( http://ayende.com/Blog/archive/2008/09/08/Implementing-generic-natural-language-DSL.aspx ) を読みました。 .NET を使用した一般的な自然言語 DSL パーサー。

私の意見では、彼のアイデアの素晴らしい部分は、テキストが解析され、文と同じ名前を使用するクラスと照合されることです。

例として、次の行を取り上げます。

解析の結果を取得する「既知の」オブジェクトのコレクションを使用して変換されます。オブジェクトの例は次のとおりです (私の例では Java を使用しています)。

したがって、最初の文を処理するとき、CreateUser クラスは一致し (明らかに「ユーザーの作成」の連結であるため)、コンストラクターでパラメーターを受け取るため、パーサーはユーザー パラメーターとして「user1」を受け取ります。

その後、パーサーは次の部分「with email」もメソッド名と一致することを識別し、そのメソッドはパラメーターを受け取るため、「test@email.com」を email パラメーターとして解析します。

もうお分かりだと思いますよね?少なくとも私にとっては、アプリケーション テスターが自然言語で「テスト スクリプト」を作成し、その文を JUnit を使用してアプリの動作をチェックするクラスに解析できるようにするという非常に明確なアプリケーションの 1 つです。

Java を使用してそのようなパーサーをコーディングできるツールまたはリソースに関するアイデア、ヒント、意見を聞きたいです。複雑な字句解析器や ANTLR のようなフレームワークの使用を避けることができればなおさらです。これはハエを殺すためにハンマーを使用することになると思います。

それ以上に、そのためのオープンソース プロジェクトを開始する人がいれば、私は間違いなく興味があります。

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

dsl - DSL ツール: カスタム コードで新しいダイアグラムを作成する

Visual Studio 2005 用の DSL ツールを使用しています。

特定の時点で、カスタム コードを使用して新しいダイアグラムを作成したい DSL があります。

ここまでで、既に開いている現在のダイアグラムを上書きして、新しいダイアグラムを作成することができました。コードは次のとおりです。

しかし、私が本当にやりたいことは、

新しいインスタンス FEGeneratorDiagram を使用して新しい DSL ドキュメントを作成し、要素を追加してプロパティを設定する私のロジックを続けます。

何か助けはありますか?

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

ruby - Arduino 制御のドリンク ディスペンサー (バー モンキー) を制御するための Ruby DSL の改善に助けが必要です

私が取り組んでいる Arduino プロジェクトを制御するために、Ruby で DSL を書いています。バルディーノ。これは、飲み物を提供するためにソフトウェア制御されるバー モンキーです。Arduino は、シリアル ポートを介してコマンドを受け取り、どのポンプをどれだけの時間オンにするかを Arduino に伝えます。

現在、レシピ (以下を参照) を読み取り、それを出力します。シリアル通信のコードは、以下で言及した他のアイデアと同様に、まだ作業する必要があります。

これは私の最初の DSL であり、以前の例に基づいて作業しているため、端が非常に荒いです。批評、コードの改善 (Ruby DSL のベスト プラクティスやイディオムに関する適切なリファレンスはありますか?)、または一般的なコメント。

私は現在、DSL の大まかなドラフトを持っているので、飲み物のレシピは次のようになります ( Github リンク):

これは順番に解釈され、現在は次のようになります ( Github リンク):

これは DSL の良いスタートですが、もう少しうまく実装できると思います。私が以下に持っていたいくつかのアイデア:

  1. 材料の名前とそれが接続されている番号ポンプを使用して、利用可能な「材料」を定義します。たぶんハッシュを使用していますか?材料 = {"水" => 1, "ウォッカ" => 2}. このようにして、成分が解釈されると、a)シリアルポートを介してポンプ番号を送信し、続いてArduinoが分配するオンス数を送信しますb)成分が存在しないことをユーザーに伝え、中止するため、何も分配されませんc)変更された場合、新しい成分を簡単に変更または追加できます。
  2. DSL の主な目的である、レシピをコードのように見えないようにすることは、レシピ ビルダーを構築することでしょうか? 利用可能な材料を使用して、ユーザーに飲み物の名前、含まれる材料、およびその量を尋ねますか?

Github プロジェクトはこちら です。気軽にフォークしてプル リクエストを作成したり、他のユーザーが見られるようにコードの提案や例をここに投稿したりしてください。興味があれば、Ruby Arduino 開発フレームワークを使用した Arduino コードはこちらにあります。

アップデート

Orion Edwards のレシピに対する提案を反映するために、少し変更してクリーンアップしました。現在は次のようになっています。

ハッシュも追加しました(キーは成分であり、値はそれが接続されているポンプ番号です)。これは大きな進歩をもたらしたと思います。今のところ、さらなる提案のために質問を開いたままにしますが、最終的には Orion の回答を選択します。更新された DSL コードはこちらです。

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

orm - リレーショナル代数を実装するための言語機能

私は Scala でリレーショナル代数をエンコードしようとしてきました (私の知る限り、Scala は最も高度な型システムの 1 つです)、目的の場所に到達する方法が見つからないようです。

私はプログラミング言語設計の学問分野の経験があまりないので、どの機能を探すべきかよくわかりません。

では、静的に検証されたリレーショナル代数を実装するには、どの言語機能が必要で、それらの機能を備えているのはどの言語でしょうか?

要件の一部: Tuple は、静的に定義された問題のタプルの有効な名前のセットから、名前で指定された型の値に名前をマッピングする関数です。この name-type セットをドメインと呼びましょう。

リレーションは、タプルの範囲がセット内で一意であるように、同じドメインを持つタプルのセットです。

これまでのところ、モデルは簡単に Scala でモデル化できます。

Tuple の vals、vars、および defs は、上で定義した名前と型のセットです。しかし、Tuple に同じ名前の定義が 2 つあるはずはありません。また、vars と不純な定義もおそらく制限されるべきです。

トリッキーな部分は次のとおりです。

2 つのリレーションの結合は、タプルのドメインがオペランド タプルのドメインの和集合であるリレーションです。ドメインの共通部分の範囲が同じタプルのみが保持されるようにします。

トリックを行う必要があります。

Relation の射影は、タプルのドメインがオペランド タプル ドメインのサブセットである Relation です。

これは、解決策を見つけることさえ可能かどうかわからないところです。どう思いますか?プロジェクトを定義するために必要な言語機能は何ですか?

上記のオフコースで暗示されているのは、API が使用可能でなければならないということです。定型文のレイヤーとレイヤーは受け入れられません。

0 投票する
10 に答える
4136 参照

c# - ドメイン固有言語 (DSL) とドメイン駆動設計 (DDD)

ドメイン固有言語 (DSL) とドメイン駆動設計 (DDD) の違いと類似点は何ですか?

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

dsl - 標準的な言語表現を構築する一般的な複雑さは?

言語の標準的な表現を持つと便利なことがよくあります (私の場合、それらは通常ドメイン固有の言語です)。ただし、関連する言語の表現力には厳密な制限があり、その言語の任意のプログラムに対して標準形式を決定および/または作成できるかどうかを決定するものだと思います。残念ながら、これについて読んだことを(漠然と)思い出した参考文献を見つけることができませんでした.

一方では、言語の正規表現を作成することは、多くのハード グラフの問題 (例: グラフ同形性) に匹敵する複雑さであると合理的に思われますが、他方では、iirc、gcc、yhc、および ghc などのコンパイラは中間表現を使用します。さまざまな形式(アセンブリ、JavaScriptなど)で出力を生成するため、これは少なくともいくつかの形式では解決済みの問題です。

特定の言語の正規形を決定/生成できるのはいつですか? (その言語はどの程度表現力があり、言語の表現力は正規形の有用性にどのように影響しますか?) 可能であれば、参照または証明を提供してください。

編集:たとえば、正規言語(例:正規表現の「純粋な」形式)は、チューリング完全言語が表現できるのと同じ多くのことを表現できません。つまり、通常の言語で Web サーバーを作成することはできませんが、ラムダ計算を使用すると作成できます)。私の質問は理論的な可能性に関するもので、複雑性理論に関連する具体的な答えがあります。別のシステムに送信する必要がある DSL がある場合、送信する前にそのコードの標準的な形式を生成すると、2 つの異なるシステムで使用される独立した表現が分離されるため、多くの場合有益です。 でも、それがP空間完全、またはチューリング完全言語を標準形式に変換するためのNP完全である場合、標準形式を構築しようとして時間を無駄にすべきではありません-それを行う別の方法を見つけるか、削減します多項式時間で正規化できる言語の複雑さ。

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

virtual-machine - 内部 DSL から外部 DSL への変換はアンチパターンですか?

従来のシステムでは、独自の VM を作成して実行時に内部 DSL を実行していました。社内 VM は、社内 DSL のみを実行するように設計されています。現在、レガシー アプリケーションを書き直しています。私たちが検討しているアイデアの 1 つは、内部 DSL を外部 DSL (C# または Java) に変換し、その VM を利用することです。

内部 DSL 用に独自の VM を作成する場合と、外部 DSL に変換してその VM を実行する場合の明確なガイドラインはありません。

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

metaprogramming - Nemerleマクロのインフィックス形式

非常に特殊な乗算演算子が必要だとします。次のマクロで実装できます。

そして、私はそれを次のように使うことができます

そしてその仕事。

しかし、私が本当に望んでいるのは、現在開発中のDSLIm用の「英語」のような演算子です。

そして私がそれを次のように使おうとすると

コンパイラは'expected;'で失敗します エラー

何が問題ですか?この中置形式のマクロを実装するにはどうすればよいですか?

0 投票する
5 に答える
832 参照

dsl - モデル駆動型開発のためのツール (ベスト プラクティス?)

モデル駆動型ソフトウェア開発。

私が理解しているように、ソフトウェアが実行しようとするドメインをよりよく反映するために、設計の抽象化レベルが上がります。

この方法論を機能させるには、ドメインの専門家 (顧客) と開発者の間のコミュニケーションが不可欠です。私が知りたいのは、MDSD の最初の推力に役立つツール スイートまたは一連のベスト プラクティスがあるかどうかです。ドメインが具体化されたら、そのモデルを ORM (またはその他) にマッピングするのはどうでしょうか?

MDSD と DSL の領域に飛び込んでいるので、建設的なアイデアやコメントを歓迎します。

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

c# - C# 隠しトランザクションを作成する

VS2005 用の C# および DSL ツールを使用しています。

一部のデータを変更するためにトランザクションを作成する必要がありますが、それらをユーザーから隠したい、つまり、VS2005 の UNDO リストに表示されないようにしたいです。

UndoManager を無効にしてみました

ただし、それを無効にすると、元に戻すリスト内の既存の以前のアクションがすべてクリアされます。

トランザクションには「isHidden」というプロパティがありますが、読み取り専用です。非表示に設定する方法がわかりません。また、新しい UndoManager を作成しようとしましたが、これも読み取り専用のプロパティです...

元に戻すリストに表示されないトランザクションを作成するにはどうすればよいですか?

疑問点を明確にするために、さらに詳細を書きたいと思います。どうもありがとう、ルイス・フィリペ

[追加した]

プロパティ値に基づいてすべての図形の背景をペイントします。たとえば、true の場合は緑、false の場合は赤。形状の背景を描画するにはトランザクションを開く必要がありますが、私にとっては計算された (読み取り専用) プロパティとして動作します。