Ruby 关于 “代码即数据” 的脑洞,如果内存里的方法可以还原成代码字符串?

cicholgricenchos · 2014年11月21日 · 最后由 nowherekai 回复于 2014年11月22日 · 1849 次阅读

最近看完了元编程,突然有个想法,如果方法可以用一种数据形式来描述,不就可以在不同的系统中传递了吗?虽然还不知道这样有什么确切的好处,但毕竟是很有意思的。

关于代码的数据形式,最直观的肯定是字符串,比如可以把一个方法的源码通过 json 传到别的环境,再 eval 运行。这样就会有一种获取代码的手段,在遇到一个方法的时候,去源文件里找这个方法的源码。但是这个手段对动态生成的方法会略显无力,至少需要花一些功夫在解析上。

然后我马上想到了 lisp 的 “代码即数据” 特性(ruby 内部应该也是类似的实现吧),内存里的方法实际上是一棵棵抽象语法树,对抽象语法树的描述就是对方法最完美的描述。

现在看上去 ruby 是没有操纵这个 AST 的方法的,不知道 lisp 有没有,如果语言内置了这种功能,大概会出现不少好玩的 trick 吧。

补充:找到了一个叫 sourcify 的 gem 可以实现此功能,还能用 ParseTree 转成 s 表达式,这样大概可以把 ruby 代码转成任意一种脚本语言。。

共收到 4 条回复

= =结果我发现 js 有个很方便的 toString()

angular 就是用这个做省略版的依赖注入的

eval? davel?

Lisp 的 list 本身就是 AST 了,Lisp 的宏可以操纵 ast,这是 Lisp 强大的根源之所在。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册