阿里云「飞天发布时刻」2024来啦!新产品、新特性、新能力、新方案,等你来探~ 了解详情
写点什么

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

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

关注

评论

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

测试ChatGPT能不能帮助我们傻瓜式的搭建Spring Boot工程

致知Fighting

Java ChatGPT

IDPChat:探索基于LLaMA和Stable Diffusion的「开源」中文多模态AI大模型

Baihai IDP

人工智能 开源 大模型 Stable Diffusion llama

详解,LED显示屏灰度等级

Dylan

灰度 LED显示屏 色彩

学会提示-AI时代职场必修课

京东科技开发者

人工智能 京东云 GPT ChatGPT4 企业号 4 月 PK 榜

大模型的三大法宝:Finetune, Prompt Engineering, Reward

Baihai IDP

人工智能 大模型 基础模型 企业号 4 月 PK 榜 RLHF

面对一堆烂代码,重构,还是重新开发?

架构精进之路

程序员 重构 三周年连更

【机器学习入门与实践】合集入门必看系列,含数据挖掘项目实战

汀丶人工智能

人工智能 数据挖掘 机器学习 深度学习

报名啦!来飞桨中国行,听深度学习平台+大模型如何破局产业智能化

飞桨PaddlePaddle

飞桨 产业赋能

成长计划知识赋能 | 第十期:DAYU200开发入门秒Get

OpenHarmony开发者

OpenHarmony

带你用三种不同的工具体验AI作诗

华为云开发者联盟

云计算 华为云 华为云开发者联盟 企业号 4 月 PK 榜

CloudQuery 询盾社区版 v1.5.0 正式发布!

BinTools图尔兹

数据库 社区活动 版本发布

分布式实时搜索和分析引擎——Elasticsearch

会踢球的程序源

Java elasticsearch 后端

突破规模化运维瓶颈 SREWorks云原生数智运维平台揭秘

阿里云大数据AI技术

大数据 运维 企业号 4 月 PK 榜 规模化

零拷贝浅析

数新网络官方账号

大数据 零拷贝

从此告别写SQL!DataLeap帮你零门槛完成“数据探查”

字节跳动数据平台

MySQL 数据分析 数据治理 数据探查 企业号 4 月 PK 榜

NFTScan 与 NodeReal 达成战略合作:NFT API 已上架 NodeReal API Marketplace

NFT Research

NFT NFTScan

布隆过滤器:后端开发者必学的知识点

华为云开发者联盟

后端 开发 华为云 华为云开发者联盟 企业号 4 月 PK 榜

发现Mysql的主从数据库没有同步,差点凉凉了

华为云开发者联盟

数据库 后端 华为云 华为云开发者联盟 企业号 4 月 PK 榜

论文解读:基于 OpenMLDB 的流式特征计算优化

第四范式开发者社区

人工智能 机器学习 数据库 开源 特征

MySQL8.0 优化器介绍(二)

GreatSQL

MySQL greatsql greatsql社区

【直播回顾】数字化转型成为银行业发展的关键(中)

易观分析

金融 银行

企业应用可观测性利器!华为云CodeArts APM发布

华为云开发者联盟

云计算 后端 华为云 华为云开发者联盟 企业号 4 月 PK 榜

小红书广告投放机制详解,如何用算法实现全站自动化投放

小红书技术REDtech

大数据 搜索

云原生助力数字原生企业业务快速迭代|阿里云峰会精彩回顾

阿里巴巴云原生

阿里云 云原生

架构师才需要学习的知识:亿级流量调优方法+实战

做梦都在改BUG

Java 性能优化 性能调优

深入理解 Redis 新特性:Stream

Java你猿哥

redis SSM框架 Redis 核心技术与实战 redis 底层原理

TiDB与MySQL的SQL差异及执行计划简析

京东科技开发者

数据库 开源 TiDB 京东云 企业号 4 月 PK 榜

Redis复制(replication)

京茶吉鹿

数据库 nosql redis

大数据基础知识

数新网络官方账号

大数据

深入浅出的实践大数据DAG图

数新网络官方账号

C语言_sprintf固定字符串输出位数

DS小龙哥

三周年连更

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