Rubyに内部DSLを書きます。現在、このミニ言語の基本構造は、ブロックduring
を含む必要があり、必要に応じていくつかの方法が追加されています。例えば:Rubyでブロックを実行していないブロックがあるかどうかを確認します
do
something...
during do ... end
something else ...
end
私は、彼らがduring
キーワードが含まれていません場合、異なるブロックを処理することにより、言語を簡素化したいと思います。この場合、他のRubyブロックと同じように扱うことができます。
ブロックに特定のメソッドが含まれているかどうかを検出することは可能ですかを実行しないでください。このメソッドは、if
またはwhile
ステートメントのように、内部スコープ内にネストされていないと仮定するのは問題ありません。可能であれば、これは反射を含んでいると思います。これは大丈夫です。
洗練と説明
私は停止問題を解決したり、Rubyのハッカーが考えるかもしれない任意のトリックを克服しようとしていないのです。解決策は、最も素朴なケースにのみ適用される可能性があります。
いくつかの言語では、実行時にソースコードに反映させることができます。 Pythonのメソッドオブジェクトには、バインディングやバイトコードのようなフィールドがあります。 Javaでは、メソッドのバイトコードを読み込んでinvokevirtual
コマンドを探すことは可能ですが、それほど簡単ではありません。
私はRubyにあまり慣れていません。私は、procsやブロックのようなコントロール要素を表すRubyオブジェクトにも同様のフィールドがあるのかどうかはわかりません。私の記憶が役立つなら、Rubyは実行時にASTにアクセスするためのフレームワークをいくつか持っています。しかし、このフレームワークが特定のブロックにアクセスできるかどうか、またそのフレームワークがどのよう単純なケースでのみ機能する実行時AST解析に基づくソリューションは、完全に受け入れられます。
ポインタありがとう! IMHO to_sexpと配列をトラバースすることはやや良いですが。 –