問題タブ [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.
java - アイデア: Java にデータ/DSL をコメントとして埋め込み、APT で Java コードを生成する
私にはアイデアがあり、フィードバックを得るためにあなたに実行してもらいたいと思いました。以下をご覧になり、ポジティブかネガティブかを問わず、ご意見をお聞かせください。
私は常々、Java の規則に従わなくても、特定のデータを Java コードに埋め込む方法があればいいのにと思っていました。最近、ドメイン固有言語 (DSL) についての話をよく耳にします。DSL を日常的にもっと活用できればどんなに素晴らしいことか。私はこれを合理的にエレガントな方法で行う方法を考えていると思います。
以下は、Java コード (およびその他の C に似た言語) で表現するのが面倒で、これで解決したいことがわかっているものの例です。
文字列配列としての短い文字列のリスト
文字列配列としての長い文字列のリスト
多次元文字列配列としての文字列のテーブル:
キーと値のペアのリスト
HTML コードの単一文字列
適切なテキスト形式の HTML テキスト ブロック
以下で説明するソリューションを少し調査しましたが、これをエレガントに実現できる使用可能なライブラリを作成できると思います。Java 5 および 6 には、Annotation Processor Tool (APT) と呼ばれるものがあります (Debian APT とは異なります)。独自のソース コード プロセッサを作成します。これは、ソース コードを書き直す機会を与えるためにコードがコンパイルされるときに呼び出されます。コードを書き直した後、通常どおりコンパイルされます。
APT を利用するには、次の手順を実行する必要があります。 1. このライブラリの jar を ANT クラスパスに配置します。2. このライブラリの jar をプロジェクト クラスパスに配置します。3. javac の代わりに apt タスクを呼び出し、preprocessdir パラメータを追加して、生成されたファイルを配置する場所を指定します。
DSL コードは、コードの結果が配置される変数の直後のコメント内に配置できます。プロセッサが実行されると、コード内で次のコメントを探し、コードを抽出し、プロセッサを介して実行し、コードを生成してコンパイルを実行できます。
もう一度リストを示します。今回は、次のようになります。
文字列配列としての短い文字列のリスト
文字列配列としての長い文字列のリスト
多次元文字列配列または JTable としての文字列のテーブル:
キーと値のペアのリスト
HTML コードの単一文字列
適切なテキスト形式の HTML テキスト ブロック
このソリューションについて私が考えることができるいくつかの要件/機能:
スクリプトが Java ソース コードで生成するデータを保持する変数を宣言する必要があります。これにより、コンパイラがデータの出所を認識していなくても、ソース コードの残りの部分は結果データについて知ることができます。
- IDE と javac がエラーを表示しないように、Java 言語に違反してはなりません。
- 既存のすべての Java コードを操作します。既存のコードを置き換える必要はありません。これらのスニペットを好きな場所に追加してください。
- 追加の型で簡単に拡張できる必要があります。
- ソースコードの強調表示と自動補完を可能にする IDE の拡張機能を後で作成できる必要があります。
- 変換はコンパイル時に行われるため、有効な Java コードを生成する必要があります。
- リスト、CSS、SQL などの複数行のテキスト ブロックなどの String および String[] に変換します。
- XML、HTML の変換とエンコード
- コードが書き直されるとき、同じ行番号を保持します。デバッグや読み取りエラーが面倒にならないように、行を追加しないでください。
- 実行時に任意の BSF 言語で記述されたコードを実行します。任意のパラメーターをスクリプトに渡し、任意の Java クラスまたはプリミティブを Java に返すことができるようにします。
- コンパイル時に任意の BSF 言語で記述されたコードを実行して、Java ソース コードを生成します。Linux での M4 の使用方法に似ています。
- 後で: 長い文字列を作成するために、多数の呼び出しからの文字列の結果を連結できるようにします。コンパイル時である場合もあれば、実行時である場合もあります。
繰り返しになりますが、これについてフィードバックをいただければ幸いです。これはばかげた考えですか?このようなものはすでにそこにありますか?このようなものをわざわざ使用しますか、それとも私だけに留めておくべきですか?
c# - DSL を使用して C# コードを生成する
現在、私が取り組んでいるプロジェクトには、(外部の影響により) 完全に修正されたモデルがないため、モデルを柔軟に記述できるようにしたいと考えています。現在、それらはアプリケーションの 3 つの異なるレイヤー (db、web api、およびクライアント) にわたって複製されており、それぞれに同様のロジック (つまり、検証) があります。
モデルファイル(Rubyなど)を作成し、そのモデルを必要なc#ファイルに変換できるアプローチがあるかどうか疑問に思っていました。現在、私はどの段階でも変更される可能性のある多くの定型コードを書いているようですが、この生成されたアプローチにより、より重要なことに集中することができます。
このようなもの、私がこれを行うことができるDSL /言語の推奨事項はありますか?また、このようなことに関する経験はありますか?
serialization - コルーチンのシリアル化をサポートする言語
そのようなサポートは現在の言語には存在しないと思います。私がやりたいことは「ワークフローエンジン」で解決できると思います。しかし、私がワークフローで抱えている問題は、一般的に次のとおりです。
- 宣言型/冗長性と私は命令型のスタイルがはるかに簡潔だと思います
- ヘビー級、私はたくさんのシンプルで多様な小さなステートマシンを持っています
C#でイテレーターをシリアル化することを調査しましたが、それでは目的の場所に正確に到達できません。現在、 BooでDSLを作成することを検討していますが、コルーチンのような動作をBooに取り込み、シリアル化できるかどうかはわかりません。
例
これが私がやりたいことの限られた架空の例です。主な問題は、ルーチンのどの時点でも、ユーザー入力を取得する必要があるかもしれないということです。入力間の時間が非常に長くなる可能性があるため、サービスの状態をディスクにシリアル化する必要があります。
アップデート
私はCPythonで動作する「エンジン」を持っています。Pythonでのイテレータ/yieldサポートに便乗します。したがって、コードは次のようになります。
どこrollDice
で中断することができます。いくつかのユーザーアクションで。ただし、 CPythonはイテレータをシリアル化しません。
ゲームの状態全体を一連のコマンドとして定義できるため、コルーチンが開始された時点までゲームの状態をシリアル化し、次に残りのコマンドのリストをシリアル化します。したがって、保存/復元するには次のようになります。
現在の調査
私はまだこれが不十分だと思っています。結局、ほとんどすべてのメソッドで「yield」を使用する必要があります。メソッドを特別に装飾する必要はありません。また、シリアル化ではかなり失敗します。
関数型言語はメタプログラミング/DSL作成をよりよくサポートしているように見えるので、現在私は関数型ルートに行くことを調査しています。現在見ている
- F#計算式
- Haskell
十分に強力なメタプログラミング機能があれば、状態ストレージメカニズムを自動化できることを期待しています。また、F#ルートを使用すると、イテレータのシリアル化に使用した「テクニック」/(ハック)に頼ることができると確信しています。
c# - DSLとメソッドの呼び出し:長所と短所
使用しなければならないかなり特殊なデータソース(実際には会計アプリケーションへのインターフェイス)があります。それはかなり強力ですが、私はそれから必要なデータを取得するためにかなり多くのフープを飛び越えなければなりません。たとえば、テーブルの内容を取得して、返す列を指定する場合は、.Columnsコレクションを反復処理して、必要な列に対して.SetVisible()を呼び出す必要があります。
現在、これをラップしてより簡単な方法で指定できるメソッドがありますが、その関数のパラメーターリストは急速に増えており、ほとんどの場合、呼び出すときにいくつか指定するだけで済みます。 。要するに、それは柔軟性のない解決策です。
私の頭に浮かんだ最初の解決策は次のようなものでした。
Criteria、Filters、およびReportParamsはアプリケーションに固有のものであり、ここではそれらについては説明しません。しかし、一般的な考え方はこのようなものです。これは、メソッドの呼び出しと実質的に類似していますが、(特定のメソッドを呼び出すことによって)指定するパラメーターを選択でき、IntelliSenseの支援が少し増える点が異なります。また、メソッド呼び出しの順序を試すこともできます。
SetFilter()
解析する式があることに注意してください。これは、データソースが困難にするもう1つのことです。式を非常にうまく処理できますが、それらを特別なオブジェクトのツリーとして渡す必要があります。これも、作成にかなり時間がかかります。前の質問で、私はそのような式を解析するのに助けを求めました。現在のラッパーメソッドには、単純な式を解析できる自作式パーサーがありますが、それらのサポートをより完全にすることを考えました。
その質問では、Ironyプロジェクトが提案されました。それをチェックした後、私はそれが本当にこのニーズに適していると判断しました。しかし、しばらくすると、それはそれよりもさらに強力であることに気づきました。自分のクエリ言語をこのタスクにぴったりと合わせてみませんか?上記は次のようになります。
しかし...これはやり過ぎではないでしょうか?どちらのアプローチの長所と短所は何ですか?私が見ているのは:
プロDSL:
- より簡潔なクエリ。
プロの方法:
- より多くのIntelliSenseサポート。
- メソッド名/パラメーター名(およびコメント)により、文書化の必要性が少なくなります(DSLは完全に文書化する必要があります)。
- 作成するのが速いかもしれませんか?私は自分でDSLを作成したことがないので、それがどれだけの作業であるかわかりません。アイロニーは私の肩から多くの負担をかけているようですが、まだどれくらい残っていますか?
追加:明確にするために、両方のアプローチはコーダーによってのみ使用されます。外部の人やビジネスアナリストはそれを使用しません。
c# - .NET のデータ DSL としての YAML (C#)
YAML を .NET のデータ DSL として使用している人はいますか? XML よりも軽量な YAML を使用したいと考えています。この DSL を、既存のアプリケーションの 1 つの「パワー ユーザー」設定ツールとして使用するつもりです。
私の懸念:
- .NET コミュニティ ライブラリの 1 つを使用した YAML のサポートはどのようになっていますか?
- YAML には持久力がありますか? まだ4年後くらいかな?それとも、他の形式について話しているのでしょうか? JSON と XML がしばらく使用されることはわかっていますが、私のユーザーは JSON または XML ドキュメントを作成したり維持したりすることを望んでいません。
visual-studio - 新しいパッケージ バージョンのアンインストール/インストール後に Visual Studio Isolated Shell Toolbox が更新されない
多数のツールバー項目を含む DSL パッケージを開発しています。DSL エクスプローラーに新しいツールバー項目を追加すると、新しいパッケージを Visual Studio 分離シェルにインストールすると、新しい項目が表示されません。パッケージの最初のバージョンをインストールし、アンインストールしてから、更新されたバージョンをインストールすることにより、最初に仮想マシンでこれをテストしています。新しいバージョンの DSL パッケージ アセンブリがインストールされているにもかかわらず、システムが何らかの方法で古いツールバー設定などをキャッシュしているようです。
古いツールバー項目が表示され、新しい項目が表示されない理由はありますか?
c++ - 簡単なパーサーを書く
ある種のドメイン固有言語に簡単なパーサーを書く必要があります。
適切な演算子の評価順序と、オーバーロードされる可能性のある基礎となる環境の関数を呼び出すための構文を備えた基本的な算術が必要です。
そのようなパーサーを書く最も簡単な方法は何ですか?箱から出して適応または使用できるものはありますか?私はC++で書いています。
php - PHP テキスト解析および/または独自の言語を作成しますか?
ドメイン固有言語など、あらゆる種類の言語を解析するのに役立つクラスまたはライブラリを知っている人はいますか(私は作成しているので、構文と形式は柔軟です)。 PHPコードまたはいくつかの便利な構造体またはクラス階層または...のいずれかに入ることができますか?この時点で何でも構いません。:)
テキスト ファイルをトークンに解析し、ビジネス自然言語などを表現するための小さな文法および構文ライブラリを構築する実験を行いたいと考えています。