我担心在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) . 请赐教 .
2 回答
鲍里斯你必须要依靠Ruby来开始吗?
为什么不创建自己的特定情境语言,化学家只能用它来以最方便的方式表达他们的公式 . 然后为这个“化学表达式语言”创建一个简单的解析器和编译器 .
我的意思是这个解析器和编译器将解析和编译化学家在他们的Ruby代码中写的表达式 . 然后你可以:
Voila:极致的灵活性 .
如果可用性是您的主要关注点,那么我将采取的方法 . 如果您想要做的就是以最紧凑的方式表达某些特定领域的公式,那么写出“lambda”对我来说似乎是一件不必要的麻烦事 .
检测是否使用了块变量是一项复杂的任务,您似乎在说使用
RubyVM
可以做到这一点 . 所以问题似乎在于如何改变代码的优点 .如果你有:
并假设您能够使用
RubyVM
并且知道a
和d
未使用,因此您要创建超出
_x_
. 然后,这很简单: