我担心在Ruby中编写自修改代码。通过自我修改,我的意思是能够编写将代码块作为输入值的函数,并基于此输出另一个代码块。 (我不是在询问基础知识,例如在运行时重新定义方法。)
我可能想要做的是,例如,有以下块,
_x_ = lambda { |a, b, c, d| b + c }
人们可以注意到参数a
和d
根本没有在身体中使用,所以我想要一个函数,例如。 #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)。请赐教。
答案 0 :(得分:2)
检测是否使用了块变量是一项复杂的任务,您似乎在说使用RubyVM
可以做到这一点。所以问题似乎在于如何改变代码的优点。
如果你有:
_x_ = ->a, b, c, d{b + c}
并假设您能够使用RubyVM
并了解未使用a
和d
,因此您要创建
x = ->b, c{b + c}
<{1>}中的。然后,这很简单:
_x_
答案 1 :(得分:1)
鲍里斯你必须要依靠Ruby来开始吗?
为什么不创建自己的特定情境语言,化学家只能用它来以最方便的方式表达他们的公式。然后为这个“化学表达式语言”创建一个简单的解析器和编译器。
我的意思是这个解析器和编译器将解析和编译化学家在他们的Ruby代码中编写的表达式。然后你可以:
ChemicalReaction.new(..., "[ATP] * [GDP] * NDPK_constant")
Voila:最大的灵活性。
如果可用性是您的主要关注点,那么我将采取的方法。如果您想要做的就是尽可能以最紧凑的方式表达某些特定领域的公式,那么写出“lambda”对我来说似乎是一件不必要的麻烦事。