How do you unregister from here. I tried 3 times
already.
Help
----- Original Message -----
Sent: Wednesday, November 29, 2006 3:58
PM
Subject: Re: Extensible infix
operators
On 11/29/06, John
Hind <john.hind@zen.co.uk>
wrote:
I'm
working on a calculator program which uses Lua as its
_expression_ evaluator. I'd like to be able to offer extensible infix
operators so you'd be able to write something like:
c = a func
b
where a and b are numeric variables or expressions and func is a
function. This would be evaluated as: c = func(a, b)
For now, you can do it this way in metalua:
mlp.lexer.register
"func" -- register "func" as a keyword mlp.expr.add_infix{
keyword = "func", -- operator name prec = 40, --
precedence assoc = "left", -- associativity: left, right or none
(default is "left") builder = |x| +{ func( -{x[1]}, -{x[2]} ) } --
_expression_ builder }
prec is the precedence of the operator, you
can find other precedences in mlp_expr.lua, and *maybe* in the doc. If the
builder looks too scary, you might prefer the equivalent no-syntax-sugar,
no-quasi-quotes version:
function (x) return `Call{ `Id "func", x[1],
x[2] } end
But this is far from perfect: - "func" is now a
keyword; - you have to do this for every function you want to use as
prefix/infix/potfix operators
I really like Haskell's solution, which
allows to put arbitrary functions in infix position, if you put it between
backquotes, as in: "a `func` b". Unfortunately, it clashes with my syntax for
algebraic datatypes, so until I can think of an alternative syntax that
doesn't look too awful and isn't ambiguous with something else, I won't add
it. If you've got suggestions...
You can modify the parser more
substantially to support arbitrary infix notations, but you'd quickly run into
ambiguous syntaxes if you want it to still parse real Lua code. That might be
acceptable for you if you only use it with a limited subset of Lua.
The best solution would probably be to create a separate math
expressions parser, so that you don't mess up your regular Lua _expression_
syntax, but you'd have to wait until I've properly documented the grammar
generator. Meanwhile you can ask for support through private mail.
|