Robert Bradshaw wrote:
> On Jun 9, 2009, at 9:47 AM, Jason Bandlow wrote:
> 
>>> On Jun 9, 2009, at 8:29 AM, Jason Bandlow wrote:
>>>
>>>> Hi,
>>>>
>>>> I ran across the following behavior in sage-3.4.1 and sage-4.0 (I
>>>> don't
>>>> have 4.0.1 yet), and I find it fairly disturbing.
>>>>
>>>>     sage: d = {'a': 1}         # Create some object
>>>>     sage: d
>>>>     {'a': 1}
>>>>     sage: type(d) = type({})   # Attempt to check the type but
>>>>                                #  foolishly use = instead of ==
>>>>
>>>>     TypeError: cannot coerce type '<type 'type'>' into a
>>>>     SymbolicExpression.        # An error is expected
>>>>
>>>>     sage: d                    # But now my data is gone!
>>>>     d
>>>>     sage: type(d)              # Replaced by a symbolic variable
>>>>     <class 'sage.calculus.calculus.SymbolicVariable'>
>> Robert Bradshaw wrote:
>>> This isn't a coercion issue, it's because of how functions are
>>> defined in Sage using the "f(x) = expr" notation using the preparser.
>>> I think that's too useful to get rid of. We could special case a
>>> warning for "type(x) = ..." but I'm not sure if that's the best idea.
>> Interesting!  This means the problem is worse than I thought.  
>> Anytime we
>> have data 'd' and 'e' and a function 'f', doing
>>
>>     sage: f(d) = e    # Instead of f(d) == e
>>
>> will raise a TypeError and replace 'd' with a symbolic variable.
>> Fortunately, though,
>>
>>     sage: if f(d) = e:  # The usual reason to check equality
>>
>> raises a SyntaxError first, so maybe this problem isn't so serious.
> 
> Yes, I think it's fairly rare to want to do this. Probably should be  
> added to an FAQ somewhere at least, as it's a surprising and subtle  
> side effect.

First of all, thanks very much for the explanations, Robert.  Is there a
particular FAQ where I could add a brief description of this?


-Jason

> 
>> Still, it seems like it should be possible for the preparser to check
>> whether f(d) evaluates to something (in which case, the assignment is
>> going to fail anyway) before it makes the argument(s) symbolic  
>> variables.
> 
> You don't want to dissallow
> 
> sage: f(x) = x^2
> [do some stuff with f]
> sage: f(x) = x^3
> [do some stuff with the new f]
> 
> - Robert
> 
> 
> 
> > 
> 


--~--~---------~--~----~------------~-------~--~----~
To post to this group, send email to sage-devel@googlegroups.com
To unsubscribe from this group, send email to 
sage-devel-unsubscr...@googlegroups.com
For more options, visit this group at http://groups.google.com/group/sage-devel
URLs: http://www.sagemath.org
-~----------~----~----~----~------~----~------~--~---

Reply via email to