~/.irbrc
に以下を足すだけでOK
~/.irbrc
unless defined?(SCRIPT_LINES__)
SCRIPT_LINES__ = {}
end
ast_happier = TracePoint.new(:call) do |tp|
SCRIPT_LINES__['(irb)'] = tp.binding.local_variable_get(:statements).lines
end
ast_happier.enable(target: IRB::WorkSpace.instance_method(:evaluate))
例
% irb
irb(main):001:0> pp RubyVM::AbstractSyntaxTree.of(-> { puts :hi })
(SCOPE@1:35-1:48
tbl: []
args:
(ARGS@1:35-1:35
pre_num: 0
pre_init: nil
opt: nil
first_post: nil
post_num: 0
post_init: nil
rest: nil
kw: nil
kwrest: nil
block: nil)
body: (FCALL@1:38-1:46 :puts (ARRAY@1:43-1:46 (LIT@1:43-1:46 :hi) nil)))
=> #<RubyVM::AbstractSyntaxTree::Node:SCOPE@1:35-1:48>
どうして動くのか
ここに書いた
https://dev.to/okinawarb/how-can-i-use-rubyvm-abstractsyntaxtree-in-irb-m2k
課題
うまく動かないケースは変数に入れてからofとかだと動かないんですが(たぶんね)、ファイル名を工夫して、SCRIPT_LINES__
にこう入れる、というのが分かっていれば、実質自明なので頑張って改良してくれ〜の他力本願スタイルでいきます