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

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

元编程

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

  1. julia> multiStmt = Meta.parse(raw"a=1;b=2;t=a;a=b;b=t;println(a,b)")
  2. :($(Expr(:toplevel, :(a = 1), :(b = 2), :(t = a), :(a = b), :(b = t), :(println(a, b)))))
  3. julia> typeof(multiStmt)
  4. Expr
  5. julia> ast = quote
  6. x=1
  7. y=2
  8. res=x+y
  9. end
  10. quote
  11. #= REPL[21]:2 =#
  12. x = 1
  13. #= REPL[21]:3 =#
  14. y = 2
  15. #= REPL[21]:4 =#
  16. res = x + y
  17. end
  18. julia> typeof(ast)
  19. Expr

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

  1. julia> dump(multiStmt)
  2. Expr
  3. head: Symbol toplevel
  4. args: Array{Any}((6,))
  5. 1: Expr
  6. head: Symbol =
  7. args: Array{Any}((2,))
  8. 1: Symbol a
  9. 2: Int64 1
  10. 2: Expr
  11. head: Symbol =
  12. args: Array{Any}((2,))
  13. 1: Symbol b
  14. 2: Int64 2
  15. 3: Expr
  16. head: Symbol =
  17. args: Array{Any}((2,))
  18. 1: Symbol t
  19. 2: Symbol a
  20. 4: Expr
  21. head: Symbol =
  22. args: Array{Any}((2,))
  23. 1: Symbol a
  24. 2: Symbol b
  25. 5: Expr
  26. head: Symbol =
  27. args: Array{Any}((2,))
  28. 1: Symbol b
  29. 2: Symbol t
  30. 6: Expr
  31. head: Symbol call
  32. args: Array{Any}((3,))
  33. 1: Symbol println
  34. 2: Symbol a
  35. 3: Symbol b

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

  1. julia> multiStmt.head
  2. :toplevel
  3. julia> multiStmt.args
  4. 6-element Array{Any,1}:
  5. :(a = 1)
  6. :(b = 2)
  7. :(t = a)
  8. :(a = b)
  9. :(b = t)
  10. :(println(a, b))

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

  1. julia> typeof(multiStmt.head)
  2. Symbol

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

  1. julia> :str
  2. :str
  3. julia> typeof(:str)
  4. Symbol
  5. julia> Symbol("str2")
  6. :str2
  7. julia> typeof(Symbol("str2"))==typeof(:str)
  8. true

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

  1. julia> eval(ast)
  2. 3
  3. julia> eval(multiStmt)
  4. 21

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

  1. julia> add = Expr(:call,:-,:a,:b)
  2. :(a - b)
  3. julia> a = 1
  4. 1
  5. julia> b= 2
  6. 2
  7. julia> eval(add)
  8. -1

Julia的宏由macro ... end定义

  1. julia> macro hello(name)
  2. return "hello,my name is "*name
  3. end
  4. @hello (macro with 1 method)
  5. julia> println(@hello("Andrew"))
  6. hello,my name is Andrew
  7. julia> println(@hello "Andrew")
  8. hello,my name is Andrew

使用宏可以像函数一样加括号也可以宏名 参数1 参数2 ...

类似C/C++的宏的概念,Julia的宏也是实施的替换操作

所以上述println(@hello "Andrew")会被替换为println("hello, my name is Andrew"),可以使用@macroexpand获得展开后的结果

  1. julia> @macroexpand println(@hello "Andrew")
  2. :(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. 无人零售的黑科技:RFID技术

    无人零售的黑科技:RFID技术说起最近的热门话题,“无人零售商店”当属其一.自去年底,亚马逊推出第一家无人实体超市Amazon Go,到阿里.京东.大润发等各大企业纷纷加入,无人商店被推上了风口浪尖. ...

  2. mui封装的ajax请求

    由于项目中引进MUI框架,所以就不需要引进jquery,但需要和后台交互时,常写为jquery格式:所以笔者觉得有必要将mui封装的ajax请求在这里提一下: 1,mui框架基于htm5plus的XM ...

  3. windows 10微软账户不能访问局域网共享,但是本地账户可以访问

    windows10有时候无法访问局域网的共享文件夹.会提示没有权限. 如果共享的文件夹已经设置为everyone,那么通常是windows 10用的是微软账户登录的. 有两个方案可以处理这种情况. 一 ...

  4. 【WebRTC】术语

    WebRTC,名称源自网页实时通信(英语:Web Real-Time Communication)的缩写,是一个支持网页浏览器进行实时语音对话或视频对话的API.它于2011年6月1日开源并在Goog ...

  5. PL/SQL批处理语句(二)FORALL

    PL/SQL批处理语句(二)FORALL 我们知道PL/SQL程序中运行SQL语句是存在开销的,因为SQL语句是要提交给SQL引擎处理,这种在PL/SQL引擎和SQL引擎之间的控制转移叫做上下文却换, ...

  6. apaache php 日记设计

    有个客户服务器是用apache搭建的,最近总是感觉站很慢,服务器很慢很卡,有时候甚至网 站都打不开,后来经过排查分析原来是里面的access.log和error.log这两个文件要经常上去看,和清理, ...

  7. JavaScript中的匿名函数及函数的闭包(转)

    JavaScript中的匿名函数及函数的闭包  https://www.cnblogs.com/wl0000-03/p/6050108.html 1.匿名函数 函数是JavaScript中最灵活的一种 ...

  8. Cocos2d-js 热更新学习笔记

    转载至: http://blog.csdn.net/pt_xxj/article/details/68927705 为什么还要再写一篇关于cocos2d js热更新的笔记,最单纯的想法就是记录心得,另 ...

  9. ruby 【rails在win7_64位操作系统安装】

    gem update --system --source http://production.s3.rubygems.org 安装截图

  10. 项目一:第十四天 1.在realm中动态授权 2.Shiro整合ehcache 缓存realm中授权信息 3.动态展示菜单数据 4.Quartz定时任务调度框架—Spring整合javamail发送邮件 5.基于poi实现分区导出

    1 Shiro整合ehCache缓存授权信息 当需要进行权限校验时候:四种方式url拦截.注解.页面标签.代码级别,当需要验证权限会调用realm中的授权方法   Shiro框架内部整合好缓存管理器, ...