Julia体验 语言特性 元编程,宏
上接语言基础,就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体验 语言特性 元编程,宏的更多相关文章
- Julia体验 语言基础
以前听说过Julia,不过那时候官网还处于时不时宕机状态,最近Julia发布了1.0 released版本到处都是它的资讯,官网良心自带简体中文,趁着热度我也来试试,顺便聊记一二. 关于Julia J ...
- 元编程 (meta-programming)
元编程 (meta-programming) 术语 meta:英语前缀词根,来源于希腊文.中国大陆一般翻译成"元". 在逻辑学中,可以理解为:关于X的更高层次,同时,这个更高层次的 ...
- 3-11 《Ruby元编程》第4章block块 3-12
第4章代码块blocks 基础知识 作用域:用代码块携带variables through scopes 通过传递block给instance_eval方法来控制作用域. 把block转换为Proc, ...
- C++11新特性之六——元编程
C++11新特性之六——元编程
- LINQ体验(2)——C# 3.0新语言特性和改进(上篇)
整体来说.Visual Studio 2008和.NET 3.5是建立在.NET2.0核心的基础之上,.NET2.0核心本身将不再变化(假设不了解.NET2.0的朋友,请參看MSDN或者一些经典的书籍 ...
- c++ 模板元编程的一点体会
趁着国庆长假快速翻了一遍传说中的.大名鼎鼎的 modern c++ design,钛合金狗眼顿时不保,已深深被其中各种模板奇技淫巧伤了身...论语言方面的深度,我看过的 c++ 书里大概只有 insi ...
- C++模板元编程(C++ template metaprogramming)
实验平台:Win7,VS2013 Community,GCC 4.8.3(在线版) 所谓元编程就是编写直接生成或操纵程序的程序,C++ 模板给 C++ 语言提供了元编程的能力,模板使 C++ 编程变得 ...
- C语言表驱动法编程实践
数据压倒一切.如果选择了正确的数据结构并把一切组织的井井有条,正确的算法就不言自明.编程的核心是数据结构,而不是算法. ——Rob Pike 说明 本文基于这样的认识:数据是易变的,逻辑是稳定的. ...
- 引用内部函数绑定机制,R转义字符,C++引用,别名,模板元,宏,断言,C++多线程,C++智能指针
1.引用内部函数绑定机制 #include<iostream> #include<functional> usingnamespacestd; usingnamespac ...
随机推荐
- CreateWaitableTimer和SetWaitableTimer
负值表示相对时间,正值表示绝对时间,定时器精度为100ns (1ns=1/10亿 s),所以 -50000000 代表5秒,详见MSDN. 程序一为自动重置(先等待5秒,然后每1秒输出一次): #in ...
- python 三元表达式、列表推导式、生成器表达式
一 三元表达式.列表推导式.生成器表达式 一 三元表达式 name=input('姓名>>: ') res='mm' if name == 'hahah' else 'NB' print( ...
- java获取多个汉字的拼音首字母
本文属于http://java.chinaitlab.com/base/803353.html原创!!! public class PinYin2Abbreviation { // 简体中文的编码范围 ...
- 进程与进程之间通信Manager
#!/usr/bin/env python from multiprocessing import Process,Manager #Manager进程与进程之间通信 def Foo(i,dic): ...
- elasticsearch2.x优化小结(单节点)
最近es一直卡顿,甚至宕机,用bigdesk看了,才晓得,es一直用的默认配置(可以看出我有多懒,先前数据量小,es足以应付,现在数据量上去后就不行了). 这里总结三方面: 1.提升jvm内存 vi ...
- centos系统查看本机IP地址
centos系统查看本机IP地址,输入 ifconfig -a查看 centos查询上网公网IP输入 curl ifconfig.me 命令即可查看 centos查询上网网关IP,tracepath ...
- 数组中的最大值以及最小值的位置变换的问题(C++)
将一个5×5的数组中的最大值放到数组的中心位置 分析:遍历数组,找到最大的元素,然后将该元素与中心位置的元素交换位置 #include<iostream> #include <std ...
- OpenStack基础及概念
一.云计算基本概念解析 1.1什么是云计算 云计算:代表计算资源向云水循环一样,按需分配,循环利用. 1.2.云计算分类 狭义:IT基础设施的交互和使用模式,通过网络以按需,易扩展的方式 ...
- 激光SLAM Vs 视觉SLAM
博客转载自:https://www.leiphone.com/news/201707/ETupJVkOYdNkuLpz.html 雷锋网(公众号:雷锋网)按:本文作者SLAMTEC(思岚科技公号sla ...
- spark sql使用sequoiadb作为数据源
目前没有实现,理一下思路,有3中途径: 1:spark core可以使用sequoiadb最为数据源,那么是否spark sql可以直接操作sequoiadb. 2: spark sql支持Hive, ...