On 9/18/07, Joel B. Mohler <[EMAIL PROTECTED]> wrote:
>
> I don't have a strong opinion about the original proposition ... although
> I
> have spent the last week being thoroughly vexed by python being zero-based
> when all the things I would write on paper about math would index things
> one-based.


One solution to that is to just write things 0-based in your math papers.
I've been doing that in all the mathematics I write for the last 2 years
or so, and nobody complains.   Consider an $n$-dimensional vector
space with basis $v_0, \ldots, v_{n-1}$.

However, I did want to say this about the preparser.  My impression is that
> it
> is written by doing very manual character/string reading.  I think
> the 'tokenize' module could probably make the code much much cleaner.  It
> has
> annoying (but understandable) semantics.  Here's an example below.


True.  I've been looking forward to somebody rewriting the preparse(...)
function for a long time.  Much to my surprise nobody has.  I don't think
anybody has even tried, though people have suggested they would try
on a few occasions. I would certainly be happy if it were to happen, though
I'm not going to do it myself, since the current version works perfectly
well, is easy to understand, and I have other things that I have to do.
Also, speeding up the preparser might have little noticeable effect on the
speed of Sage, since all actual work / computation happens after preparsing.
That said, if you do
    sage: search_src('sage_eval')
you'll see 83 places in the Sage library code itself that involve calling
the Sage preparser, and those could be faster.

Using tokenize as you illustrate below would probably be a simple
intermediate way to rewrite the preparser without going nuts trying
to do something too complicated.  E.g., the preparser currently
has code to find string literals in the input line -- the tokenize module
does the same thing, probably much better.   Also the preparser
has code to parse out valid identifiers, and again the tokenize module
below does that automatically.

I think "modifying preparse.py to benefit from the Python standard tokenize
module" would be a good trac enhancement ticket:
   http://trac.sagemath.org/sage_trac/ticket/689


--
> Joel
>
> import tokenize
>
> # helper class to generate a stream from a string
> class line_token_stream:
>     def __init__( self, s ):
>         self.line = s
>
>     def __call__( self ):
>         if self.line:
>             s = self.line
>             self.line = None
>             return s
>         raise StopIteration
>
> def tokenize_line( s ):
>     for t in  tokenize.generate_tokens( line_token_stream( s ) ):
>         yield t
>
> for i in tokenize_line( "func(1+2)" ):
>     print i
>
> >
>


-- 
William Stein
Associate Professor of Mathematics
University of Washington
http://wstein.org

--~--~---------~--~----~------------~-------~--~----~
To post to this group, send email to sage-devel@googlegroups.com
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at http://groups.google.com/group/sage-devel
URLs: http://sage.scipy.org/sage/ and http://modular.math.washington.edu/sage/
-~----------~----~----~----~------~----~------~--~---

Reply via email to