0

設定パラメータをマクロに渡したいです。これらのパラメーター (シーケンスのタプル) に基づいて Nimrod コードの文字列を生成する手順が既にあります。文字列を渡してstrValで変換できることはわかっています(回答https://stackoverflow.com/a/19956317/334703を参照)。より複雑なデータでも同じことができますか?

または、この Nimrod コードの文字列をコンパイル時のプロシージャで使用して、 parseStmtなどのプロシージャを呼び出すことはできますか?

編集: Nimrod コードの生成は、私のアイデアをテストするのに役立ちました。AST を直接生成する必要があることに同意します。

これが私が考えている構造の例です。

type
  Tconfig = tuple
    letters: seq[string]
    numbers:seq[int]

var
  data = (@("aa", "bb"), @(11, 22))

macro mymacro(data: Tconfig): stmt =
   ...
4

3 に答える 3

1

私はあなたが何を意味するのか 100% 確信しているわけではありませんが、コンテキストから、必要な機能はmacros.toStrLit、AST から文字列リテラル ノードを生成する の機能のように見えます。例:

import macros, strutils

macro showExpr(x: expr): stmt =
  parseStmt("echo(" & x.toStrLit.strVal.escape & ")")

showExpr("x" & "y")

ただし、AST を直接変換することを検討してください。コードを文字列として生成および再解析すると、引用符 (.escape上記に注意) やインデントなどで予期せぬ事態が発生する可能性があるためです。

于 2013-12-18T12:27:46.237 に答える
1

マクロ内のデータ構造をトラバースする必要がある場合、またはトラバースしたい場合は、最初に変数を a にする必要がありますconst。ランタイム用なので、マクロはノードvarを取得するだけです。nnkSymこれを行うと、constそこに手動で値を入力した場合と同じ入力が得られます。treeReprマクロを使用して、echoどのような種類の AST を取得し、どのようにそれを実行するかを示します。

import macros

type
  Tconfig = tuple
    letters: seq[string]
    numbers:seq[int]

const data: Tconfig = (@["aa", "bb"], @[11, 22])

macro mymacro(data: Tconfig): stmt =
  echo "AST being passed in:\n", treeRepr(data)
  echo "root type is ", data.kind
  echo "number of children ", len(data)
  let n1 = data[0]
  echo "first child is ", n1.kind
  echo "first child children ", len(n1)
  let e2 = n1[1]
  echo "second exp child is ", e2.kind
  echo "second exp child children ", len(e2)
  let v1 = e2[0]
  echo "first seq value is ", v1.kind
  echo "first seq value children ", len(v1)
  echo "Final literal is ", v1.strVal

when isMainModule:
  mymacro(data)

その例をコンパイルすると、次の出力が得られます。

AST being passed in:
Par
  ExprColonExpr
    Sym "letters"
    Bracket
      StrLit aa
      StrLit bb
  ExprColonExpr
    Sym "numbers"
    Bracket
      IntLit 11
      IntLit 22
root type is nnkPar
number of children 2
first child is nnkExprColonExpr
first child children 2
second exp child is nnkBracket
second exp child children 2
first seq value is nnkStrLit
first seq value children 0
Final literal is aa
于 2013-12-18T19:38:32.837 に答える