最近很多时间都在用Ruby,逐渐地发现了一件很不爽的事情,就是Ruby的end关键字。block多套几层,很容易就最后一页都是end了...难怪有人说,ruby不过是另一种acceptable Lisp,“最后一页都是括号”的经典标志以另外一种形式复现了...对于Lisp的括号,我还是可以接受的,但是满眼的end,直接让我回忆起10年前冲刺NOI的种种,CPU直接切换到实模式,什么可读啊小粒度方法全都没有了,审美观赤裸地变为短小精悍...最后杀红了眼,一行算出文法定义的所有nullable symbols...

1 while @productions.inject(false) {|c, p| c |= !nullable?(p.nonterminal) && p.symbols.all? {|s| nullable? s} && @nullables << p.nonterminal}

注意1不是行号...这句用的statement modifier, 1是我能想到的最小ruby语句了...

p.s.
我现在已经恢复到OO保护模式了...刚才追求短小过了头的同时,发现了ruby bulid-in object的一个陷阱...
a = Array.new 5, []
[[],[],[],[],[]]
a[0] << 1
[[1],[1],[1],[1],[1]]

想不到华丽的Array直接假设传进去的都是值对象了,好歹您也调个dup啊...