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 など) の根本的な弱点に遭遇した可能性があることを教えてくれます。教えてください。