From: murphy Date: 2005-08-09T23:21:11+09:00 Subject: Re: new block notation (was: Re: ruby-dev summary 26468-26661) Murrr... why can't we use do...end here? double = do |x| x * 2 end But I think do...end and {...} should be synonyms. Two intuitions disagree - so think again. Ok, if behaves like a method, just that is has no name, we should look at method definition syntax rather than block syntax. def double x x * 2 end double = def x x * 2 end double = def x; x * 2; end double = def(x) x * 2; end matz said "def is not sufficient since we don't define anything here". So what about do: double = do x x * 2 end double = do x; x * 2; end double = do(x) x * 2 end double = do(x = 1, **a) x * 2 end This is illegal in Ruby 1.8, so it shouldn't break code. Surely I forgot something, but to me it looks nice, because - it looks like def - it looks like block - it is not used so far (I hope) - it is short (enougth; you don't use lambda so much) - it is readable (in my eyes) I'm basically with Daniel Brockman, my version of his counter: make_counter = do(start=0) do start += 1 end end counter = make_counter[5] 5.times { puts counter.call } (Even if I don't understand why you need this; 0.counter would be cooler. I don't use lambdas much, maybe because I'm grown with Pascal.) Now, the optic / syntax check: do(a, b) a + b end.call {1: do(a, b) puts "Hello World" end} do(bar: do(a, b) a * b end, qux: do(str) str.reverse end) funs = [do(a, b) a - b end, do(a, b) a + b end] funs = [ # compare length, noise, rubyness... ->(a, b) { a - b }, fun(a, b) { a - b }, do(a, b) a + b end, ] # This one looks like Ruby, I think def adder a do b a + b end end adder = do a do b # greetings from Haskell? a + b end end # ok, this is not Haskell search_fun = do x: 0, y: 0, width: @width, height: @height, type: Types.All, limit: @objects.size, skip: 0, destructive: false, &block block ||= do object; true end # etc. end Sad thing: Without parameters, it look strange: now = do() Time.now end now = do; Time.now end now = do Time.now end This is the same with methods; and we usually give a method >= 3 lines. We should do with lambdas, too, if we really think of them as anonymous methods; and you can always trade \n for ; if you are a one liner guy.