Welcome, guest | Sign In | My Account | Store | Cart

An attempt to write a whole program inside a python lambda.

Python, 90 lines
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#Dont know if this has been done
#a lot before, but I
#got inspired from the web site
#http://p-nand-q.com/python/stupid_lambda_tricks.html
#and tried to write a lambda that
#is a complete program, except for
#the import.
#Sure a lot of fun to write.
#
import sys #For the write function


#All variables are inside of the lambda
#
(lambda dbg=1, n=(lambda:0):

   #start main lambda body
   (
     #List of characters that we filter out
     #of user input
     setattr(n, 'letrs', ['a', 'b', 'c', 'd', 'e',
     'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p',
     'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
     'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K',
     'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V',
     'W', 'X', 'Y', 'Z', 
     '.', ',', ';', ':', '*', '-', '_', '#', '@', '$', '%',
     '^', '&', '(', ')', '{', '}', '[', ']', '+', '=',
     '<', '>', '/', '?', ' ' ]),
     
     #make functions n.prit, n.fac, etc.
     #Use write function from p-nand-q.com web site
     
     setattr(n, 'prit', lambda *s:
        sys.stdout.write(' '.join(map(str, s) + ['\n'] ))),
     
     setattr(n, 'fac', lambda m, ak:
       ((m < 1 and [ak]) or [n.fac(m-1, m*ak)] )[0]),

     
     #Variable to test whether we get out of loop
     setattr(n, 'outvr', 1),

     #Use list comprehension to loop thru tuple
     #until input is 0, or preset number of
     #times thru the loop
     
     [(
     
     #Get user input
     setattr(n, 'b', raw_input('Enter a number: ')),

     #Filter out letters from string
     setattr(n, 'c', [i for i in n.b if not i in n.letrs]),

     #Join list back to string
     setattr(n, 'dt', ''.join(n.c)),

     #Check if we get the empty string
     setattr(n, 'd', (n.dt == '' and '0' or n.dt)),

     #For debug
     (dbg and n.prit('n.d:',n.d)),
    
     #If len of string is 0, return 1, else return int of string
     setattr(n, 'e', ( len(n.d) <= 0 and 0 or int(n.d))),

     #Set variable to see if we get out of loop
     setattr(n, 'outvr', n.e),
     #For debug
     (dbg and n.prit('n.outvr:', n.outvr)),
     
     #Find factorial
     setattr(n, 'f', n.fac(n.e, 1)),
     n.prit('Factorial of', n.e, 'is:', n.f),

     
     #Make lists of factorials 
     setattr(n, 'faclis', [(i, n.fac(i,1)) for i in range(n.e+1)] ),
     
     #print lists of facs 
     n.prit('Fac list:', n.faclis),
          
     
    ) for j in range(100) if n.outvr > 0 ] #end loop

   )#end main lambda 


)(dbg=0) #Call lambda program

Just for fun.

6 comments

James Mills 12 years, 5 months ago  # | flag

Great little example! :) Nice work!

--JamesMills (prologic)

Ryan Lie 12 years, 4 months ago  # | flag

Hi, you can use __import__('sys').stdout.write() to avoid the import statement.

nxw (author) 12 years ago  # | flag

Revised the program a little.

# It now uses a while loop.



(lambda dbg=1, n=(lambda:0):

# Start main lambda body
(
 # For the write function.
 setattr(n, 'sys', __import__('sys')),

 # while in a lambda.
 setattr(n, 'wil', lambda cndcn = 'True', 
                   fn=(lambda:0), 
                   dcn={} : (

   setattr(n.wil, 'fn', fn),
   dcn.update({'wil': n.wil}),  #add to dictionary to tell eval where 'wil' is.
   dcn.update({'n': n}),   #tell eval where 'n' is.
   setattr(n.wil, 'kod', 
     compile("while " + cndcn + " : wil.fn.__call__()\n", '', 'exec')),
   eval(n.wil.kod, dcn),
  )
),




 # List of characters that we filter out
 # of user input.
 setattr(n, 'letrs', ['a', 'b', 'c', 'd', 'e',
 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p',
 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K',
 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V',
 'W', 'X', 'Y', 'Z', 
 '.', ',', ';', ':', '*', '-', '_', '#', '@', '$', '%',
 '^', '&', '(', ')', '{', '}', '[', ']', '+', '=',
 '<', '>', '/', '?', ' ' ]),

 # make functions n.prin, n.fac, etc.


 setattr(n, 'prin', lambda *s:
    n.sys.stdout.write(' '.join(map(str, s) + ['\n'] ))),

 setattr(n, 'fac', lambda m, ak:
   ((m < 1 and [ak]) or [n.fac(m-1, m*ak)] )[0]),


 # Variable to test whether we get out of loop.
 setattr(n, 'outvr', 1),

 # Use while to loop 
 # until input is 0 

 n.wil('n.outvr > 0', lambda:
 (

 # Get user input
 setattr(n, 'b', raw_input('Enter a number: ')),

 # Filter out letters from string
 setattr(n, 'c', [i for i in n.b if not i in n.letrs]),

 # Join list back to string
 setattr(n, 'dt', ''.join(n.c)),


 # Check if we get the empty string
 setattr(n, 'd', (n.dt == '' and '0' or n.dt)),

 # For debug
 (dbg and n.prin('n.d:', n.d)),

 # If len of string is 0, return 1, else return int of string
 setattr(n, 'e', ( len(n.d) <= 0 and 0 or int(n.d))),

 # Set variable to see if we get out of loop
 setattr(n, 'outvr', n.e),
 # For debug
 (dbg and n.prin('n.outvr:', n.outvr)),


 # Find factorial
 setattr(n, 'f', n.fac(n.e, 1)),
 n.prin('Factorial of', n.e, 'is:', n.f),


 # Make list of factorials 
 setattr(n, 'faclis', [(i, n.fac(i,1)) for i in range(n.e+1)] ),

 # print list of factorials 
 n.prin('Fac list:', n.faclis),


)
), 



)  #end main lambda 


)(dbg=0) # Now call the lambda program
nxw (author) 11 years, 7 months ago  # | flag
#Simpler Example
#Idea to put statements inside expressions.
#
#Use: eval(compile())
#
#
#For python 2.5. 
#
#
#Entire program is inside lambda. 
#

(lambda dbg=1, den=(lambda:0):
#Start main lambda body.
( 

  #Need this for the write function.
  setattr(den, 'sys', __import__('sys')),

  #Letters to filter out of user input.
  setattr(den, 'letrs', ['a', 'b', 'c', 'd', 'e',
    'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p',
    'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
    'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K',
    'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V',
    'W', 'X', 'Y', 'Z', 
    '.', ',', ';', ':', '*', '-', '_', '#', '@', '$', '%',
    '^', '&', '(', ')', '{', '}', '[', ']', '+', '=',
    '<', '>', '/', '?', ' ' ]),

  #Useful functions: fak, fib, prin, etc.

  #print function
  setattr(den, 'prin', lambda *s:
    den.sys.stdout.write(' '.join(map(str, s) ))),

  #factorial function   
  setattr(den, 'fak', lambda n, ak=1: ak if n < 1 else 
    (den.fak(n-1, n*ak))    
    ),

  #fibonacci function
  setattr(den, 'fib', lambda n, p=1, q=1: 0 if n == 0 else (
       p if n < 2 else den.fib(n-1, q, p+q))
    ),

  #Function to loop
  setattr(den, 'asknmbr', lambda: (

    #Get user input.
    setattr(den, 'b', raw_input('Enter a number: ')),

    #Filter out letters from string.
    setattr(den, 'c', [i for i in den.b if not i in den.letrs]),

    # Join list back to string.
    setattr(den, 'd', ''.join(den.c)),

    #debug
    dbg and den.prin("d: ", den.d, '\n' ),


    #Check if get the empty string.
    setattr(den, 'e', (den.d == '' and '0' or den.d)),

    #If len of string is 0, return 1, else return int of string.
    setattr(den, 'f', ( len(den.e) <= 0 and 0 or int(den.e))),

    #debug
    dbg and den.prin("f: ", den.f, '\n' ),


    #Make list of numbers.
    setattr(den, 'lis', range(0, den.f+1)),

    #debug
    dbg and eval(compile('for i in den.lis: print i', '', 'exec')),


    #Make and print maths. 
    setattr(den, 'faklis', [(i, den.fak(i)) for i in den.lis]),

    den.prin('factorial list: \n', den.faklis, '\n'),

    setattr(den, 'fiblis', [(i, den.fib(i)) for i in den.lis]),

    den.prin('fibonacci list: \n', den.fiblis, '\n'),


    #Last item of list for return value.
    den.f

    #Get function return value.
  )[-1]  

  #End of asknmbr.
  ), 


  #Loop until function returns 0.
  eval(compile('while den.asknmbr() > 0: pass', '', 'exec')),

)

#Now call the lambda program.
)(dbg=0)
nxw (author) 11 years, 3 months ago  # | flag
#Another version.


#Run the set of nested lambdas and return a list
#while the length of the returned list > 1.
#Exit the while loop if the user presses only 
#the enter key, or enters only the digit 0,
#or enters no digit characters.

while(
 len(
   #Lambda to print a list of pairs of integers and their factorials.
   (lambda n: 
       #The second element of the list, n[1], is the set of functions that
       #the lambda below passed up.  
       #The first element of the list, n[0], is the result number 
       #that the lambda below passed up.

       n[1].pri1(

          [
            (i, n[1].fak(i) ) for i in range(0, n[0]+1)
          ]
                )#pri1

    )( #Apply this lambda to the lambda below.


(lambda n,
      #This parameter lambda that will hold the useful functions:
      ben=(lambda:0):
      #Here define some useful functions.

      setattr(ben, 'fak', lambda m, ak=1: ak if m < 1 else ben.fak(m-1, m*ak)) or

      setattr(ben, 'sys', __import__('sys')) or
      #A print function that returns its argument: 
      setattr(ben, 'pri1', lambda s: ben.sys.stdout.write(str(s)+'\n') or s) or

      [ben.pri1(n), ben] )( #Apply this lambda to the lambda below.

#If the result exceeds the recursion limt, then return 1
#otherwise return the result.
(lambda x: x if x < 998 else 1)( #Apply this lambda to the lambda below.  

#If the length of the string is 0, then return 0, 
#otherwise return the int value of the string.
(lambda e: len(e) <= 0 and 0 or int(e))( #Apply this lambda to the lambda below.  

   #Return the string '0' if the string is the empty string.
   #otherwise return the string. 
  (lambda d: (d == '' and '0' or d)) ( #Apply this lambda to the filtered string below.

    #Join list of strings into 1 string.
    ''.join(
    #Get user input and filter out letters and other non digit characters
    #from the input string, and build a list of strings.
      [i for i in raw_input('Enter an integer number: ') if not i in 

        [ 
          'a', 'b', 'c', 'd', 'e',
          'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p',
          'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
          'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K',
          'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V',
          'W', 'X', 'Y', 'Z', 
          '.', ',', ';', ':', '*', '-', '_', '#', '@', '$', '%',
          '^', '&', '(', ')', '{', '}', '[', ']', '|', '+', '=',
          '<', '>', '/', '?', ' ', '!' , '\\'

        ]

      ]

    )
   )
  )
 )
)

)

) > 1): pass
nxw (author) 10 years, 9 months ago  # | flag

class inside lambda program adapted from
tutorial at pygtk website

(lambda b=(lambda:0),
sa=setattr :(


sa(b, 'pygtk', __import__("pygtk")),
b.pygtk.require('2.0'),
sa(b, 'gtk', __import__("gtk")),


sa(b, 'hk', type('hkt', (), 
{ 

 'nm' : 0,
 'fnm': 0,

 'prin' : lambda self, *s: 
   __import__('sys').stdout.write(
   ''.join([str(i) for i in s])
 ),


 'fac' : lambda self, n, d=(lambda:0):(
   sa(d, 'ak', 1),
   [0 for i in range(1, n+1) 
   if sa(d, 'ak', i*d.ak) < None],
   d.ak
 )[-1],


 'calbak': lambda self, 
                 widget, 
                 dta:(

   dta == 'bt1'  and 
     (
       sa(self, 'nm', self.nm + 1),
       self.prin(self.nm, '\n'), 
     ),


   dta == 'bt2' and 
    ( 
      sa(self, 'fnm', self.fac(self.nm)),
      [0 for i in 
        range(0, int(self.nm + 1)) if
        self.prin(i, ', ', self.fac(i), '\n')
      ]
     ), 


   dta == 'btn3'  and 
    (
       sa(self, 'nm', self.nm - 1),
       self.prin(self.nm, "\n"), 
     ),  

 ),



'__init__': lambda self :
( 


  self.prin(self.nm, '\n'),

  sa(self, 'window', 
    b.gtk.Window(b.gtk.WINDOW_TOPLEVEL)),

  self.window.set_title("Calc"),

  self.window.connect("delete_event", self.delete_event),

  sa(self, 'box1', b.gtk.VBox(True, 10)),

  self.window.add(self.box1),

  sa(self, 'bt1', b.gtk.Button(label='+')),
  self.bt1.connect("clicked", self.calbak, "bt1"),
  self.box1.pack_start(self.bt1, True, True, 0),
  self.bt1.show(),


  sa(self, 'bt2', b.gtk.Button(label = 
      "  Factorial  ")),
  self.bt2.connect("clicked", self.calbak, "bt2"),
  self.box1.pack_start(self.bt2, True, True, 0),
  self.bt2.show(),


  sa(self, 'btn3', b.gtk.Button(label='-')),
  self.btn3.connect("clicked", self.calbak, 'btn3'),
  self.box1.pack_start(self.btn3, True, True, 0),
  self.btn3.show(),



  self.box1.show(),

  self.window.show(),
  None 
  )[-1], 

 'delete_event' : 
   lambda self, 
   widget, 
   event, 
   data=None:(
   b.gtk.main_quit(),
   False 
   )[-1],


})), 


sa(b, 'mn', lambda: b.gtk.main()),


( 
 sa(b, 'helo', b.hk()),
 b.mn()
) if __name__ == "__main__" else 0))()
Created by nxw on Fri, 3 Jul 2009 (MIT)
Python recipes (4591)
nxw's recipes (1)

Required Modules

Other Information and Tasks