上接语言基础,就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)
Expr julia> ast = quote
x=1
y=2
res=x+y
end
quote
#= REPL[21]:2 =#
x = 1
#= REPL[21]:3 =#
y = 2
#= REPL[21]:4 =#
res = x + y
end julia> 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.args
6-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)
Symbol julia> Symbol("str2")
:str2 julia> typeof(Symbol("str2"))==typeof(:str)
true

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

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

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

julia> add = Expr(:call,:-,:a,:b)
:(a - b) julia> a = 1
1 julia> b= 2
2 julia> 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"))

Julia体验 语言特性 元编程,宏的更多相关文章

  1. Julia体验 语言基础

    以前听说过Julia,不过那时候官网还处于时不时宕机状态,最近Julia发布了1.0 released版本到处都是它的资讯,官网良心自带简体中文,趁着热度我也来试试,顺便聊记一二. 关于Julia J ...

  2. 元编程 (meta-programming)

    元编程 (meta-programming) 术语 meta:英语前缀词根,来源于希腊文.中国大陆一般翻译成"元". 在逻辑学中,可以理解为:关于X的更高层次,同时,这个更高层次的 ...

  3. 3-11 《Ruby元编程》第4章block块 3-12

    第4章代码块blocks 基础知识 作用域:用代码块携带variables through scopes 通过传递block给instance_eval方法来控制作用域. 把block转换为Proc, ...

  4. C++11新特性之六——元编程

    C++11新特性之六——元编程

  5. LINQ体验(2)——C# 3.0新语言特性和改进(上篇)

    整体来说.Visual Studio 2008和.NET 3.5是建立在.NET2.0核心的基础之上,.NET2.0核心本身将不再变化(假设不了解.NET2.0的朋友,请參看MSDN或者一些经典的书籍 ...

  6. c++ 模板元编程的一点体会

    趁着国庆长假快速翻了一遍传说中的.大名鼎鼎的 modern c++ design,钛合金狗眼顿时不保,已深深被其中各种模板奇技淫巧伤了身...论语言方面的深度,我看过的 c++ 书里大概只有 insi ...

  7. C++模板元编程(C++ template metaprogramming)

    实验平台:Win7,VS2013 Community,GCC 4.8.3(在线版) 所谓元编程就是编写直接生成或操纵程序的程序,C++ 模板给 C++ 语言提供了元编程的能力,模板使 C++ 编程变得 ...

  8. C语言表驱动法编程实践

    数据压倒一切.如果选择了正确的数据结构并把一切组织的井井有条,正确的算法就不言自明.编程的核心是数据结构,而不是算法. ——Rob Pike  说明 本文基于这样的认识:数据是易变的,逻辑是稳定的. ...

  9. 引用内部函数绑定机制,R转义字符,C++引用,别名,模板元,宏,断言,C++多线程,C++智能指针

     1.引用内部函数绑定机制 #include<iostream> #include<functional> usingnamespacestd; usingnamespac ...

随机推荐

  1. Java学习之数据的时间及热度属性

    背景:在JAVA开发的电商网站中都有海量商品信息,绝大部分电商网站都有为了让用户尽快的获取到想要的商品提供流行商品和推荐商品的概念,我的理解是从两个方面反映了商品的时间维度和热度:流行商品是指横向所有 ...

  2. mybatis如何防止sql注入(1)

    sql注入大家都不陌生,是一种常见的攻击方式,攻击者在界面的表单信息或url上输入一些奇怪的sql片段,例如“or ‘1’=‘1’”这样的语句,有可能入侵参数校验不足的应用程序.所以在我们的应用中需要 ...

  3. hibernate 事务的隔离级别

    脏读不可重复读幻读可序列化(符合事务的四个特性的正常情况 ) 解释: 脏读:事务A对数据1做了更新,但是还没有来得及提交 此时事务B对数据1进行了查询获得了事务A更新后的数据, 但是事务A因为一些原因 ...

  4. 第八章 JVM内存管理(待续)

    物理内存与虚拟内存 内核空间与用户空间 在Java中哪些组件需要使用内存 JVM内存结构 JVM内存分配策略 JVM内存回收策略 内存问题分析

  5. 【转载】C语言综合实验1—学生信息管理系统

    http://www.cnblogs.com/Anker/archive/2013/05/06/3063436.html 实验题目:学生信息管理系统 实验要求:用户可以选择1-7可以分别进行学生信息的 ...

  6. does not contain bitcode. You must rebuild it with

    *** does not contain bitcode. You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE ...

  7. Unknown error: Unable to build: the file dx.jar was not loaded from the SDK folder!

    Eclipse 编译没问题,但是运行就出现这个报错:Unknown error: Unable to build: the file dx.jar was not loaded from the SD ...

  8. 框架之 hibernate之关联关系映射

    案例:完成CRM的联系人的保存操作 需求分析 1. 因为客户和联系人是一对多的关系,在有客户的情况下,完成联系人的添加保存操作 技术分析之Hibernate的关联关系映射之一对多映射(重点) 1. J ...

  9. PCL—关键点检测(rangeImage)低层次点云处理

    博客转载自:http://www.cnblogs.com/ironstark/p/5046479.html 关键点又称为感兴趣的点,是低层次视觉通往高层次视觉的捷径,抑或是高层次感知对低层次处理手段的 ...

  10. p3634 [APIO2012]守卫

    传送门 分析 1.先预处理出不被0覆盖的点,然后对每个点处理出在它左边离他最近的点和在他右边理他最近的点. 2.对于每个至少存在一个忍者的区间,先将它左右边界处理为不被0所覆盖.排序后将包含其他区间的 ...