On Thu, Jan 26, 2012 at 3:21 PM, Robert Bradshaw <rober...@math.washington.edu> wrote: > On Thu, Jan 26, 2012 at 3:08 PM, Tom Boothby <tomas.boot...@gmail.com> wrote: >> On Thu, Jan 26, 2012 at 2:36 PM, Robert Bradshaw >> <rober...@math.washington.edu> wrote: >>> On Thu, Jan 26, 2012 at 1:51 PM, Michael Orlitzky <mich...@orlitzky.com> >>> wrote: >>>> On 01/26/12 16:36, William Stein wrote: >>>>>> >>>>>> Why *not* use it? >>>>> >>>>> The standard argument against preparser stuff like this is that you >>>>> have to be careful to not use it when writing .py code for the Sage >>>>> core library. But at least this matrix notation will always result >>>>> in a SyntaxError if used in Python code. >>>> >>>> A better reason is that, once implemented, someone has to maintain it >>>> forever. >>>> >>>> This is a fairly invasive preparse, and will likely cause more than a >>>> few bugs (see implicit multiplication for examples). >>> >>> I'd say it's a fairly simple preparse. The only tricky part is >>> multi-line handling in the face of iPython (where each line needs to >>> be pre-parsed individually, and that IMHO should be handled better at >>> a higher level where we buffer lines until we have a complete >>> statement and then preparse them as a whole). In any case, I'm willing >>> to maintain it for the next 5 years (which I expect will be trivial). >>> >>>> It also risks suggesting that sage matrices behave like Matlab ones, which >>>> could cause confusion. >>> >>> Or suggest they behave like Pari matrices which use the same syntax, >>> but I don't think that's any more of an issue than say integers or >>> division in Matlab vs Sage. >>> >>>> Furthermore, some preparses are mutually exclusive: if you implement >>>> this one now, and Mathematica comes out with a killer feature a year >>>> from now using similar syntax ([do; my; homework; for; me;]), you can't >>>> preparse that. >>> >>> If we found such a feature useful, we probably wouldn't try to embed >>> it into our syntax. >>> >>>> Some preparses are worth it, obviously; I wouldn't throw them both out >>>> because they might conflict with one another. But the bar for inclusion >>>> should be pretty high. >>> >>> I totally agree with you here, the bar for adding to the preparser >>> should be high. I think it's a good candidate here because (1) It's >>> easy to understand what it means (2) it's illegal Python syntax, and >>> (3) Python doesn't even have the notion of matrices, so it's doubly >>> clear (perhaps once you get the SyntaxError) that it's a Sage-only >>> feature. >>> >>> >>> >>> On Thu, Jan 26, 2012 at 12:30 PM, Tom Boothby <tomas.boot...@gmail.com> >>> wrote: >>>> On Thu, Jan 26, 2012 at 12:09 PM, Jason Grout >>>> <jason-s...@creativetrax.com> wrote: >>>> >>>>> Another option would be: >>>>> >>>>> [QQ: 1,2,3; 4,5,6] >>>> >>>> QQ:1 is a slice... >>>> >>>>> or, as Robert suggests: >>>>> >>>>> [1,2,3; 4,5,6, base_ring=QQ] -- but then it looks like base_ring=QQ is >>>>> another element. >>>> >>>> assignments aren't literals... but I don't like this. >>>> >>>> My thought for R[1,2,3;4,5,6] is that just as we preparse >>>> >>>> '[1..2]' to 'ellipsis_range(Integer(1),Ellipsis,Integer(2))', we'd preparse >>>> >>>> '[1,2,3;4,5,6]' to 'matrix_literal((1,2,3),(4,5,6))' >>>> >>>> where >>>> >>>> Ring.__getitem__(self, x) >>>> >>>> could have a fast option for matrix literals -> matrices. >>> >>> Interesting idea, but then we'd have to detect whether the brackets >>> were creating a list vs. acting as an index operator and prepares >>> differently in the two situations lest we have R[...;...] -> >>> R[matrix_literal(...)] forcing [...;...] -> [matrix_literal(...)], a >>> list of one item. >> >> Yeah, I had my doubts about that, too. Perhaps >> >> R[[...;...]] >> >> would be better, but I'm not really happy with this either. >> >>> One also has [a, b; c, d].change_ring(R). The exact notation for >>> specifying the basering can be deferred, though it does highlight the >>> importance of choosing a default according to the "principle of least >>> surprise." >> >> I'd like whatever notation we arrive at to be efficient. If we preparse >> >> RDF[1,2,3;4,5,6] -> Matrix(RDF,[[Integer(1),Integer(2),...]]) >> >> or use >> >> [...;...].change_ring(R) >> >> then we're gonna waste a lot of time, creating useless Integers and / >> or computing a common parent. > > I'm not extremely concerned about efficiency. These are literal > matrices after all, so presumably someone's typing them in by hand.
Fair enough. > (If they're programmatically generated, construct the matrix directly > or vai a better constructor if you're worried about efficiency. > Conversion of ZZ to QQ is much faster than the parsing or even str -> > ZZ in the first place). But if the basering can be worked into the > original constructor, that's a plus. It'd be nice to be able to pass > arbitrary keywords into the constructor for the same reason. > >> What of a new keyword, >> >> [1,2...;...] over R -> Matrix(R,[[R(1),R(2)...],[...]]) >> >> or perhaps something like >> >> [R$1,2,3;4,5,6] >> >> or >> >> [1,2,3;4,5,6]@R >> >> I'm not particularly attached to any idea. > > It's much simpler (technically and conceptually) to pick out the ring > if it lies entirely in the brackets. I'd go for a colon over # or @. Another issue: do we allow [1..10; 10..20]? I can't seem to construct matrices with matrix entries (this is not absurd) -- but should the preparser grok it? [[1..10; 10..20] ; [2..12; 14..24]] > > - Robert > > -- > To post to this group, send an email to sage-devel@googlegroups.com > To unsubscribe from this group, send an email to > sage-devel+unsubscr...@googlegroups.com > For more options, visit this group at > http://groups.google.com/group/sage-devel > URL: http://www.sagemath.org -- To post to this group, send an email to sage-devel@googlegroups.com To unsubscribe from this group, send an email to sage-devel+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/sage-devel URL: http://www.sagemath.org