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
_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe