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

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

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

关于代码的数据形式,最直观的肯定是字符串,比如可以把一个方法的源码通过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强大的根源之所在。

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