a = b = 1 just syntactic sugar?

junk junk at geekabytes.net
Sat Jun 7 17:49:21 EDT 2003


Okay,  I know this is somewhat tangential to your discussion; please 
excuse my interruption.

If you care, I wrote a little function that will return the current 
function within a block.  This means, you can have anonymous recursive 
functions like this:

import selfref
factorial = lambda x: ((x==0)*1) or (x * selfref.myself(x-1))

Here is the code:

def myself(*args):
    prevFrame = sys._getframe(1)
    myOwnCode = prevFrame.f_code
    myOwnFuncObj = new.function(myOwnCode, globals())
    return myOwnFuncObj(*args)

The only thing this doesn't do is to capture default arguments!!!

Feedback please?

-- Seth James Nielson

Ed Avis wrote:

>Steven Taschuk <staschuk at telusplanet.net> writes:
>
>  
>
>>We already have closures, don't we?
>>
>>   >>> def f(x):
>>   ...     def g(y):
>>   ...         return x + y
>>   ...     return g
>>   ... 
>>   >>> q = f(3)
>>   >>> q(4)
>>   7
>>    
>>
>
>Which Python version does this require?  (The machine to hand has only
>1.5.2, although normally I use 2.2 or so.)
>
>  
>
>>Or do you want to be able to rebind names in outer scopes?
>>    
>>
>
>I mean things like
>
>  def make_adder():
>    x = 0
>    def incr():
>      x += 1
>      return x
>    return incr
>
>  f = make_adder()
>  g = make_adder()
>  print f(), f(), g(), g() # 1 2 1 2
>
>I do apologize for not testing this on the latest Python release, but
>I will upgrade this machine from 1.5.2 soon so I can test my programs
>before posting them to the newsgroup.
>
>Anyway, it's my understanding from past discussions that there is only
>one make_adder.x variable thoughout the whole program.  But I could be
>horribly, horribly confused.
>
>  
>
>>Is anonymity really the point?  If so, it seems quite a minor one to
>>me -- it's just not that big a deal to have to name a small function.
>>    
>>
>
>No, you're right, anonymity isn't really it; what I meant was the
>style of passing around code references and particularly those that
>can carry some scope with them.
>
>  
>
>>(Where are the complaints about having to name small classes?)
>>    
>>
>
>OTOH, think how awkward it would be if you had to name
>small expressions:
>
>    expr0 = f()
>    expr1 = 55
>    result = expr0 + expr1
>
>instead of
>
>    result = f() + 55
>
>OK - defining functions, even in a heavily 'functional' style of
>programming, happens much less often than creating expressions so the
>tradeoffs are different.  Still, I find that lambda often makes code
>more readable by letting you group related things together.
>
>  
>
>>Moreover, if the act of defining the function does not bind a name to
>>it, you need to get a reference to it some other way.  The obvious
>>thing to do is to have the function-defining text be an expression
>>which evaluates to the function object (so you stick it in a list or
>>whatever).  That in turn, as Python syntax is now, entails that it
>>can only contain expressions.
>>    
>>
>
>Indeed.  I know that the current restrictions on lambda are
>syntactic.  However, if the syntax were changed so that lambda could
>contain any one-line construct, that might make it more useful and
>less bizarre-seeming.
>
>  
>
>>But Lisp doesn't use indentation to delimit blocks, nor does it
>>distinguish between statements and expressions, so the comparison is
>>uninformative.
>>    
>>
>
>Just to be clear I wasn't advocating a big multiline lambda with a
>whole indented block underneath it, which I admit would be too
>complicated to work nicely into current expression syntax.
>
>  
>
>>Do you have a language in mind which is a better analogue to Python
>>and could teach us more about these issues?
>>    
>>
>
>I'm afraid I can't think of any because Python is the only language I
>know that treats assignment as binding a name to a (possibly
>immutable) object rather than mutating the state of an existing
>object.
>
>So in C, a variable 'int x;' denotes an area of memory where an
>integer sits, and you can do things to the integer like change its
>value, increment it, and of course get the value.  Perl is also like
>this except that the value could change from being an integer to a
>string or some other type.  (Actually, you can rebind names in Perl
>but that's not the normal programming style.)  In Python you can
>rebind the name x to a different integer (= and +=) but there is no
>way to modify the object pointed at except by calling methods on it -
>and integers do not have a 'set' method.
>
>Maybe Tcl is closer to Python since its 'set' appears to define names
>rather than changing an existing value.  Tcl has a wacky 'upvar'
>mechanism to access names defined in an enclosing scope.  But I think
>this is dynamic scope - the caller's scope, not the scope defining the
>called function - so I don't think it can be used to implement
>closures.  But it would suprise me if Tcl didn't have _some_ way to do
>full closures, you can warp the language to do almost anything.
>
>  
>
>>The main problem is syntactic; thus Terry's suggestion that you
>>produce a grammar rule for your proposal.  (That means BNF, not an
>>informal description such as "anything that can fit on a line".
>>    
>>
>
>How about
>
>    lamda_form ::=
>                "lambda" [parameter_list]: simple_stmt
>
>As you know, simple_stmt is a statement that fits on one line.
>
>  
>
>>>What is strange is not so much the grammar rule for lambda itself, as
>>>the dividing line between what is a statement and what an expression.
>>>      
>>>
>>Fwiw, I agree somewhat with this.  (It just doesn't bother me at all
>>in practice.)
>>    
>>
>
>It didn't bother me at all (well, when first starting to learn the
>language I wondered why 'print' had a different syntax to other calls,
>and whether I could define my own procedures that could be called in
>the same way) until I bumped into the lambda restrictions.  It looks
>as though it is lambda that is particularly peculiar, even though in
>fact it is just inheriting the statement/expression divide from other
>parts of the language.  Elsewhere you don't have to care about the
>difference, because any expression can be used as an expression_stmt.
>
>  
>








More information about the Python-list mailing list