自修改代码的Ruby(Self-modifying code in Ruby)

2019-10-17 16:08发布

我关心的Ruby编写自修改代码。 和通过自修改,我的意思是能够编写采取代码块作为输入值,并输出基于该另一码块的功能。 (我不是问基础知识,如在运行时重新定义方法。)

我可能想要做的是,例如,具有以下块,

_x_ = lambda { |a, b, c, d| b + c }

可以注意到参数ad都没有用在身上的一切,所以我想一个函数如。 #strip删除它们,

x = _x_.strip

这应该产生相同的结果写:

x = lambda { |b, c| b + c }

现在,在Lisp语言,这将是很容易的,因为Lisp代码是很容易操纵数据。 但我不知道如何处理Ruby代码。 我可以分析它如。 通过

RubyVM::InstructionSequence.disassemble( x )

但如何,在此基础,做我写一个修改块? 什么我希望做其他的例子是如。

y = lambda { A + B }
y.deconstantize
# should give block same as saying
lambda { |_A, _B| _A + _B }

到目前为止,在Ruby中,我从来没有遇到过的情况下,我不得不承认,事情是不可能的。 但是这一次,直觉告诉我,我可能会遇到的精美结构化的代码与很少代码的语法根本无力谈论(这将是Lisp的)。 请赐教。

Answer 1:

鲍里斯你一定要依靠红宝石开始在这里?

为什么不创建自己的具体情况的语言,化学家可以只使用为目的,以表达自己的公式中最便捷的方式。 然后创建一个简单的解析和编译器对于这种“化学表达式语言”。

我的意思是这个解析器和编译器将解析和编译化学家在他们的Ruby代码写的表达式。 然后,你可以有:

ChemicalReaction.new(..., "[ATP] * [GDP] * NDPK_constant")

瞧:最大的灵活性。

这就是,如果可用性您的主要关注我会采取的做法。 已经写出“拉姆达”似乎是一个不必要的麻烦的事情对我来说在这里,如果你想要做的是表达以最简洁的方式一些特定领域的配方。



Answer 2:

检测块变量是否使用与否是一项复杂的任务,你似乎是说,你可以用做RubyVM 。 所以现在的问题好像是问如何更改代码的元数。

如果你有:

_x_ = ->a, b, c, d{b + c}

并假设你能够使用RubyVM和来知道ad都没有用,所以你需要创建

x = ->b, c{b + c}

_x_ 。 然后,说起来很简单:

x = ->b, c{_x_.call(nil, b, c, nil)}


文章来源: Self-modifying code in Ruby