Julia Macro Summary

Julia code is represented by objects that can be created and manipulated from within the language.
Macro is used to generate code.

Expr

Abstract syntax tree

Julia code will be parsed into Expr,
eg:

 julia> dump(r)
 Expr
   head: Symbol =
   args: Array(Any,(2,))
     1: Symbol a
     2: Int64 1
   typ: Any

The expr works like other code.

Fields

head: identifying the kind of expression. eg: :call, :+, :block
args, an array of subexpressions.
typ, field is used by type inference to store type annotations,
isn't used for most time

Usage

Quoting

   ex = :(a+b*c+1)
   ex2 = quote x=1
               y=2
               x+y
        end
   ex2.head
 # block
 #+END_SRC

Use Expr

   a, b, c = 1, 2, 3
   ex1 = Expr(:call)
   ex1.args = [:*, :b, :c]

   ex = Expr(:call)
   ex.args = [:+, :a, ex1]

   eval(ex)
   7

   Meta.show_sexpr(ex)

Macro

How it works

Julia macro
A macro is a way of generating a new output expression, given an unevaluated input expression.
When your Julia program runs, it first parses and evaluates the macro,
and the processed code produced by the macro is eventually evaluated like an ordinary expression.

  macro foo()
    println("macro foo is evalued")
    :("foo")
  end


  function f()
    println("f is execulated")
    @foo()
  end

  # got 'macro foo is evalued' in REPL,
  # so this means, f is compiled and the macro generate the code.

  'f.env.defs.func.code '
  will got
  AST(:($(Expr(:lambda, Any[], Any[Any[],Any[],Any[]], :(begin  # none, line 2:
                                                           println("f is execulated") # line 3:
                                                           return "foo"
                                                         end)))))
  f()
  # f is execulated
  # "foo"

Why we need macro?

Allow the programmer to generate and include fragments of customized code before the full program is run

Methods: eval, $, :, esc

1. eval
   eval expression in top level
2. $
   will eval in a quote
3. :
   quote
4. esc
   escape
   Do not let Julia generates new symbol for a variable.

   The Clojure works in the opposite way, Clojure use variable# to generate symbol.

'$' vs 'eval'

 |       | $             | eval     |
 |-------+---------------+----------|
 | usage | :($a)         | eval(:a) |
 | scope | current place | global   |

More useful methods

 dump: dump expression
 Meta.show_sexpr: print an AST as an S-expression
 parse: parse string to expresion
 macroexpand: macroexpand(:(@macro(a)))

Tricks

Macro syntax sugar for string

   macro p_str(s)
     println(s)
   end

   p"abc"

macro with multiple lines

 @my_macro begin
    ...
    ...
 end

How to create a macro for creating a symbol in Julia

 macro s_str(p)
   :(symbol($p))
 end

 r = s"c"

 # another way
 macro s(p)
  QuoteNode(p)
 end
 r = @s(a)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末顿涣,一起剝皮案震驚了整個(gè)濱河市剂邮,隨后出現(xiàn)的幾起案子炮温,更是在濱河造成了極大的恐慌垒迂,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件肾筐,死亡現(xiàn)場(chǎng)離奇詭異哆料,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)吗铐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門东亦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人唬渗,你說我怎么就攤上這事典阵。” “怎么了镊逝?”我有些...
    開封第一講書人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵壮啊,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我撑蒜,道長(zhǎng)歹啼,這世上最難降的妖魔是什么玄渗? 我笑而不...
    開封第一講書人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮狸眼,結(jié)果婚禮上藤树,老公的妹妹穿的比我還像新娘。我一直安慰自己拓萌,他們只是感情好岁钓,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著微王,像睡著了一般屡限。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上炕倘,一...
    開封第一講書人閱讀 51,679評(píng)論 1 305
  • 那天钧大,我揣著相機(jī)與錄音,去河邊找鬼激才。 笑死拓型,一個(gè)胖子當(dāng)著我的面吹牛额嘿,可吹牛的內(nèi)容都是我干的瘸恼。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼册养,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼东帅!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起球拦,我...
    開封第一講書人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤靠闭,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后坎炼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體愧膀,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年谣光,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了檩淋。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡萄金,死狀恐怖蟀悦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情氧敢,我是刑警寧澤日戈,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站孙乖,受9級(jí)特大地震影響浙炼,放射性物質(zhì)發(fā)生泄漏份氧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一弯屈、第九天 我趴在偏房一處隱蔽的房頂上張望半火。 院中可真熱鬧,春花似錦季俩、人聲如沸钮糖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽店归。三九已至,卻和暖如春酪我,著一層夾襖步出監(jiān)牢的瞬間消痛,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來泰國(guó)打工都哭, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留秩伞,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓欺矫,卻偏偏與公主長(zhǎng)得像纱新,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子穆趴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 今天的心情起起落落脸爱,期待的事情如愿實(shí)現(xiàn),有種心想事成的感覺未妹,而生活中人際關(guān)系的處理讓我有點(diǎn)累簿废,總是怕說話得罪那個(gè)得...
    不講理要飛天閱讀 42評(píng)論 0 0
  • 本以為今年冬天不會(huì)有雪了,可短短一夜络它,雪已經(jīng)不經(jīng)意地把城市的一磚一瓦上覆上白色族檬。這場(chǎng)雪剛下在立春后面,有不怕...
    瘋子安娜閱讀 154評(píng)論 0 0