QCon北京「鸿蒙专场」火热来袭!即刻报名,与创新同行~ 了解详情
写点什么

使用 ParseTree 进行 LINQ 风格查询和提取元数据

  • 2008-02-26
  • 本文字数:1779 字

    阅读完需:约 6 分钟

通过对.NET 中 LINQ 的介绍和对 LISP 的重拾兴趣,一类元编程被重新关注起来。在 LINQ 中,可以使用表达式树,例如一棵由一段代码表示的树。

LISP(或者类似语言)中,这种方法被称为或者宏展开。宏看上去很像函数调用,但不同的是函数调用在编译期就被估值,例如当代码载入的时候。宏可以得到宏调用的抽象语法树(AST),但是在AST 宏返回时宏调用会被替换掉。这也就是说,宏调用并不是一段被实际执行的代码,而是返回的AST 宏被执行了,例如宏调用展开的实际的代码。

Ruby 并不在语言级别支持 AST,于是有一些库做到了。最流行的一个要数 ParseTree 了,可以将 s 表达式作为 AST 返回。例如,符号紧凑列表和字符常量。有很多有用的工具就是基于 ParseTree 而构建的,例如:

  • Ruby2Ruby
    此工具可以将 ParseTree 的 AST 转化为格式化的 Ruby 源代码。这使得我们可以解析 Ruby 代码,在 AST 级别(而非源代码的字符级别的修改)修改它并最终重新生成可以运行的 Ruby 代码。
  • Heckle
    Ryan Davis 和 Kevin Clark 开发的工具,通过使用 Ruby2Ruby 在代码中引入随机修改来实现覆盖测试。

现在,一些新库采用了 LINQ 的方式来使用 ParseTree。 Ambition 允许用户使用 Ruby 语法来编写查询,例如:

LDAP::User.select { |m| m.name == 'jon' && m.age == 21 } 或者 SQL::User.select { |m| m.name == 'jon' && m.age == 21 }在块中的代码实际上永远都不会运行,相反会被 ParseTree 用来得到 AST。它会被分析并转换成目标查询语言的查询语句。Ambition 提供可扩展的适配器,可以允许用户为Ruby 的AST 到查询语言的转化来编写新的转换器。

另外一个采用了此类型查询的库是 Sequel 。作为一个 ORM, Sequel 同样允许用户使用 Ruby 来编写查询

old_nonruby_posts = posts.filter {:stamp > 1.month.ago && :category != 'ruby'}需要重点注意的是,和 Ambition 不同,这仅仅是 Sequel 编写查询的方法之一,它同样支持通过字符串常量来编写查询。

一种很不同的 Ruby 代码 AST 使用方法可以在 Merb 中找到。它被用在参数化 Action 中:

参数化 Action:
如果你在你的 action 方法中指定了参数,收到的查询参数将会自动被正确的指定。示例如下:

<span>class Foos < Merb::Controller</span><p><span>  def index(id, search_string = "%")</span><span>   @foo = Foo.find_with_search(id, search_string)</span><span>  end</span><span>end </span> </p>> 访问 /foos/index/12 将会调用 index 方法并传入参数“12”和“%”(默认值)。访问 /foos/index 将 会抛出一个 BadBehavior 错误(状态码 400),因为 id 是一个必须的参数,但是却没有被传入。访问 /foos/index/5? search_string=hello 将会调用 index 方法并传入参数“5”和“hello”。最后的示例说明你可以像是用一个真正的方法一般使用 action。

这个特性是通过查看处理 action 方法的 AST 并抽取默认参数来实现的。通过这种方法,可以实现一种通常并不可用的、类似于内视 / 反射的特性。这些示例展示了此类内视特性的强大。然而,Sequel 和 Merb 同时也显示出了此类方法的缺点:基于 ParseTree 的特性是非强制性的。例如,这些工具并不依赖它们。如果在系统中 ParseTree 不可用,则这些特性也不可用。这源自于 ParseTree 的本质就是原生 Ruby 扩展。一些原生扩展的部署问题已经被解决了,例如 Windows 上的 ParseTree 或者 MacOS X 上的 ParseTree

但是问题依然存在。ParseTree 并不支持 Ruby 1.9,尽管可能的解决方案正在考虑当中。Ruby 1.9 实际上通过 Ripper 实现了对 AST 的部分支持。关于 Ripper 的信息还非常少,但是已知可以将它用作一个 SAX 类型的解析器。例如:

require 'ripper'<br></br> class MyRipper < Ripper<br></br>  def on_gvar(node)<br></br>  puts node<br></br>  end<br></br> def on_int(node)<br></br>  puts node<br></br> end<br></br> # etc.<br></br> # Handle each element of the AST with an on_* method <br></br>end 可以这样来使用:
f = MyRipper.new("$foo = 1") <br></br>f.parse 除了 Ruby 1.9 以外,ParseTree 还提供了对其他可选 Ruby 实现的支持。Rubinius 大量的使用了 ParseTree 的 AST 表示。JRuby 几乎完全移植了 ParseTree,但是基于.NET 的 Ruby 实现似乎目前还不支持。查看原文链接 Using ParseTree for LINQ-style queries and extracting metadata

2008-02-26 19:571000
用户头像

发布了 80 篇内容, 共 21.0 次阅读, 收获喜欢 5 次。

关注

评论

发布
暂无评论
发现更多内容

vivo 游戏中心低代码平台的提效秘诀

vivo互联网技术

低代码 组件化 配置化 提效

转转实时OLAP分析场景技术选型与应用实践

转转技术团队

OLAP

实践GoF的23种设计模式:命令模式

华为云开发者联盟

Go 开发 华为云 12 月 PK 榜

国内外开源数据可视化工具对比:DataEase 与 MetaBase 对比

搞大屏的小北

DataEase Metabase 开源数据可视化

自学数据分析——重新认识数据分析

搞大屏的小北

数据分析 数据分析可视化

想做运维审计大屏?用这个工具就对了!

搞大屏的小北

大屏可视化 运维审计 审计大屏

南京公安研究院与秒云达成生态合作,携手赋能产业智能化发展

MIAOYUN

智慧公安 生态合作

贾斯特里尼&布鲁克斯葡萄酒,历经百年的传世经典

联营汇聚

使用DataEase分析销售数据有多方便?

搞大屏的小北

数据可视化 销售数据分析 数据展示

微信开放小程序运行SDK,自己的app也能运行小程序

Onegun

微信小程序 小程序容器

拒绝内卷挖掘境外新蓝海,华为云虚拟专用网络VPN有多特别?

爱科技的水月

DataEase单点登录之OIDC

搞大屏的小北

keycloak 单点登录 OIDC

一招搞定小白最头疼的数据大屏配色问题!

搞大屏的小北

色彩匹配 大屏配色

MySQL 慢查询日志分析(Filebeat+Elasticsearch+DataEase)

搞大屏的小北

MySQL慢查询 MySQL日志分析 MySQL日志可视化

同是弹性公网IP,华为云弹性公网IP的优势有哪些?

秃头也爱科技

HVML 解释器 PurC 0.9.2 发布;持续演进!

hvmlenvoy

编程语言 解释器 HVML

是不是你在找的推特GIF动图下载方法?!支持苹果安卓双系统使用!

frank

twitter 推特视频下载

DataEase 做出来好看吗?

搞大屏的小北

数据可视化 大屏可视化 DataEase

关于佛萨奇系统开发及原力元宇宙2.0佛萨奇系统开发方案

I8O28578624

用品质提升品味,贾斯特里尼&布鲁克斯葡萄酒

联营汇聚

有序存储对于高性能的意义

陈橘又青

算法

【大屏设计】数据大屏间距那点事-距离产生美

搞大屏的小北

大屏布局 报表布局 看板布局排版

线上GC故障:CMSGC太频繁,你知道这是什么鬼?

Java永远的神

程序员 性能优化 JVM java面试 GC

华为云连接CC——让多区域协同办公更高效更稳定

秃头也爱科技

弹性公网IP支持多产品灵活绑定或解绑,能为企业提供独立公网IP资源!

秃头也爱科技

葡萄酒越贵越好?贾斯特里尼&布鲁克斯刷新你的认知

联营汇聚

全网首发!华为云UCS正式商用

爱科技的水月

如何接受或拒绝 Excel 中的修订

在下毛毛雨

C# .net Excel 工作表 跟踪修订

京东金融APP-新交互技术“虚拟数字人”赋能世界杯主题营销

京东科技开发者

大数据 前端 Web 交互 虚拟人

预测式外呼算法模型的深度应用详解

中关村科金

人工智能 大数据 AI 智能

让数据说话-中国农业经济发展情况

搞大屏的小北

数据可视化 经济可视化 经济发展

使用ParseTree进行LINQ风格查询和提取元数据_Ruby_Werner Schuster_InfoQ精选文章