たまたまこんなページに行き当たりました ⇒ http://www.unfindable.net/~yabuki/article/self.html 自分のコードを出力するプログラム。そこに書いてあることを読むと案外簡単そうに思えたので、早速ActiveBasicでやってみることにしました。

まずできたのは次のコードです。出力はコロンを使ったマルチステートメントになっていて、1行に全て表示されます。しかしその後は、全く同じものが出力されます。

#console
Dim s = "#console : Print Ex'Dim s = \\q' + s + Ex'\\q' : s.Replace(&h27 As Char, Asc(Ex'\\q')) : Print s"
Print Ex"Dim s = \\q" + s + Ex"\\q" : s.Replace(&h27 As Char, Asc(Ex"\\q")) : Print s

しかしChr$で直接文字コードを指定するのが美しくありません。そういう訳でさらに改良してみました。上のページのC++版の説明をヒントに、文字列利リテラルを表すダブルクォーテーションの扱いを工夫してみました。

#console
Dim s = "#console : Print Ex'Dim s = q' + s + Ex'q' : s.Replace(&h27 As Char, Asc(Ex'q')) : Print s"
Print Ex"Dim s = q" + s + Ex"q" : s.Replace(&h27 As Char, Asc(Ex"q")) : Print s

sを初期化する文字列リテラルの中では本来ダブルクォーテーションが欲しいところを、仮にシングルクォーテーションとし、後にReplaceでダブルクォーテーションに書き換えています。しかしまだ&h27とシングルクォーテーションの文字コードを直に書いています。それをなくすためにさらに改良して、次の最終版に行き着きました。

#console
Dim s = "Print Ex'#console\\r\\nDim s = \\q' + s + Ex'\\q, t = \\q' + t + Ex'\\q' : s.Replace(Asc(t), Asc(Ex'\\q')) : Print s", t = "'"
Print Ex"#console\\r\\nDim s = \\q" + s + Ex"\\q, t = \\q" + t + Ex"\\q" : s.Replace(Asc(t), Asc(Ex"\\q")) : Print s

完全に文字コードを直に書いている部分は無くなりましたが、かえってソースコードは長くなっています。しかし私はこの方が好みです。


ところで今回バックスラッシュ(或いは円記号: &h5c)の入力に手間取りました。少なくともJavaScriptを切っているとき、pre要素もしくはcode要素の中でバックスラッシュを表示させるには\\と2つ続けないといけないようです。


スポンサード リンク

この記事のカテゴリ