2015-04-05 42 views
4

我只是在學習宏,我對變量名以#開頭的可能性感到困惑,但這正是宏成功做到的。例如,如果我想設置一個變量等於4:爲什麼變量可以從Julia宏命名中開始#

macro testMacro(sym) 
    esym = esc(sym) 
    quote 
    temp = 4 
    $esym = temp 
    return 
    end 
end 

然後

julia> macroexpand(:(@testMacro α)) 
quote # none, line 4: 
    #132#temp = 4 # line 5: 
    α = #132#temp # line 6: 
    return 
end 

julia> @testMacro α 

julia> α 
4 

通知臨時變量名爲#132#溫度,這是我的理解是,它會在被評估REPL就是這樣。然而,這似乎是不可能的,因爲整條線現在在技術上應該是一個評論。

如果我看一下宏中的第一個表達式,我會得到一些我無法重現的東西。

julia> macroexpand(:(@testMacro α)).args[2] 
:(#132#temp = 4) 

julia> ex = :(#132#temp = 4) 


ERROR: syntax: incomplete: premature end of input 

這是怎麼回事?我想我基本上有兩個問題。 1.)如果可能,我怎樣才能定義一個以#開頭的變量(甚至在表達式中)? 2.)假設存在這樣一個變量,朱莉婭如何設法不把它當作評論呢?

回答

11

這是怎麼回事?

這裏的名稱是保留macro hygiene,以便在宏中定義的名稱不與環境中的其他名稱衝突。 (這是可以改變這種使用esc

1)如果有可能,我怎麼能定義一個變量(甚至在一個表達式)以#開始?

我不知道爲什麼你會這樣做,因爲訪問該變量將是繁瑣的。但它是可能的:

julia> eval(Expr(:(=), symbol("#s"), 1)) 
1 

julia> whos() 
#s       Int64 
Base       Module 
Core       Module 
LastMain      Module 
Main       Module 
ans       Int64 

julia> eval(symbol("#s")) 
1 

2)假設這樣一個變量的存在,如何管理朱莉婭不把它作爲一個評論?

評論在解析器級別被丟棄,所以系統的其餘部分從未真正看到它們。如上所示,可以從包含#的任意字符串創建符號,這是宏代碼在內部執行的操作。

相關問題