[Ur] Functional infix operators ?
Gabriel Riba
griba2001 at gmail.com
Sun Feb 22 09:58:15 EST 2015
Sergey Mironov <grrwlf <at> gmail.com> writes:
>
> I'd be happy to have a feature of calling 2-arg function [func a b]
> using (a`func`b) infix notation. I suppose, adding this syntax would
> be easier than full-scale infix operators support suggested by Ziv,
> and could be a starter point for the larger-scale work.
>
A better alternative for backtick quoted paths, lexified as one entity it
can be treated as an operator with precedence and associativity, and it can
be intermixed with other complex expressions without the need for them to be
parenthesized.
So it works with this test program:
(* --- Test program *)
structure Test = struct
structure Nested = struct
fun myprod (x: int) (y: int) = x * y
end
end
val test = (1 + 0 `plus` 1 + 1 `Test.Nested.myprod` 2 + 1) =
(((1 + 0) `plus` (1 + 1)) `Test.Nested.myprod` (2 + 1))
fun main (): transaction page = let
in return <xml><body>{[test]}</body></xml>
end
(* --- Mods needed *)
To achieve this the following insertions are needed:
* In urweb.lex :
** In the definitions section:
backtick_path = `([A-Z][A-Za-z0-9_]*\.)*[a-z_][A-Za-z0-9_']*`;
** In the rules section:
<INITIAL> {backtick_path} => (Tokens.BACKTICK_PATH (
substring (yytext, 1, size yytext -2),
pos yypos, pos yypos + size yytext));
* In urweb.grm :
** In the declarations section
*** To the terminals production (%term)
| BACKTICK_PATH of string
*** To the operators associativity commands, before (%left ANDALSO)
%left BACKTICK_PATH
*** To the "eexp" production, with the other binary ops. cases
| eexp BACKTICK_PATH eexp (let
val path = String.tokens (fn ch => ch = #".") BACKTICK_PATH
val pathModules = List.take (path, (length path -1))
val pathOp = List.last path
val e = (EVar (pathModules, pathOp, Infer)
, s (BACKTICK_PATHleft, BACKTICK_PATHright))
val e = (EApp (e, eexp1), s (eexp1left, BACKTICK_PATHright))
in
(EApp (e, eexp2), s (eexp1left, eexp2right))
end)
More information about the Ur
mailing list