写点什么

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

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

关注

评论

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

3D游戏建模在Maya中加快建模速度的5种技巧

Finovy Cloud

云渲染 建模 maya

架构模块3作业-外包学生管理系统架构文档

梁山伯

iOS不上架怎么安装

雪奈椰子

iOS上架

Python从0到1丨细说图像增强及运算

华为云开发者联盟

Python 人工智能 华为云 企业号 1 月 PK 榜

阿里云产品专家陶炳哲:Java应用最佳实验

云布道师

阿里云 Java、

软件测试/测试开发 | TestNG 与 Junit 对比,测试框架如何选择?

测试人

软件测试 单元测试 JUnit 测试开发 testNG

好气啊!为什么我抓不到 baidu 的数据包?

风铃架构日知录

程序员 Java、 java程序员 抓包 数据包

可观测产品的最佳实践,涵盖端到端的可观测解决方案丨阿里云用户组深圳站

云布道师

阿里云

前端必会react面试题合集

beifeng1996

React

React-Hooks怎样封装防抖和节流-面试真题

beifeng1996

React

滴滴前端一面经典手写面试题

helloworld1024fd

JavaScript

直播预约 | 微服务x容器开源开发者 Meetup 上海站回顾 & PPT下载

阿里巴巴云原生

阿里云 开源 容器 微服务 云原生

工赋开发者社区 | “低代码+MOM”,西门子的MES“进化论”

工赋开发者社区

YMatrix 5.0重磅发布,以性能突破引领万物智联下的数据库最佳形态

YMatrix 超融合数据库

Machine Learning 性能提升 超融合数据库 OLTP 场景实践 YMatrix

滴滴前端一面常考手写面试题合集

helloworld1024fd

JavaScript

更稳定!Apache Doris 1.2.1 Release 版本正式发布|版本通告

SelectDB

数据库 大数据 数据分析 bug 版本发布

App在苹果上架难吗

雪奈椰子

iOS上架 ios审核

vue面试之Composition-API响应式包装对象原理

bb_xiaxia1998

Vue

用100W+行代码贡献经验,带你了解如何参与OpenHarmony开源

华为云开发者联盟

开源 后端 华为云 企业号 1 月 PK 榜

面试官:请实现Javascript发布-订阅模式

helloworld1024fd

JavaScript

高频js手写题之实现数组扁平化、深拷贝、总线模式

helloworld1024fd

JavaScript

Flink 容错恢复 2.0 2022 最新进展

Apache Flink

大数据 flink 实时计算

SOFARegistry | 聊一聊服务发现的数据一致性

SOFAStack

SOFA SOFARegistry'

高性能网关基石——OpenResty

C++后台开发

lua nginx openresty 后端开发 高性能网关

React-hooks面试考察知识点汇总

beifeng1996

React

vue这些原理你都知道吗?(面试版)

bb_xiaxia1998

Vue

腾讯前端vue面试题合集

bb_xiaxia1998

Vue

常用EMC元器件简介——防护器件

元器件秋姐

电子工程师 元器件科普 EMC防护 硬件知识

安卓app上架流程

雪奈椰子

IOS云打包 ios审核

CSV:简单格式下隐藏的那些坑

华为云开发者联盟

后端 华为云 csv 企业号 1 月 PK 榜

前端react面试题(必备)

beifeng1996

React

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