Я хотел бы создать новую переменную в макросе. Мой код можно сократить до:Назначение значения новой переменной в макросе Crystal
macro test()
%p = "a = 3"
%p
end
test()
puts(a)
но я тогда получаю ошибку undefined local variable or method 'a'
Я попытался обернуть %p
в {{ }}
или {% %}
, но он не компилируется («unexpected token: %
»)
EDIT
Вот несколько контекстов.
Мне часто приходится использовать два именованных кортежа с некоторыми общими полями, которые затем преобразуются в JSON и отправляются различным клиентам.
a = {x: xx, y: yy, w: ww}
b = {x: xx, y: yy, z: zz}
В настоящее время я пишу оба из них с повторением. Значения для ww, xx, yy, zz не известны во время компиляции. Я хотел бы заменить это вызовом макроса, делающего слияние во время компиляции.
я придумал следующий код, который создает строку кода, я в настоящее время вводится вручную:
macro merge(common, aOnly, bOnly)
# Start, middle and end parts of target instructions
%p1a = "a = {"
%p1b = "b = {"
%p2 = ""
%p2a = ""
%p2b = ""
%p3 = "}"
# Creating the middle part
{% for key, value in common %}
%p2 = %p2 + "{{key.id}}" + ": " + "{{value}}" + ','
{% end %}
%p2a = %p2
{% for key, value in aOnly %}
%p2a = %p2a + "{{key.id}}" + ": " + "{{value}}" + ','
{% end %}
%p2b = %p2
{% for key, value in bOnly %}
%p2b = %p2b + "{{key.id}}" + ": " + "{{value}}" + ','
{% end %}
# Removing unneeded comma
%p2a = %p2a.chomp(",")
%p2b = %p2b.chomp(",")
# Display
puts(%p1a + %p2a + %p3)
puts(%p1b + %p2b + %p3)
# Definition of new variables
%p1a + %p2a + %p3
%p1b + %p2b + %p3
end
merge({x: xx, y: yy}, {w: ww}, {z: zz})
[Ваша программа] (https://carc.in/#/r/1nfd) расширяется до: '__temp_22 =" a = 3 "; __temp_22; puts (a) ', что я и ожидал бы с учетом этого синтаксиса, но вы, вероятно, ожидали чего-то другого. Но невозможно догадаться, что вы ожидали, поэтому, пожалуйста, разверните свой вопрос. –
Я добавил некоторый контекст. –
Макросы не могут определять новые переменные. Переменные определяются во время разбора. Например, если вы используете 'a = 1' внутри метода, синтаксический анализатор теперь знает, что' a' является переменной. Если вы делаете это внутри макросообщения, парсер не знает об этом. И это не ошибка, это языковая функция. Внезапное появление переменных в методе является ошибкой и запутанностью. – asterite