2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

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

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

关注

评论

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

【HarmonyOS Next】鸿蒙应用故障处理思路详解

GeorgeGcs

故障 应用 处理思路

【HarmonyOS Next】拒绝权限二次申请授权处理

GeorgeGcs

拒绝权限 二次申请 授权处理

【HarmonyOS NEXT】systemDateTime 时间戳转换为时间格式 Date,DateTimeFormat

GeorgeGcs

Date systemDateTime DateTimeFormat

Redis 高可用方案

天翼云开发者社区

redis

【HarmonyOS Next】鸿蒙加固方案调研和分析

GeorgeGcs

鸿蒙 分析 加固 方案调研

【HarmonyOS Next】鸿蒙中自定义弹框OpenCustomDialog、CustomDialog与DialogHub的区别详解

GeorgeGcs

DialogHub OpenCustomDialog CustomDialog

【HarmonyOS Next】鸿蒙应用加载SVG文件显示图标

GeorgeGcs

SVG 加载 鸿蒙应用 显示图标

【HarmonyOS NEXT】鸿蒙应用点9图的处理(draw9patch)

GeorgeGcs

鸿蒙 draw9patch 应用点9图

AI之山,鸿蒙之水,画一幅未来之家

脑极体

AI

YashanDB故障诊断架构

YashanDB

数据库 yashandb

【HarmonyOS NEXT】鸿蒙应用如何进行页面横竖屏切换以及注意事项,自动切换横竖屏,监听横竖屏

GeorgeGcs

鸿蒙应用 横竖屏切换 自动切换横竖屏 监听横竖屏

【HarmonyOS NEXT】解决自定义弹框遮挡气泡提示的问题

GeorgeGcs

自定义弹框 间隙

【HarmonyOS Next】鸿蒙状态管理装饰器V1和V2混用方案

GeorgeGcs

鸿蒙 V1 V2 状态管理装饰器

【HarmonyOS Next】鸿蒙应用公钥和证书MD5指纹的获取

GeorgeGcs

应用公钥 证书MD5指纹 获取

【HarmonyOS Next】鸿蒙循环渲染ForEach,LazyForEach,Repeat使用心得体会

GeorgeGcs

foreach LazyForEach Repeat

【HarmonyOS NEXT】鸿蒙应用使用后台任务之长时任务,解决屏幕录制音乐播放等操作不被挂起

GeorgeGcs

后台任务 长时任务 屏幕录制音乐播放

【HarmonyOS NEXT】鸿蒙应用实现屏幕录制详解和源码

GeorgeGcs

鸿蒙 源码 应用 屏幕录制 详解

【HarmonyOS Next】鸿蒙应用折叠屏设备适配方案

GeorgeGcs

折叠屏 鸿蒙应用 设备适配

【HarmonyOS Next】 共享HSP和应用内HSP,useNormalizedOHMUrl详解

GeorgeGcs

共享HSP 应用内HSP useNormalizedOHMUrl

【HarmonyOS Next】鸿蒙状态管理V2装饰器详解

GeorgeGcs

鸿蒙状态管理 V2装饰器

【HarmonyOS Next】鸿蒙应用进程和线程详解

GeorgeGcs

鸿蒙 线程 应用进程 详解

【HarmonyOS NEXT】鸿蒙跳转华为应用市场目标APP下载页

GeorgeGcs

鸿蒙 华为应用市场 目标APP下载页 跳转

案例分析:AI算力租赁可以用于哪些行业?

Ogcloud

算力 AI算力 AI算力租赁 算力租赁

【HarmonyOS Next】鸿蒙TaskPool和Worker详解 (一)

GeorgeGcs

Worker askPool

类似智联招聘/前程无忧,BOSS直聘网站小程序项目源码定制开发搭建

网站,小程序,APP开发定制

【HarmonyOS Next】鸿蒙监听手机按键

GeorgeGcs

鸿蒙 监听 手机按键

YashanDB故障诊断概念

YashanDB

数据库 yashandb

【HarmonyOS Next】鸿蒙应用常规面试题和答辩思路参考

GeorgeGcs

鸿蒙应用 常规面试题 答辩思路

【HarmonyOS NEXT】设备显示白屏 syswarning happended in XXX

GeorgeGcs

设备显示白屏 syswarning happended in XXX

【HarmonyOS NEXT】鸿蒙三方应用跳转到系统浏览器

GeorgeGcs

鸿蒙 三方应用 系统浏览器

联合民生证券,探讨AI技术驱动下的财富管理新范式

非凸科技

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