Saturday 17 November 2012

MathP is not CL Standards Compliant

Bad news! MathP, my very own mathematics notation library for Common Lisp, breaks the ANSI CL standard. The problem is that unread-char cannot be called consecutively without calling something that will read a character (like read-char). From the CL Hyperspec page for unread-char:
It is an error to invoke unread-char twice consecutively on the same stream without an intervening call to read-char (or some other input operation which implicitly reads characters) on that stream

I used it to basically peek multiple characters ahead, like peek-char, but for multiple characters. This may be why MathP doesn't work in CLISP. That allows me to have arbitrary operators. For example, I could have the following as distinct operators:
  • * for multiplication
  • ** (perhaps for exponentiation)
  • .* (perhaps for element-wise multiplication, like in MATLAB)
  • *. (dot product?)
  • *.* (perhaps for element-wise exponentiation)
  • etc.

I thought I was being clever, but such a use contravenes the standard pretty clearly. So I'm interested in alternatives. Does anyone know if it's possible to do multiple unread-chars with other stream implementations? Also, can you read lisp from them with standard reading functions?

2 comments:

  1. You can unread-string in this way:
    Make a concatenated stream from a string stream and *standard-input* and set the *standard-input* to it.
    Then in a pertinent moment check by CONCATENATED-STREAM-STREAMS if your string stream has been depleted and reset *standard-input* not to have a concatenated stream of concatenated stream of ... in the *standard-input* variable with time.

    ReplyDelete
  2. Thanks Goheeca, I'd overlooked concatenated streams. That's a little corner of the CLHS I hadn't absorbed... It looks perfect for this type of problem.

    ReplyDelete