On 5/21/07, Brad Phelan <bradphelan / xtargets.com> wrote: > though I do like the economy of > > > def foo : > > [1,2,3,4].each : i > > puts i > > [1,2,3,4].each : i > > puts i > > Perhaps another symbol other than : :: could work. As long as it is not followed by an identifier character it shouldn't collide. You could use this code for starting the block: if l.sub!(/::\s*$/,'') or l.sub!(/::\s+(.*)$/,' do |\1|') stack.push indent end and then this should work: def foo :: [1,2,3,4].each :: i puts i [1,2,3,4].each :: i puts i With this code, to do the equivalent of do...end w/o args you'd need an explicit do before the :: . This could be fixed in a real parser since it would know whether the block is for a builtin def/while/if/class statement versus a standard lambda block. In the lambda block context maybe you'd want "::\n" to mean "do ||" and use ":: *\n" to mean "do |*|" (which is equivalent to a block without args). Otherwise you couldn't get the equivalent of "do ||".