Как мне разобрать строку во время компиляции в Nimrod?

Проходя черезвторая часть урока Нимрода Я достиг той части, где объясняются макросы. В документации написано, что они запускаются во время компиляции, поэтому я подумал, что мог бы выполнить какой-то анализ строк, чтобы создать собственный язык для конкретного домена. Тем не менее, нет примеров того, как это сделать,пример макроса отладки не показывает, как каждый имеет дело со строковым параметром.

Я хочу конвертировать код как:

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

... во что-то, что я бы написал вручную:

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

Очевидно, этот пример не очень полезен, но я хочу взглянуть на что-то простое (разделение на две строки / запятая, затем преобразование), которое может помочь мне реализовать что-то более сложное.

Моя проблема здесь в том, как макрос получает входную строку, анализирует ее (во время компиляции!) И какой код может выполняться во время компиляции (это просто подмножество языка? Могу ли я использовать макросы / код из других импортные модули)?

РЕДАКТИРОВАТЬНа основе ответа вот возможное кодовое решение вопроса:

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

Ответы на вопрос(1)

Ваш ответ на вопрос