動的文字列&正規表現
文字列リテラルにも色々ありまして
NODE | 例 |
---|---|
NODE_DSTR | "a = #{a}" |
NODE_EVSTR | "#{a}" |
文字列がputstring命令になるのは、式展開が含まれていない、単純な文字列リテラルのときだけです。
"値は #{a} と #{b} です"
のように式展開が含まれる場合は
NODE_DSTR NODE_STR "値は " NODE_EVSTR a NODE_STR " と " NODE_EVSTR b NODE_STR "です"
というノードが構文解析で作られて
putobject "値は " [aを評価する命令列] tostring putobject " と " [bを評価する命令列] tostring putobject " です" concatstrings 5
みたいに、左から順に文字列をスタックに積んでいって、concatstrings命令でひとつにまとめる、というコードにコンパイルされます。
NODE | 例 |
---|---|
NODE_XSTR | `echo` |
NODE_DXSTR | `ec#{104.chr}o` |
NODE_DSYM | :$gvar |
NODE_DREGX | /#{gets}/ |
NODE_DREGX_ONCE | /#{gets}/o |
式展開が入りうるリテラルは他にも、シンボルと正規表現があります。それぞれ、DSTRと同じ方法で一旦文字列を作ってから、.internメソッドを呼ぶか、YARVのtoregexp命令に変換されます。"once"正規表現は、onceを実現するために定数のキャッシュと似た onceinlinecache という仕組みを使うようコンパイルされてました。