Macaulay2 / M2

The primary source code repository for Macaulay2, a system for computing in commutative algebra, algebraic geometry and related fields.
https://macaulay2.com
347 stars 231 forks source link

example output lines need synchronization #815

Open DanGrayson opened 6 years ago

DanGrayson commented 6 years ago

The problem occurs after the use of "input" below:


i26 : help "reading files"

o26 = reading files
      *************

      Sometimes a file will contain a single expression whose value you wish to have access
      to.  For example, it might be a polynomial produced by another program.  The function
      "get" can be used to obtain the entire contents of a file as a single string.  We
      illustrate this here with a file whose name is expression.

      First we create the file by writing the desired text to it.

      +------------------------------------------------------------------------------------------------------------+
      |i1 : fn = temporaryFileName()                                                                               |
      |                                                                                                            |
      |o1 = /var/folders/46/9b86vqxj4hjcngvy7kd7sb140000gn/T/M2-91118-0/0                                          |
      +------------------------------------------------------------------------------------------------------------+
      |i2 : fn << "z^6+3*x*z^4+6*y*z^4+3*x^2*z^2+12*x*y*z^2+12*y^2*z^2+x^3+6*x^2*y+12*x*y^2+8*y^3" << endl << close|
      |                                                                                                            |
      |o2 = /var/folders/46/9b86vqxj4hjcngvy7kd7sb140000gn/T/M2-91118-0/0                                          |
      |                                                                                                            |
      |o2 : File                                                                                                   |
      +------------------------------------------------------------------------------------------------------------+

      Now we get the contents of the file, as a single string.

      +-----------------------------------------------------------------------------+
      |i3 : get fn                                                                  |
      |                                                                             |
      |o3 = z^6+3*x*z^4+6*y*z^4+3*x^2*z^2+12*x*y*z^2+12*y^2*z^2+x^3+6*x^2*y+12*x*y^2|
      |     +8*y^3                                                                  |
      +-----------------------------------------------------------------------------+

      This isn't quite what you want, because a string containing a description of a
      polynomial is not the same as a polynomial.  We may use "value" to evaluate the string
      and produce the corresponding polynomial, after first setting up a polynomial ring to
      contain it.

      +-----------------------------------------------------------------------------+
      |i4 : R = ZZ/101[x,y,z]                                                       |
      |                                                                             |
      |o4 = R                                                                       |
      |                                                                             |
      |o4 : PolynomialRing                                                          |
      +-----------------------------------------------------------------------------+
      |i5 : f = value get fn                                                        |
      |                                                                             |
      |      6       4       4     2 2          2      2 2    3     2         2     |
      |o5 = z  + 3x*z  + 6y*z  + 3x z  + 12x*y*z  + 12y z  + x  + 6x y + 12x*y  +   |
      |     ------------------------------------------------------------------------|
      |       3                                                                     |
      |     8y                                                                      |
      |                                                                             |
      |o5 : R                                                                       |
      +-----------------------------------------------------------------------------+
      |i6 : factor f                                                                |
      |                                                                             |
      |       2          3                                                          |
      |o6 = (z  + x + 2y)                                                           |
      |                                                                             |
      |o6 : Expression of class Product                                             |
      +-----------------------------------------------------------------------------+

      Often a file will contain code written in the Macaulay2 language.  Let's create such a
      file.

      +------------------------------------------------------------------+
      |i7 : fn << "sample = 2^100                                        |
      |     print sample                                                 |
      |     " << close                                                   |
      |                                                                  |
      |o7 = /var/folders/46/9b86vqxj4hjcngvy7kd7sb140000gn/T/M2-91118-0/0|
      |                                                                  |
      |o7 : File                                                         |
      +------------------------------------------------------------------+

      Now verify that it contains the desired text with "get".

      +-------------------+
      |i8 : get fn        |
      |                   |
      |o8 = sample = 2^100|
      |     print sample  |
      +-------------------+

      To load and execute that code, use "load".  This is the function you will use most
      often for using bits of code you have previously written, unless you have incorporated
      them into a package, in which case you would use "loadPackage".

      +-------------------------------+
      |i9 : load fn                   |
      |1267650600228229401496703205376|
      +-------------------------------+

      The command "needs" can be used to load a file only if it hasn't already been loaded.

      +--------------+
      |i10 : needs fn|
      +--------------+

      For debugging or display purposes, it is sometimes useful to be able to simulate
      entering the lines of a file one by one, so they appear on the screen along with
      prompts and output lines.  We use "input" for this.

      +--------------+
      |i11 : input fn|
      +--------------+

      There are other ways to manipulate the contents of a file with multiple lines.  First,
      let's use "peek" to observe the extent of this string returned by "get".

      +--------------------------------------+
      |ii12 : sample = 2^100                 |
      |                                      |
      |oo12 = 1267650600228229401496703205376|
      +--------------------------------------+

      The resulting string has newlines in it; we can use "lines" to break it apart into a
      list of strings, with one row in each string.

      +-------------------------------+
      |ii13 : print sample            |
      |1267650600228229401496703205376|
      +-------------------------------+

      We may use "peek" to observe the extent of these strings.

      +-------+
      |ii14 : |
      +-------+

      We could even use "stack" to assemble the lines of the file into a net.

      +---------------------+
      |i15 : peek get fn    |
      |                     |
      |o15 = "sample = 2^100|
      |      print sample   |
      |      "              |
      +---------------------+

      Now let's remove that file.

      +------------------------------------+
      |i16 : lines get fn                  |
      |                                    |
      |o16 = {sample = 2^100, print sample}|
      |                                    |
      |o16 : List                          |
      +------------------------------------+

o26 : DIV
DanGrayson commented 6 years ago

The problem is that there is no way to distinguish lines coming from "input" and lines coming from an interaction with the debugger. See https://faculty.math.illinois.edu/Macaulay2/doc/Macaulay2-1.11/share/doc/Macaulay2/Macaulay2Doc/html/_the_spdebugger.html

DanGrayson commented 6 years ago

The relevant code is this:

M2outputRE := "(\n+)i+[1-9][0-9]* : "