亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

Julia體驗 語言特性 元編程,宏

標簽:
深度學習

上接语言基础,个人感觉这门语言和自己心中的理想国相距较远,乘着热情还在,我挑一些有趣的东西再写写。

元编程

元编程即对代码进行处理的代码,可以使用Meta.parse()解析出参数代码的类AST表示,也可以使用quote ... end简化:

julia> multiStmt = Meta.parse(raw"a=1;b=2;t=a;a=b;b=t;println(a,b)"):($(Expr(:toplevel, :(a = 1), :(b = 2), :(t = a), :(a = b), :(b = t), :(println(a, b)))))

julia> typeof(multiStmt)
Expr

julia> ast = quote
       x=1
       y=2
       res=x+y       endquote    #= REPL[21]:2 =#
    x = 1
    #= REPL[21]:3 =#
    y = 2
    #= REPL[21]:4 =#
    res = x + yendjulia> typeof(ast)
Expr

使用dump()获得更可读的表示:

julia> dump(multiStmt)
Expr
  head: Symbol toplevel
  args: Array{Any}((6,))    1: Expr
      head: Symbol =
      args: Array{Any}((2,))        1: Symbol a        2: Int64 1
    2: Expr
      head: Symbol =
      args: Array{Any}((2,))        1: Symbol b        2: Int64 2
    3: Expr
      head: Symbol =
      args: Array{Any}((2,))        1: Symbol t        2: Symbol a    4: Expr
      head: Symbol =
      args: Array{Any}((2,))        1: Symbol a        2: Symbol b    5: Expr
      head: Symbol =
      args: Array{Any}((2,))        1: Symbol b        2: Symbol t    6: Expr
      head: Symbol call
      args: Array{Any}((3,))        1: Symbol println        2: Symbol a        3: Symbol b

expr有两部分,expr.head表示出这个表达式的类型,expr.args表示出剩余的参数:

julia> multiStmt.head
:toplevel

julia> multiStmt.args6-element Array{Any,1}:
 :(a = 1)
 :(b = 2)
 :(t = a)
 :(a = b)
 :(b = t)
 :(println(a, b))

如果我们typeof head会发现,它是一种名为Symbol的类型:

julia> typeof(multiStmt.head)Symbol

Symbol类型可以使用:name进行定义,也可以使用Symbol类型的构造创建:

julia> :str
:str

julia> typeof(:str)Symboljulia> Symbol("str2")
:str2

julia> typeof(Symbol("str2"))==typeof(:str)true

最后我们使用eval()h函数传入Expr类型参数求值:

julia> eval(ast)3julia> eval(multiStmt)21

这就给了我们一种使用代码操纵代码的方式:

julia> add = Expr(:call,:-,:a,:b):(a - b)

julia> a = 11julia> b= 22julia> eval(add)
-1

Julia的宏由macro ... end定义

julia> macro hello(name)       return "hello,my name is "*name
       end
@hello (macro with 1 method)

julia> println(@hello("Andrew"))
hello,my name is Andrew

julia> println(@hello "Andrew")
hello,my name is Andrew

使用宏可以像函数一样加括号也可以宏名 参数1 参数2 ...
类似C/C++的宏的概念,Julia的宏也是实施的替换操作
所以上述println(@hello "Andrew")会被替换为println("hello, my name is Andrew"),可以使用@macroexpand获得展开后的结果

julia> @macroexpand println(@hello "Andrew")
:(println("hello,my name is Andrew"))

原文出处:https://www.cnblogs.com/racaljk/p/9502266.html

點擊查看更多內容
1人點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消