[Haskell-cafe] Prefix/Infix operators
Robert Dockins
robdockins at fastmail.fm
Fri Jul 7 10:11:49 EDT 2006
On Jul 7, 2006, at 8:57 AM, Sara Kenedy wrote:
> Hello everybody,
>
> I checked the topics in Haskell-Cafe about prefix/infix operators but
> I did not find them. Now I bring my questions to here to ask you.
>
> 1) I have a Common-Lisp code representing an expression result as
> follows
> ((MPLUS SIMP)
> ((MTIMES SIMP) ((RAT SIMP) 1 2) ((MEXPT SIMP) $X 2))
> ((MTIMES SIMP) ((RAT SIMP) 1 3) ((MEXPT SIMP) $X 3)))
>
> 2) I attempted to change it to mathematics operators, replacing
>
> MPLUS SIMP -> +
> MEQUAL SIMP -> =
> RAT SIMP -> /
> MEXPT SIMP -> ^
[snip some code]
> 3) And NOW I want to transfer from prefix operator into infix
> operator, for example: From
> ((+)
> ((*) ((/) 1 2) ((^) x 2))
> ((*) ((/) 1 3) ((^) x 3)))
>
> in to the expression: 1/2*x^2+1/3*x^3
>
> I try to figure out it, but this time it is not successfully. If you
> are familiar with that, please share with me. Many thanks to all.
If I were approaching this problem, I'd probably think of it like a
very small compiler. That is, I would 1) define the abstract syntax
as a algebraic data type 2) parse the S-expression into the abstract
syntax and 3) pretty-print the new concrete syntax with infix operators.
Even for a language as small as this one, I think the benefits of
approaching the problem in a modular way outweigh the overhead. I
think it would be very difficult to get, eg, operator precedence
correct by just doing text manipulations on the string.
Of course, since the source is s-expressions anyway, there's always
the option of writing a lisp macro to do the whole thing and thereby
get parsing for free.
As a mostly related aside, here's a cool looking tutorial google
turned up about writing a scheme interpreter in Haskell:
http://halogen.note.amherst.edu/~jdtang/scheme_in_48/tutorial/
overview.html
Rob Dockins
Speak softly and drive a Sherman tank.
Laugh hard; it's a long way to the bank.
-- TMBG
More information about the Haskell-Cafe
mailing list