我担心在 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)的根本弱点。请赐教。