如何 0 成本启动全员 AI 技能提升?戳> 了解详情
写点什么

使用 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:571246
用户头像

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

关注

评论

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

AI大模型应用实践:通过RAG数据库实现大模型的私有化定制与优化

测试人

自研 ERP 系统与第三方物流 API 接口的组合技能

快递鸟

抓票啦小程序 - 12306抢票小助手

Chris Zhang

如何设计10亿用户级的微博Feed流系统并应对100W QPS的挑战?

测试人

从人口红利到AI红利,天润融通助力企业转型刻不容缓

天润融通

Bonree ONE 2025秋季版产品发布会预告片发布!

博睿数据

从0到1了解京东商品详情api指南

tbapi

京东商品详情接口 京东API 京东商品详情API 京东数据采集 京东数据分析

京东商品评论API开发指南

tbapi

京东商品评论API 京东评论API 京东评论采集 京东评价接口 京东评论分析

工程项目管理系统:全流程数字化管控,驱动工程高效协同

深圳亥时科技

「OxyGent智能体工具创新赛」开启!邀你共赴群体智能时代

京东零售技术

Hudi系列:表类型(Table & Query Types)

京东零售技术

低代码资源管理实操:菜单权限配置避坑指南,动作 / 字段 / 数据权限一次搞懂

引迈信息

双碳目标下企业零碳转型的 MyEMS 碳流可视化支撑体系:路径探索与效能评估

开源能源管理系统

开源 能源管理系统

Hudi系列:Hudi核心概念之时间轴(TimeLine)

京东零售技术

Hudi系列:Hudi核心概念之索引(Indexs)

京东零售技术

盘点十大顶级境外社交媒体监测工具

沃观Wovision

社交媒体 沃观Wovision 舆情监测系统 海外舆情监测

MaxKB 的 RAG 引擎和向量存储实现细节

kaika1

AI 大语言模型 rag RAG应用 MaxKB

一文了解时序数据库 IoTDB 分区、同步与备份

Apache IoTDB

拦截、判断、执行一步到位:天润融通ZENAVA正接手商品退换货服务

天润融通

国外社交媒体监测软件在实际工作中具体是做什么的?

沃观Wovision

社交媒体 沃观Wovision 舆情监测系统 海外舆情监测

从社区数据出发,再看大模型开源开发生态全景与趋势

蚂蚁开源

开源 AI 大模型

博睿数据首次亮相全球顶级科技盛会Tech Week Singapore 2025,与全球共享可观测性前沿成果!

博睿数据

使用 ONNX 将 AI 推理引入 Java:企业架构师实用指南

程序猿DD

Java

Hudi系列:Hudi核心概念之文件布局(Storage Layouts)

京东零售技术

时序数据库 IoTDB 集成 DataGrip,支撑跨模态多库融合管理

Apache IoTDB

从“人力驱动”到“AI驱动”,天润融通重塑客服与营销生产力

天润融通

如何通过API网关保障企业的数据安全

谷云科技RestCloud

数据处理 数据安全 API网关 集成平台 ipaas

iPaaS驱动下的API管理新趋势

谷云科技RestCloud

数据处理 数据安全 集成平台 API管理 ipaas

一个老码农的掏心窝推荐:微擎,我后悔没早点遇到的开发利器

微擎应用市场

即时通讯IM国产化:BeeWorks私有化部署适配企业需求

BeeWorks

即时通讯 IM 私有化部署

内网聊天软件对B端企业的重要性

BeeWorks

即时通讯 IM 私有化部署

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