Not entirely serious: recursive lambda?

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Michael Tobis

    Not entirely serious: recursive lambda?

    I came across the "japh" concept today and decided to do one of my
    own, obviously, interpreting the 'p' somewhat loosely,



    but I'm not entirely satisfied with it:

    ####
    # japh, for certain values of 'p'

    f=lambda(r,N):N and f((" acdefijlmnopqrs tuv"[N%19]+r,N/19))or(r,N)
    print f( ("",reduce(lamb da
    c,m:c*95+''.joi n(map(chr,range (32,127))).inde x(m),
    "!b)'1Mgh0z +fYQ]g::i^<&y~g)cnE-d=K&{GMNQ1gx+oo Y<~L##N'X]P2<@XYXwX3z",
    0)))[0]

    ####

    it bothers me that there are two statements. (In case you are
    wondering what they do, it's all essentially about changing from base
    95 to base 19. It's based loosely on this fine, simple recipe by Drew
    Perttula which I have found to be useful on several occasions:


    )

    Anyway, I'd much prefer an even uglier japh like this:

    # does not work
    print (lambda(r,N):N and $$$$((" acdefijlmnopqrs tuv"[N%19]+r,N/
    19))or(r,N))(
    ("",reduce(lamb da c,m:c*95+''.joi n(map(chr,range (32,127))).inde x(m),
    "!b)'1Mgh0z +fYQ]g::i^<&y~g)cnE-d=K&{GMNQ1gx+oo Y<~L##N'X]P2<@XYXwX3z",
    0)))[0]

    but what would $$$$ be for an unnamed function to call itself?

    I realize that lambda is something of an orphan and was arguably a bad
    idea for anything besides obfuscation, but obfuscation is exactly my
    purpose here. Can a lambda call itself without giving itself a name?
    Google was not my friend on this one, and I suspect there is no
    answer. Relax, I am not going to submit a PEP about it.

    mt
  • Miles

    #2
    Re: Not entirely serious: recursive lambda?

    On Sat, Jul 19, 2008 at 10:43 PM, Michael Tobis <mtobis@gmail.c omwrote:
    Can a lambda call itself without giving itself a name?
    Kind of. There's a couple ways I know of.

    The functional way, which involves the lambda receiving itself as an argument:

    (lambda f: f(10, f))(lambda n, f: n and (sys.stdout.wri te("%d\n" % n)
    or f(n-1,f)))

    The stack frame examination way:

    import sys, inspect, new
    (lambda:sys.std out.write('recu rse\n') or
    new.function(in spect.currentfr ame().f_code, globals())())()

    The functional way is probably harder to grok unless you've studied
    lambda calculus or had experience with "real" functional languages (I
    haven't). For fun, try throwing a Y combinator in there.

    -Miles

    Comment

    • Paul McGuire

      #3
      Re: Not entirely serious: recursive lambda?

      On Jul 19, 11:49 pm, Miles <semantic...@gm ail.comwrote:
      On Sat, Jul 19, 2008 at 10:43 PM, Michael Tobis <mto...@gmail.c omwrote:
      Can a lambda call itself without giving itself a name?
      >
      Kind of.  There's a couple ways I know of.
      >
      The functional way, which involves the lambda receiving itself as an argument:
      >
      (lambda f: f(10, f))(lambda n, f: n and (sys.stdout.wri te("%d\n" % n)
      or f(n-1,f)))
      >
      The stack frame examination way:
      >
      import sys, inspect, new
      (lambda:sys.std out.write('recu rse\n') or
      new.function(in spect.currentfr ame().f_code, globals())())()
      >
      The functional way is probably harder to grok unless you've studied
      lambda calculus or had experience with "real" functional languages (I
      haven't).  For fun, try throwing a Y combinator in there.
      >
      -Miles
      Here is Michael Tobis's original program, using the functional
      approach:

      print (lambda f:f(("",reduce( lambda
      c,m:c*95+''.joi n(map(chr,range (32,127))).inde x(m),
      "!b)'1Mgh0z +fYQ]g::i^<&y~g)cnE-d=K&{GMNQ1gx
      +ooY<~L##N'X]P2<@XYXwX3z",
      0),f)))(lambda (r,N,f):N and f((" acdefijlmnopqrs tuv"[N%19]+r,N/
      19,f))or(r,N,f) )[0]

      Très assombri! (according to Babelfish...).

      -- Paul

      Comment

      • Kay Schluehr

        #4
        Re: Not entirely serious: recursive lambda?

        On 20 Jul., 04:43, Michael Tobis <mto...@gmail.c omwrote:
        Can a lambda call itself without giving itself a name?
        Sure, use a fixed point combinator. I've just added this recipe:


        Google was not my friend on this one, and I suspect there is no
        answer.
        Even the Great Google can't help if you don't use the right
        keywords ;)

        Comment

        • bearophileHUGS@lycos.com

          #5
          Re: Not entirely serious: recursive lambda?

          Kay Schluehr:
          Sure, use a fixed point combinator. I've just added this recipe:
          http://aspn.activestate.com/ASPN/Coo.../Recipe/576366
          Does it work?

          Bye,
          bearophile

          Comment

          • Kay Schluehr

            #6
            Re: Not entirely serious: recursive lambda?

            On 20 Jul., 13:08, bearophileH...@ lycos.com wrote:
            Kay Schluehr:
            >
            Sure, use a fixed point combinator. I've just added this recipe:
            http://aspn.activestate.com/ASPN/Coo.../Recipe/576366
            >
            Does it work?
            >
            Bye,
            bearophile
            There are lots of informal derivations of the Y combinator on the web.
            I used one a while ago and translated the result into Python. So if
            there isn't an implementation bug it shall work.

            I added two examples for illustration purposes.

            Comment

            • Fredrik Lundh

              #7
              Re: Not entirely serious: recursive lambda?

              Michael Tobis wrote:
              I realize that lambda is something of an orphan and was arguably a bad
              idea for anything besides obfuscation, but obfuscation is exactly my
              purpose here. Can a lambda call itself without giving itself a name?
              Google was not my friend on this one, and I suspect there is no
              answer. Relax, I am not going to submit a PEP about it.
              gerson kurz' writings on lambdaization might be helpful (or not):




              </F>

              Comment

              • Michael Tobis

                #8
                Re: Not entirely serious: recursive lambda?

                Thanks all! What a remarkable set of answers, intelligent, thought
                provoking and informative without exception.

                Of course, now I can't use Paul's version; it hardly counts as a japh
                if someone else wrote it! It is probably the closest to my original
                vision, alas. Miles' second suggestion was the one I was fumbling
                toward; I will study it. No spoilers please.

                best
                mt

                Comment

                • Paul McGuire

                  #9
                  Re: Not entirely serious: recursive lambda?

                  On Jul 22, 11:52 am, Michael Tobis <mto...@gmail.c omwrote:
                  Thanks all! What a remarkable set of answers, intelligent, thought
                  provoking and informative without exception.
                  >
                  Of course, now I can't use Paul's version; it hardly counts as a japh
                  if someone else wrote it! It is probably the closest to my original
                  vision, alas. Miles' second suggestion was the one I was fumbling
                  toward; I will study it. No spoilers please.
                  >
                  best
                  mt
                  Michael -

                  Sorry to spoil your fun - the concept of a recursive lambda was such
                  an interesting diversion, I couldn't resist! I'll try to restrain
                  myself next time.

                  -- Paul



                  Comment

                  Working...