¿Cómo puedo analizar una cadena en tiempo de compilación en Nimrod?

Ir a travésLa segunda parte del tutorial de Nimrod. He llegado a la parte donde se explican las macros. La documentación dice que se ejecutan en tiempo de compilación, así que pensé que podría hacer un análisis de cadenas para crearme un lenguaje específico de dominio. Sin embargo, no hay ejemplos de cómo hacer esto, elejemplo de macro de depuración no muestra cómo se trata con un parámetro de cadena.

Quiero convertir código como:

instantiate("""
    height,f,132.4
    weight,f,75.0
    age,i,25
    """)

... en algo que a mano escribiría como:

var height: float = 132.4
var weight: float = 75.0
var age: int = 25

Obviamente, este ejemplo no es muy útil, pero quiero ver algo simple (división multilínea / coma, luego transformación) que podría ayudarme a implementar algo más complejo.

Mi problema aquí es cómo la macro obtiene la cadena de entrada, la analiza (¡en tiempo de compilación!), Y qué tipo de código puede ejecutarse en tiempo de compilación (¿es solo un subconjunto de un idioma? ¿Puedo usar macros / código de otros módulos importados)?

EDITAR: Basado en la respuesta, aquí hay una posible solución de código para la pregunta:

import macros, strutils

# Helper proc, macro inline lambdas don't seem to compile.
proc cleaner(x: var string) = x = x.strip()

macro declare(s: string): stmt =
  # First split all the input into separate lines.
  var
    rawLines = split(s.strVal, {char(0x0A), char(0x0D)})
    buf = ""

  for rawLine in rawLines:
    # Split the input line into three columns, stripped, and parse.
    var chunks = split(rawLine, ',')
    map(chunks, cleaner)

    if chunks.len != 3:
      error("Declare macro syntax is 3 comma separated values:\n" &
        "Got: '" & rawLine & "'")

    # Add the statement, preppending a block if the buffer is empty.
    if buf.len < 1: buf = "var\n"
    buf &= "  " & chunks[0] & ": "

    # Parse the input type, which is an abbreviation.
    case chunks[1]
    of "i": buf &= "int = "
    of "f": buf &= "float = "
    else: error("Unexpected type '" & chunks[1] & "'")
    buf &= chunks[2] & "\n"

  # Finally, check if we did add any variable!
  if buf.len > 0:
    result = parseStmt(buf)
  else:
    error("Didn't find any input values!")

declare("""
x, i, 314
y, f, 3.14
""")
echo x
echo y

Respuestas a la pregunta(1)

Su respuesta a la pregunta