博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Julia体验 语言特性 元编程,宏
阅读量:5101 次
发布时间:2019-06-13

本文共 2407 字,大约阅读时间需要 8 分钟。

上接语言基础,就release-1.1来看,个人感觉这门语言和自己心中的理想国相距较远。这门语言因为受众不仅仅是程序员有很多让人迷惑的设计,但是奇怪的是它的语法等表象设计虽然暗示这不是专门为程序员准备的,内在的却提供了大量非程序员不可用的高级特性,库。

乘着热情还在,我挑一些有趣的东西再写写。

元编程

元编程即对代码进行处理的代码,可以使用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)Exprjulia> 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:topleveljulia> 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:strjulia> typeof(:str)Symboljulia> Symbol("str2"):str2julia> 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 Andrewjulia> 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/ysherlock/p/9502266.html

你可能感兴趣的文章
Silverlight实用窍门系列:19.Silverlight调用webservice上传多个文件【附带源码实例】...
查看>>
2016.3.31考试心得
查看>>
20. 多态
查看>>
pip国内源
查看>>
docker 从本地拷贝文件
查看>>
HTTP状态码
查看>>
转载一个关于javascript弹出窗口的详解
查看>>
THU的告诫
查看>>
让字体在div容器中垂直居中
查看>>
Android Weekly Notes Issue #221
查看>>
mmap和MappedByteBuffer
查看>>
Linux的基本操作
查看>>
C 算法
查看>>
使用fiddler进程弱网测试
查看>>
jdk path
查看>>
敏捷开发笔记 - 设计
查看>>
我需要在电脑上安装C编译器
查看>>
oracle一次删除多张表
查看>>
H3C ICMP
查看>>
Python Numpy 介绍
查看>>