[wg-camlp4] Monadic computation in Fan
Bob Zhang
bobzhang1988 at gmail.com
Sun Dec 1 03:59:33 GMT 2013
Dear List
I am very glad to let you know that I have incorporated a very
cool feature in Fan. a new DDSL l 'local_extend', which mutate the
parser inside the quotation, but restored all the parser it mutated
outside the quotation.
The use case is when you really need to mutate a tiny part of the
grammar -- copy alone can not work, since parsers are mutually
recursive -- now we can limit the mutation scope, however.
The ten lines below show how we introduce computation expression (F#
style) in Fan by *local_extend* DDSL, the introduced DDSL is called
"cexp"
```
let f (loc:Locf.t) meta content =
let module_name =
match meta with
| None -> Locf.failf loc "cexp module name must be specified via @"
| Some x -> String.capitalize x in
%local_extend{
exp: 10 RA
["let"; "!" ; bind as bi ; "in"; exp as x %{
let pat_exps = Ast_basic.list_of_and bi [] in
List.fold_right
(fun pat_exp acc ->
match pat_exp with
| %bind{ $p = $e} ->
%exp{$uid:module_name.bind $e (fun $p -> $acc)}
| _ -> assert false
) pat_exps x }
]
${Gramlib.parse_string_eoi exp ~loc content}}
let d = Ns.lang in
begin
Ast_quotation.add {domain = d; name="cexp";} Dyn_tag.exp f;
end
```
Test case
```
let v = %cexp at option{
let! a = Some 3 in
let! b = Some 4 in
Some (a + b)
}
```
--
Regards
-- Bob
--
Regards
-- Bob
More information about the wg-camlp4
mailing list