凄いバカなプログラムを作ろう
前回に引き続き挑戦
http://d.hatena.ne.jp/nowokay/20070324#1174695655
DSL(なのかな?)を作ってしまうことを目指して実装。
してたけど、場当たり的に作っていたらぐだぐだに
とりあえず動くところまで持っていった版
へっぽこ具合もバカということで
package print; import static print.SortPrinter.Ex.IF; import static print.SortPrinter.Ex.IS_EMPTY; import static print.SortPrinter.Ex.IS_NULL; import static print.SortPrinter.Ex.SORT; import static print.SortPrinter.Ex.STRING; public class SortPrinter { public static void main(String[] args) { print(new int[] { 14, 13, 71, 2, 24, 19 }); print(new int[] { 3, 2 }); print(new int[] { 5 }); print(new int[] {}); print(null); } public static void print(int[] array) { System.out.println( IF(IS_NULL(array), STRING("nullです"), IF(IS_EMPTY(array), STRING("空です"), STRING(SORT(array)) ) ).eval() ); } static abstract class Ex<V> { public abstract V eval(); public static <V> Ex<V> IF(final Ex<Boolean> boolEx, final Ex<V> trueEx, final Ex<V> falseEx) { return new Ex<V>() { @SuppressWarnings("unchecked") public V eval() { Ex<V>[] ops = new Ex[] { trueEx, falseEx }; return ops[boolEx.eval().toString().length() - 4].eval(); } }; } public static <V> Ex<V> IF(final boolean bool, Ex<V> trueEx, Ex<V> falseEx) { return IF(new Ex<Boolean>() { public Boolean eval() { return bool; } }, trueEx, falseEx); } public static Ex<Boolean> IS_NULL(final Object object) { return new Ex<Boolean>() { public Boolean eval() { return object == null; } }; } public static Ex<Boolean> IS_EMPTY(final int[] ints) { return new Ex<Boolean>() { public Boolean eval() { return ints.length == 0; } }; } public static Ex<String> STRING(final String string) { return new Ex<String>() { public String eval() { return string; } }; } public static Ex<String> STRING(final Ex<int[]> ex) { return new Ex<String>() { public String eval() { return appendAll("", ex.eval(), 0); } private String appendAll(final String str, final int[] ints, final int index) { return IF(index < ints.length, new Ex<String>() { public String eval() { String sep = IF(index == 0, STRING(""), STRING(" ")).eval(); return appendAll(str + sep + ints[index], ints, index + 1); } }, STRING(str)).eval(); } }; } public static Ex<int[]> SORT(final int[] ints) { return new Ex<int[]>() { public int[] eval() { return sort(ints, 0, 1); } private int[] sort(final int[] ints, final int i, final int j) { return IF(i < ints.length, IF(j < ints.length, IF(new Ex<Boolean>() { public Boolean eval() { return ints[i] > ints[j]; }}, new Ex<int[]>() { public int[] eval() { swap(ints, i, j); return sort(ints, i, j + 1); }}, new Ex<int[]>() { public int[] eval() { return sort(ints, i, j + 1); } } ), new Ex<int[]>() { public int[] eval() { return sort(ints, i + 1, i + 2); } } ),new Ex<int[]>() { public int[] eval() { return ints; } } ).eval(); } private void swap(int[] ints, int i, int j) { int tmp = ints[i]; ints[i] = ints[j]; ints[j] = tmp; } }; } } }