我很擔心在Ruby中編寫自修改代碼。而通過自我修改,我的意思是能夠編寫以代碼塊爲輸入值的函數,並基於此輸出另一個代碼塊。 (我不是問基礎知識,如在運行時重新定義方法。)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)。請賜教。
你有這方面的具體用例嗎? – Nevir
要檢測未使用的變量,您將不得不下降到AST級別;可能通過[墨爾本寶石](https://github.com/simplabs/melbourne)。然而,有可能有一種不同的/更方便的方法來覆蓋你的用例 – Nevir
@Nevir:但我確實是這樣做的。我不是旅遊者,我不會去我無所事事的地方:-)。想象下面的代碼:'ChemicalReaction.new(name:「A_and_B_assembly」,rate:proc {A * B * 0.189})'。我想在用戶面前輕鬆一些,所以我不希望他們寫'proc {| _A,_B | _A * _B * 0.189}'這就是這意味着什麼(0.189是速率常數)...... –