我想製作一個宏來替代在幾個函數中使用的長表達式來提高代碼的可讀性。每個函數都具有相同的名稱,用於宏中,但是編譯函數Julia時,宏中使用的變量即使在轉義時也是未定義的。小例子:朱莉婭 - UndefVarError宏,當在函數中使用但不是在REPL中
julia> macro mtest()
esc(x)
end
@mtest (macro with 1 method)
julia> ftest(x) = @mtest
ERROR: UnderVarError: x not defined
現在這樣會很奇怪:
julia> x = 1
1
julia> @mtest
1
julia> ftest(x) = @mtest
ftest (generic function with 1 method)
julia> ftest(2)
1
爲什麼沒有這個功能定義簡單計算爲ftest(x) = x
?我如何告訴宏從調用函數的範圍而不是從REPL使用x
?我想用一個宏可以替換爲文本的文字塊,如C庫我使用:
#define CHECK_STUFF \
big \
complicated \
expression \
involving x;
void func(x, y, z) {
//stuff
CHECK_STUFF
//more stuff
}
在這種情況下CHECK_STUFF
必須是宏,不的功能,因爲它包含goto
到func
中的標籤。我的任務是把這個翻譯成朱莉婭。
在宏中,'x'需要符號':x'。你的宏指的是全局變量'x',它只在你在REPL中定義它之後才存在。另見http://stackoverflow.com/q/37358528/6172490。 – tim
更具體地說,宏中使用的變量指的是宏定義模塊中的全局變量。在你的情況下,它是在主模塊中定義的,因此是指在那裏定義的'x'。你的宏然後返回只包含'x'的字面值的表達式。在這種情況下,轉義不會改變任何內容。查看'macroexpand'的輸出,這在編寫宏時非常有用。 – tim