私の質問は不自然かもしれません。推奨されるものではなく、実現可能性の証明以上のものと考えたいと思います。コンテキストを説明するために、組み込み DSL に次の構文とは異なる構文を持たせようとします。
val myVal = "someContent"
私はそのようなことをしたいと思います:
assign("SomeContent","someVariable") => converted to
someVariable = "SomeContent"
コードの後半で、変数が使用可能になります。通常、REPL には次のようなものがあります。
assign("John","name")
println("Hello " + name)
私はそのトリックを行うためにマクロ (または ScalaCompiler プラグインですが、ここではさらに複雑だと思います) を考えてきました。まず、これがマクロの初心者であるために実現可能かどうかはわかりません。
String のみを操作することを考慮して、単純化したものから始めました。次のようなものから始めました。
def assign(content: String, targetVal: String):Unit = macro assignMacro
def assignMacro(c:Context)(content: c.Expr[String],
targetVal: c.Expr[String]):c.expr[Unit] = {
import c.universe._
c.Expr[Unit](ValDef(Modifiers(), TermName(targetVal.value),
TypeTree(), Literal(Constant(content.value)))
}
残念ながら、いくつかの間違いのために失敗しているようです
- 最初に、新しい用語名を作成しようとすると、式の eval を呼び出す必要があると確信している場合に提案されます。残念ながら、よくわかりません;)試してみると、失敗します;)
- この targetVal と content を myVal や myContent などの定数に置き換えると、compiler found and required Unit のような 2 番目のエラー メッセージが表示されます
私は少し立ち往生しています。まずこれは可能ですか?はいと思います;)そして、どうすればこれを達成できますか?
助けてくれてありがとう
よろしくお願いします