博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
julia学习笔记:元编程-表达式
阅读量:7070 次
发布时间:2019-06-28

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

简介


元编程是Lisp最强大的特性(参考官方文档介绍,我没有用过Lisp),元编程即将代码视作程序本身的数据结构,它使得程序可以改变生成自己的代码。

1、程序表示


这里介绍两种创建表达式的方式Meta.parse和Expr。

1). 用字符串表示代码,然后用Meta.parse转换成表达式,如:

julia> prog = "1 + 1""1 + 1"julia> ex1=Meta.parse(prog):(1 + 1)

2). 也可以直接通过表达式对象生成:

julia> ex2 = Expr(:call, :+, 1, 1):(1 + 1)

3) 表达式有两个部分,head和args:

julia> ex1.head:calljulia> ex1.args3-element Array{Any,1}:  :+ 1 1

4) 或者直接用dump查看表达式:

julia> dump(ex1)Expr  head: Symbol call  args: Array{Any}((3,))    1: Symbol +    2: Int64 1    3: Int64 1

2.表达式与求值


1). 冒号也可以用来创建表达式,和Meta.parse,Expr创建的表达式是等价的

julia> ex = :(a+b*c+1):(a + b * c + 1)

2). 使用quote ... end结构创建表达式

julia> ex = quote           x = 1           y = 2           x + y       endquote    #= none:2 =#    x = 1    #= none:3 =#    y = 2    #= none:4 =#    x + yend

3、插值(Interpolation)


插值即插入表达式中的值,用$开头表示,如下表达式$a即插值,

julia> a = 1;julia> ex = :($a + b):(1 + b)julia> ex1 = :(a+b):(a + b)

它与直接使用变量的ex1区别在于,ex中a的值已经被写入表达式中a如果在后面改变了,ex不变;而ex1中a的值是随a变化,如:

julia> b=44julia> eval(ex)5julia> eval(ex1)5julia> a=33julia> eval(ex)5julia> eval(ex1)7

4、嵌套引用表达式


使用quote...end 可以定义多行表达式,也可以定义单行表达式。甚至可以多层嵌套:

julia> x = :(1 + 2);julia> e = quote quote $x end endquote    #= none:1 =#    $(Expr(:quote, quote    #= none:1 =#    $(Expr(:$, :x))end))end

e是嵌套表达式。注意这里有一个Expr(:$, :x),表明x并没有被求值,它属于内层表达式。

对e求值可以得到内层表达式,这时$x会被求值:

julia> eval(e)quote    #= REPL[2]:1 =#    3 + 4end

使用双$符可以将x的值插入:

julia> e = quote quote $$x end endquote    #= none:1 =#    $(Expr(:quote, quote    #= none:1 =#    $(Expr(:$, :(1 + 2)))end))end

这里x已经被求值了,这个表达式定义之后就不随x改变了。

对e求值产生插值3:

julia> eval(e)quote    #= none:1 =#    3end

看一下多层嵌套的例子:

julia> e2=quote quote quote $$x end end endquote    #= REPL[37]:1 =#    $(Expr(:quote, quote    #= REPL[37]:1 =#    $(Expr(:quote, quote    #= REPL[37]:1 =#    $(Expr(:$, :($(Expr(:$, :x)))))end))end))endjulia> e3=quote quote quote $$$x end end endquote    #= REPL[38]:1 =#    $(Expr(:quote, quote    #= REPL[38]:1 =#    $(Expr(:quote, quote    #= REPL[38]:1 =#    $(Expr(:$, :($(Expr(:$, :(4 + 6))))))end))end))end

转载地址:http://tghll.baihongyu.com/

你可能感兴趣的文章
HDOJ2028 ( Lowest Common Multiple Plus ) 【水题,lcm】
查看>>
css--水平居中,垂直居中,自适应宽度
查看>>
Google Map API V3 离线版
查看>>
ZFS与数据去重
查看>>
《敏捷软件开发》学习笔记 第16章 单例模式和MonoState模式
查看>>
PHP拦截器的使用(转)
查看>>
获取GridView控件总列数
查看>>
Vim 中使用cscope
查看>>
HR系统+人脸识别
查看>>
RabbitMQ与AMQP协议详解
查看>>
metronic后台模板学习 -- 所用外部插件列表
查看>>
微软原版SQLHelper类
查看>>
首页设计的可用性和PET
查看>>
mongodb的分布式集群(1、主从复制)
查看>>
http://www.cnblogs.com/yaozhenfa/archive/2015/06/14/4574898.html
查看>>
动态为DropDownList添加Item
查看>>
spring NotWritablePropertyException异常
查看>>
在单页应用中,如何优雅的监听url的变化
查看>>
iOS开发证书"此证书的签发者无效"解决方法
查看>>
Python实现的通用树结构,支持节点索引,常数时间查找
查看>>