论坛首页 综合技术论坛

SQL 与函数式编程

浏览 13265 次
精华帖 (0) :: 良好帖 (8) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-04-22   最后修改:2009-04-22
night_stalker 写道
ruby 本身不提供让你直接看 proc 源代码的功能, ParseTree 的核心是一个用 C 写的扩展,可以在虚拟机中挖出语法树来。

嗯,MRI在解析了Ruby源码之后变成抽象语法树,而下面的解释器就是在这棵树上解释的,所以只要程序还活着就有办法把抽象语法树挖出来。

night_stalker 写道
但是!FX 告诉我:MRI 1.9 只保存序列化的 YARV 字节码,不再保存 ParseTree 了,所以 ParseTree 没戏了……

诶……我们聊的时候我说过这个么 =v= 虽然YARV在执行过程中不再使用抽象语法树是事实没错。

night_stalker 写道
可以想到的一个简单 hack:
先从 Proc#source_location 定位出 proc 的位置。(此方法返回 [文件名,行号],如: ["topic.rb",31])
然后读取源文件,从这个地方开始截取这个完整的 proc 字符串作解析……

此 hack 的缺点是 irb 、打包的 jruby 都不认。而且很土。
(嗯…… 性能不是问题,可以用 "文件名:行号" 索引缓存的 match spec)

完整的Proc字符串不好截。只有行号根本不够用。随便写个:
p, q = proc {}, proc {}

这俩的行号就一样了。用def也一样可能遇到在同一行定义的状况。由于Ruby语法允许这点,要做任何“有实用价值”的Ruby解析都不能无视它然后说“多数情况应该行的”。要是YARV能留个更干净的解析器的接口出来就好了……
如果是把字符串解析成树,还有ruby_parser库,然后JRuby也有JRuby.parse可以用。不过生成的结果跟ParseTree不一样,而且把JRuby内部的优化方式都暴露出来了。
0 请登录后投票
   发表时间:2009-04-22   最后修改:2009-04-22
对同一行或者嵌套的情形,可以这样 XD:
raise "sorry 我认不出 topic.rb:31 哪个 proc 是 match spec,分一下行好吗~~"


另一种思路:
ISec#disasm 看 YARV 字节码……
RubyVM::InstructionSequence.disasm obj.method(:mspec)


不过现在只支持 method,不支持 proc 。可能 1.9.2 会支持 proc 吧 o(╯□╰)o
0 请登录后投票
   发表时间:2009-04-22  
打断一下,根本是两种东西,select(func(row) {row.name like 'J%'}) 只是形式上和 sql 相似,可以理解为集合操作披上了 sql 的外衣。

sql 的基础是关系数学,也就是关系元组交投选并差等等运算,不拘实现,只关心结果,不关心过程,不关心存储位置,不关心是不是并行。

和sql相似的是 prolog,sql 被认为是 datalog 的一种。
0 请登录后投票
   发表时间:2009-04-22  
inshua 写道
打断一下,根本是两种东西,select(func(row) {row.name like 'J%'}) 只是形式上和 sql 相似,可以理解为集合操作披上了 sql 的外衣。

sql 的基础是关系数学,也就是关系元组交投选并差等等运算,不拘实现,只关心结果,不关心过程,不关心存储位置,不关心是不是并行。

和sql相似的是 prolog,sql 被认为是 datalog 的一种。

说的就是sql和fp中的行集数据的运算比较。
0 请登录后投票
   发表时间:2009-04-24  
kimmking 写道
inshua 写道
打断一下,根本是两种东西,select(func(row) {row.name like 'J%'}) 只是形式上和 sql 相似,可以理解为集合操作披上了 sql 的外衣。

sql 的基础是关系数学,也就是关系元组交投选并差等等运算,不拘实现,只关心结果,不关心过程,不关心存储位置,不关心是不是并行。

和sql相似的是 prolog,sql 被认为是 datalog 的一种。

说的就是sql和fp中的行集数据的运算比较。


实际上,如果了解一些Category的理论,你会发现,如果把关系代数和Lambada算子看成两个Category的话,你会发现很容易通过一个Functor将他们之间影射起来.
0 请登录后投票
   发表时间:2009-04-24  
SQL不是函数式编程吧?
函数式编程是通用编程,能干任何事。sql是dsl。dsl比较专,比较简洁。
0 请登录后投票
   发表时间:2009-04-24  
Trustno1 写道
kimmking 写道
inshua 写道
打断一下,根本是两种东西,select(func(row) {row.name like 'J%'}) 只是形式上和 sql 相似,可以理解为集合操作披上了 sql 的外衣。

sql 的基础是关系数学,也就是关系元组交投选并差等等运算,不拘实现,只关心结果,不关心过程,不关心存储位置,不关心是不是并行。

和sql相似的是 prolog,sql 被认为是 datalog 的一种。

说的就是sql和fp中的行集数据的运算比较。


实际上,如果了解一些Category的理论,你会发现,如果把关系代数和Lambada算子看成两个Category的话,你会发现很容易通过一个Functor将他们之间影射起来.


嗯,确实可以影射,但是世界观有别。从这个角度看世界有一套结构,从那个角度又有另外一套结构,结构之间可以影射。世界的本质是相通的,然而世界观是多元的。说其不同,并不是说它们不能沟通,而是说它们理论出发点不同。
0 请登录后投票
   发表时间:2009-05-06  
o(∩_∩)o... 那最后大家都写汇编不是更好!

每个数据库的sql--->解析不同

SQL基本是相同的

0 请登录后投票
   发表时间:2009-05-06  
SQL是语用抽象的实现
而s-ep 数据库解析等就是语法级别的
0 请登录后投票
   发表时间:2009-05-06  
看完这个贴子,有几个疑问!
1.各位比较强,不知道天天在做什么?研究理论,实践项目
2.理论有没有转化
3.中国需要不需要,能不能这样的理论--->基础工程产品[os,db]的转换
0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics