http://qs321.pair.com?node_id=1030833


in reply to Re^5: RFC: Simulating Ruby's "yield" and "blocks" in Perl (Python)
in thread RFC: Simulating Ruby's "yield" and "blocks" in Perl

> I don't really see a win with this style, though, over giving test a parameter, and just using standard function calls (I had a little play with coroutines on the way but that's really overkill for this).

Well I expected decorators to be more flexible, i.e. to redefine test() by putting a wrapper around it and not to built a new decorator @test (!?!)

But I'm not too proficient with Python, and I'm misunderstanding the code.

(well, there must be a reason why I prefer Perl's syntactic flexibility. ;-)

I suppose def _(a) is a way to workaround the limitations of lamda?

Is the name _ special (magic) or is it just a convention?

Cheers Rolf

( addicted to the Perl Programming Language)

Replies are listed 'Best First'.
Re^7: RFC: Simulating Ruby's "yield" and "blocks" in Perl (Python)
by MonkOfAnotherSect (Sexton) on Apr 26, 2013 at 15:13 UTC
      Thanx, it's clear now.

      I was just surprised that you need two decorators!

      I thought you could simply do something like

       test(def _(x): print("You are in block %s" % x))

      (like  test sub { print("You are in block $_[0]") } in Perl)

      Just to get closer to the Ruby feeling and to achieve this

      >>> def _(x): ... print("You are in block %s" % x) ... >>> test(_) In test You are in block 1 back in test You are in block 2 test lambda a: print("You are in block %s" % a)

      But one needs decorators to manipulate a literal function.

      Obviously, there is only this way to do it.

      FWIW Python decorators could quite easily be simulated in Perl with attributes.

      I will post this soon (if I can't find it already on CPAN) =)

      Cheers Rolf

      ( addicted to the Perl Programming Language)

        If you used a non-keyword such as "send" instead of "yield" you could do Evil and avoid the first decorator. This is left as an exercise. As for the second decorator, sure 'test(lambda a: print("You are in block %s" % a))' will work, but when you require more than one line you're back to using a decorator unless you want to do something truly horrible.

        Don't want to do something truly horrible.

        -T. "A gentleman is someone who knows how to play the bagpipes but doesn't."