首页 文章

Ruby中的自修改代码

提问于
浏览
1

我担心在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) . 请赐教 .

2 回答

  • 2

    鲍里斯你必须要依靠Ruby来开始吗?

    为什么不创建自己的特定情境语言,化学家只能用它来以最方便的方式表达他们的公式 . 然后为这个“化学表达式语言”创建一个简单的解析器和编译器 .

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

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

    Voila:极致的灵活性 .

    如果可用性是您的主要关注点,那么我将采取的方法 . 如果您想要做的就是以最紧凑的方式表达某些特定领域的公式,那么写出“lambda”对我来说似乎是一件不必要的麻烦事 .

  • 1

    检测是否使用了块变量是一项复杂的任务,您似乎在说使用 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)}
    

相关问题