ひとり勉強会

ひとり楽しく勉強会

動的文字列&正規表現

文字列リテラルにも色々ありまして

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 という仕組みを使うようコンパイルされてました。