マクロ内に新しい変数を作成したいと思います。 (「unexpected token: %
を」)Crystalマクロの新しい変数に値を割り当てる
EDITを
macro test()
%p = "a = 3"
%p
end
test()
puts(a)
が、私は、エラーundefined local variable or method 'a'
を取得し、私は{{ }}
または{% %}
で%p
をラップしようとしたが、それはコンパイルされません:私のコードはに減らすことができます
ここにいくつかの文脈があります。
いくつかの共通フィールドを持つ2つの名前付きタプルを使用しなければならないことが多く、JSONに変換されて別のクライアントに送信されます。
a = {x: xx, y: yy, w: ww}
b = {x: xx, y: yy, z: zz}
現在、私は両方を繰り返し書きます。 ww、xx、yy、zzの値はコンパイル時には分かりません。私は、コンパイル時にマージを行うマクロへの呼び出しに置き換えたいと思います。
私は手動でコードI現在入力の行を作成して、次のコードを思い付いた:
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 = "= 3 A"; __temp_22; puts(a) 'は、私がこの構文を使用すると期待していたものですが、おそらくあなたは何か異なることを期待しています。しかし、あなたが期待したことを推測することはできませんので、あなたの質問を拡大してください。 –
私はいくつかの文脈を追加しました。 –
マクロは新しい変数を定義することはできません。変数は解析時に決定されます。たとえば、あるメソッドの中で 'a = 1'を実行すると、パーサーは' a'が変数であることを知ります。マクロ呼び出しの中でそれを行うと、パーサはそれを知りません。それはバグではなく、言語機能です。メソッドに突然現れる変数をバグが生じやすく混乱させる。 – asterite