1

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

4

2 回答 2

2

检测是否使用了块变量是一项复杂的任务,您似乎在说您可以通过使用RubyVM. 所以问题似乎是在问如何改变代码的数量。

如果你有:

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

并假设您能够使用RubyVM并且知道a并且d没有使用,所以您想要创建

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

_x_。那么,这很简单:

x = ->b, c{_x_.call(nil, b, c, nil)}
于 2013-02-02T03:25:21.580 回答
1

Boris 你一定要从这里开始依赖 Ruby 吗?

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

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

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

瞧:终极灵活性。

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

于 2013-02-02T05:07:43.607 回答