Java のソースを読んでそのソースを含む自己出力プログラムを吐くプログラムを書いた.あまり美しくないなぁ...
/*** * 次の Self2.template をソースファイルに埋め込んで, * そのソース全体を含む自己出力プログラムを作成する. * 実行クラス名は SelfPrint (Self2.template のクラス名) となる. * \r は置き換えないのでソース中に含まないようにすること. * \n, \t, " を %n, %t, %c という文字に変換して文字列を埋め込むので, * ソースはこれらを含まないこと. * あと, %s もあるとまずい. * エスケープ文字もまずそう. * Self.template の main 関数で何かメソッドを呼ぶように書けば仕事もできる. * そのばあい,画面出力があると自己出力の意味が無いけど... *---------------------- Self2.template start -------------------------- class SelfPrint { static String s="%s"; public static void main(String [] args) { String ss=s.replaceAll(new String(new byte []{37, 110}), new String(new byte []{10})); ss=ss.replaceAll(new String(new byte []{37, 116}), new String(new byte []{9})); ss=ss.replaceAll(new String(new byte []{37, 99}), new String(new byte []{34})); ss=ss.replaceAll(new String(new byte []{37, 115}), s); System.out.print(ss); } } *---------------------- Self2.template end -------------------------- * */ import java.io.*; class SelfGen2 { public static void main(String [] args) throws Exception { if(args.length <= 0){ System.out.println("Usage: java SelfGen2 input.java"); System.out.println("Note: input.java should not contain CR"); System.exit(0); } File file = new File(args[0]); FileReader fis = new FileReader(file); int len = (int)file.length(); char [] buf = new char[len]; len = fis.read(buf, 0, len); String source = new String(buf, 0, len); File tfile = new File("Self2.template"); FileReader tfis = new FileReader(tfile); int tlen = (int)tfile.length(); char [] tbuf = new char[tlen]; tlen = tfis.read(tbuf, 0, tlen); String template = new String(tbuf, 0, tlen); source = source + template; //System.out.println(source); String ss = source; ss=ss.replaceAll(new String(new byte []{10}), new String(new byte []{37, 110})); ss=ss.replaceAll(new String(new byte []{9}), new String(new byte []{37, 116})); ss=ss.replaceAll(new String(new byte []{34}), new String(new byte []{37, 99})); source=source.replaceAll(new String(new byte []{37, 115}), ss); System.out.print(source); } }
- Newer: AWK - はじめ