On 16/04/2009 15:47, Daniel Keep wrote:
Yigal Chripun wrote:
On 15/04/2009 18:50, BCS wrote:
Hello Yigal,
sounds silly to me. Why not simply generalize and allow
defining in-fix functions like in functional languages? that
also includes allowing any unicode character[s].
lexing and (more importantly) parsing become a major problem if
you allow that
Since it is done in other languages (for example Scala), I'm sure
it's not impossible to implement. I don't think Scala is that much
more troublesome to lex/parse.
That's not a very good argument. Lots of things are possible;
doesn't mean they're a good idea.
Operator precedence determines how expressions are parsed. Having
user-defined operators would require the code to be parsed once to
get the operator definitions, then re-parsed with a different
meaning. Euch.
That said, I'm OK with adding operators with well-defined meanings
to the language on an as-needed basis. opDot, opUnion, opCross,
etc.
-- Daniel
say we have the expression (2 + 3 foo 4) (foo is infix function).
Scala parses this as: 2 + 3.foo(4) so there is no parsing problems with
this.
see http://www.scala-lang.org/node/118
Eiffel is similar (also an OOP approach):
2 + 4 is the same as 2.plus(4)
the definition of plus is (alias is used to specify the operator):
plus alias "+" (other: INTEGER): INTEGER
-- ... Normal function declaration...
end
from wikipedia for Eiffel:
The range of operators that can be used as "alias" is quite broad;
they include predefined operators such as "+" but also "free
operators" made of non-alphanumeric symbols. This makes it possible
to design special infix and prefix notations, for example in
mathematics and physics applications.
Every class may in addition have one function aliased to "[]", the
"bracket" operator, allowing the notation a [i, ...] as a synonym for
a.f (i, ...) where f is the chosen function. This is particularly
useful for container structures such as arrays, hash tables, lists
etc.
in Haskell you can define both precedence and associativity for
operators. I don't know Haskell but found this link which explains the
syntax:
http://www.haskell.org/tutorial/functions.html
I guess we need someone who knows Haskell to explain how they
implemented this.