問題タブ [scala-macros]
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.
scala - Scala マクロを使用して外部 DSL を内部化できますか?
マクロを使用して Scala で SQL などの外部 DSL を実装したいと考えています。Scala を使用して内部 DSLを実装する方法に関する論文を既に見ました。また、私は最近、これを Javaで行う方法についての記事を書きました。
現在、内部 DSL は、ホスト言語 (Scala など) で実装して使用する必要があり、ホスト言語の構文制約に従う必要があるため、常に少しぎこちなく感じられます。そういうわけで、Scala Macros がそのような制約なしに外部 DSL を内部化できるようになることを願っています。しかし、私は Scala マクロを完全には理解していません。SLICKと、あまり知られていないsqltypedというライブラリがマクロを使用し始めているのを見てきましたが、SLICK はクエリに「Scalaesque」構文を使用しますが、これは実際には SQL ではありませんが、sqltyped はマクロを使用して SQL 文字列を解析します (マクロなしでも実行できます)。また、Scala の Web サイトにあるさまざまな例は、私がやろうとしていることにはあまりにも些細なことです。
私の質問は:
次のような BNF 文法として定義された外部 DSL の例を考えます。
このようなクライアント プログラムを可能にするために、Scala マクロを使用して上記の文法を実装できますか? それとも、Scala マクロはそのような DSL を実装するほど強力ではないのでしょうか?
注、sqltypedのように文字列を解析するソリューションには興味がありません
scala-2.10 - より階層的な深さで呼び出し関数を取得する
次のコードは、呼び出し関数 (C _ _ FUNC _ _ など) を取得します。
しかし、マクロを呼び出す関数を呼び出す関数の名前を取得するにはどうすればよいでしょうか?
あなたの助けを前もってありがとう。
scala - 呼び出しクラスを取得する
マクロの呼び出しクラスを取得したいのですが、コードが機能しません。
よろしくお願いします。
scala - Scalaマクロに渡されたIntrospect引数
ケースクラスのインスタンスを引数として取るScalaマクロをプログラムしたいと思います。マクロに渡すことができるすべてのオブジェクトは、特定のマーカー特性を実装する必要があります。
次のスニペットは、マーカー特性とそれを実装する2つのケースクラスの例を示しています。
ここで、実行時の反映の重さとそのスレッドの安全性を回避するために、マクロを使用して次のコードを記述したいと思います。
マクロlogDomain
は別のプロジェクトに実装されており、次のようになります。
マクロの目的は、実行時に、指定されたオブジェクトのすべての値(id
および)を出力し、次に示すようにそれらを出力するコードを生成することです。name
これを実現するには、渡された型引数を動的に検査し、そのメンバー(vals)を決定する必要があります。次に、ログ出力を作成するコードを表すASTを生成する必要があります。マクロは、マーカー特性「ドメイン」を実装する特定のオブジェクトがマクロに渡されるかどうかに関係なく機能する必要があります。
この時点で私は迷子になっています。誰かが私に出発点を教えてくれたり、いくつかのドキュメントを教えてくれたら幸いです。私はScalaに比較的慣れていないので、ScalaAPIドキュメントまたはマクロガイドで解決策を見つけられませんでした。
scala - マクロ定義の外で reify を使用する
マクロ定義内でc.reify
onContext
パラメータを使用して、式を AST に変換できます。
しかし、マクロ関数に AST を渡して結果を確認することで、マクロ関数をテストできるようにしたいと考えています。つまり、次のようになります。
これを実行して、特定の式によって生成された AST を取得できるようにしたいので、単体テストを実行したり、REPL で非公式にテストしたりできます。
しかしc
、その表現には何を入れるべきですか?
scala - マクロから匿名クラスのメソッドを使用して構造型を取得する
いくつかの型メンバーまたはメソッドを持つ無名クラスを定義し、それらのメソッドなどを持つ構造型として静的に型指定されたそのクラスのインスタンスを作成するマクロを書きたいとします。これは 2.10 のマクロ システムで可能です。 0 であり、型メンバー部分は非常に簡単です。
(私のメソッドを提供ReflectionUtils
する便利な特性はどこにありますかconstructor
。)
このマクロを使用すると、匿名クラスの型メンバーの名前を文字列リテラルとして指定できます。
適切に入力されていることに注意してください。すべてが期待どおりに機能していることを確認できます。
次に、メソッドを使用して同じことをしようとします。
しかし、試してみると、構造型が得られません。
しかし、そこに匿名クラスを追加すると、次のようになります。
できます:
これは非常に便利です。たとえば、このようなことができますが、なぜ機能するのかわかりません。型メンバーのバージョンは機能しますが、機能しませんbar
。これは定義された動作ではない可能性があることはわかっていますが、意味はありますか? マクロから構造型 (メソッドを含む) を取得するよりクリーンな方法はありますか?
scala - 静的メンバーを生成し、型マクロ内のクラスに追加する方法は?
静的フィールド (この例では という名前) を型マクロ ( という名前) を持つbar
クラス ( という名前)に追加したいと思います。Foo
Static
これは私が現在それをやろうとしている方法です:
大きい
コンパイル中にsetFlag
、フラグ文字列が変更されるため、への呼び出しが効果があるようです。
しかし、使用サイトでは実際の効果はまったくないようです。
show
の兆候も見られshowRaw
ませんSTATIC
。
この問題を解決するにはどうすればよいですか?
scala - サブツリーを他のツリーに置き換える方法は?
Scala マクロでは、次のようなことをしたい:
私はTree
(おそらく大きい)を持っています。ここで、具体的な形を持つこのツリーのサブツリーを見つけたいと思いますApply(_, _)
。そして、元のツリーのコピーである新しいツリーを作成したいのですが、見つかったサブツリーは他のツリーに置き換えられます。
このようなものを使用すると、たとえば、あるメソッドの呼び出しを別のメソッドの呼び出しに置き換えることができます。
このようなことは可能ですか?
scala - 「アイテム」をその型パラメータ化された「コンテナ」にマップするマクロ -- 大きなコンパイラ エラー
「アイテム」の特性と、それらのアイテムの「コンテナ」の別の特性があるとします。
上記の型情報を使用して、マクロとランタイム リフレクションを介してマップを作成したいと思います。
これは私の試みで、うまくコンパイルされ、TypeTags のリストを返すだけの中間形式で動作します:
ただし、これを呼び出してコンパイルしようとすると、大きなコンパイラ エラーが発生します: https://gist.github.com/4647812
誰でも問題を見つけることができますか、またはこれについてのより良い方法を提案できますか?
ありがとう!
scala - コードのブロック内でレシーバーを (再) バインドすることは可能ですか?
問題
この質問の動機は、この質問の解決策を見つけようとすることです。
次の構文を使用して階層構造を構築するとします。
subB
構築 DSL はタイプ セーフである必要があります。つまり、 aを に直接ネストroot
したり、 asubA
を別の にネストしたりできませんsubA
。したがって、私の考えは、 methodroot
を定義するオブジェクトを返すメソッドを用意subA
し、後者が を定義するオブジェクトを返すようにすることsubB
です。
私が今欲しいのは、に渡されるコードのブロックroot
、つまり、
の呼び出しがsubB
によって作成されたオブジェクトにバインドされるように、 が実行されroot
ます。基本的にはこのように
ただし、レシーバーr
をsa
明示的にする必要はありません。
質問:this
Scala ではコード ブロック内でレシーバー、特に暗黙のレシーバーを再バインドできますか? おそらくマクロを使用しますか?
その他のアプローチ
この記事では、似たような XML ツリーの構築 DSL について説明します。それらの実装は機能に基づいてDynamic
おり、結果の DSL 構文は次のようになります。
ただし、このアプローチには明示的なレシーバー (ここでは object ) が必要であり、さらに深刻なことに、ノードをノード内にxml
ネストすることを静的に防止するという意味で、タイプセーフではないと思います。html
title