* [Caml-list] [ANN] ppx_monadic.1.0.2, ppx for monadic do, pattern guards and monadic comprehension
@ 2015-01-13 14:23 Jun Furuse
2015-01-14 8:40 ` [Caml-list] [ANN] ppx_monadic.1.0.2, ppx for monadic do, pattern oleg
0 siblings, 1 reply; 11+ messages in thread
From: Jun Furuse @ 2015-01-13 14:23 UTC (permalink / raw)
To: caml-list
Hi,
I have OPAM-released ppx_monadic.1.0.2, a ppx extension for
* Monadic do notation: do_;
* Pattern guards: when p <-- e -> ..
* List and monadic comprehension: [%comp x || p <-- e; ..]
These 3 extensions share the same do-sequence syntax sugar, which is a
sequence of the following phrases:
* Monadic bind : p <-- e
* Action: e
* Escape: (); e (to write the normal sequential execution)
* let .. in .. and [%x .. ]
It is already available via OPAM: opam intall ppx_monadic. More
detailed documentation and source code is available at:
https://bitbucket.org/camlspotter/ppx_monadic
Enjoy!
Jun
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [Caml-list] [ANN] ppx_monadic.1.0.2, ppx for monadic do, pattern
2015-01-13 14:23 [Caml-list] [ANN] ppx_monadic.1.0.2, ppx for monadic do, pattern guards and monadic comprehension Jun Furuse
@ 2015-01-14 8:40 ` oleg
2015-01-18 14:47 ` Jun Furuse
0 siblings, 1 reply; 11+ messages in thread
From: oleg @ 2015-01-14 8:40 UTC (permalink / raw)
To: caml-list; +Cc: jun.furuse
Jun Furuse wrote:
> * Monadic do notation: do_;
> * Pattern guards: when p <-- e -> ..
This reminds me: MetaOCaml incorporates the let! notation suggested by
Nicolas Pouillard and implemented by Alain Frisch. The following is
the example of using the notation, excerpted from the file
metalib/test/pythagorian_triples.ml
in the BER MetaOCaml distribution/source.
(* The example uses left recursion and truly infinite streams! *)
(* Don't try this in Prolog or in Haskell's MonadPlus. *)
let rec numb () = (* infinite stream of integers *)
yield (mplus (let! n = numb in ret (n+1)) (* left recursion! *)
(ret 0)) ()
;;
let pyth : (int * int * int) NonDet.stream =
let! i = numb in
let! () = guard (i>0) in
let! j = numb in
let! () = guard (j>0) in
let! k = numb in
let! () = guard (k>0) in
(* Just to illustrate the `let' form within let! *)
let test x = x*x = j*j + k*k in
let! () = guard (test i) in
ret (i,j,k)
;;
let [(5, 4, 3); (5, 3, 4); (10, 8, 6); (10, 6, 8); (13, 12, 5); (13, 5, 12);
(15, 12, 9); (15, 9, 12); (17, 15, 8); (17, 8, 15)]
=
run 10 pyth;;
(The file also implements the non-determinism monad that is
illustrated in the example.)
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [Caml-list] [ANN] ppx_monadic.1.0.2, ppx for monadic do, pattern
2015-01-14 8:40 ` [Caml-list] [ANN] ppx_monadic.1.0.2, ppx for monadic do, pattern oleg
@ 2015-01-18 14:47 ` Jun Furuse
2015-01-19 7:33 ` [Caml-list] [ANN] ppx_monadic.1.0.2, ppx for monadic do, oleg
2015-01-19 8:56 ` [Caml-list] [ANN] ppx_monadic.1.0.2, ppx for monadic do, pattern Alain Frisch
0 siblings, 2 replies; 11+ messages in thread
From: Jun Furuse @ 2015-01-18 14:47 UTC (permalink / raw)
To: oleg, caml-list
Thanks,
let! is not valid in the vanilla syntax therefore I guess you have
patched the compiler.
Current OCaml syntax has shortage of pattern binding expression and
only usable is let%xxx p = e in which is a bit pain for ppx writers.
The pattern part of p <-- e is actually an expression and you
cannot simply write real patterns like (x, y) as z. You still can
write it using an extension like [%p? (x,y) as z] but it is lousy...
Jun
On Wed, Jan 14, 2015 at 4:40 PM, <oleg@okmij.org> wrote:
>
> Jun Furuse wrote:
>> * Monadic do notation: do_;
>> * Pattern guards: when p <-- e -> ..
>
> This reminds me: MetaOCaml incorporates the let! notation suggested by
> Nicolas Pouillard and implemented by Alain Frisch. The following is
> the example of using the notation, excerpted from the file
> metalib/test/pythagorian_triples.ml
> in the BER MetaOCaml distribution/source.
>
> (* The example uses left recursion and truly infinite streams! *)
> (* Don't try this in Prolog or in Haskell's MonadPlus. *)
>
> let rec numb () = (* infinite stream of integers *)
> yield (mplus (let! n = numb in ret (n+1)) (* left recursion! *)
> (ret 0)) ()
> ;;
>
> let pyth : (int * int * int) NonDet.stream =
> let! i = numb in
> let! () = guard (i>0) in
> let! j = numb in
> let! () = guard (j>0) in
> let! k = numb in
> let! () = guard (k>0) in
> (* Just to illustrate the `let' form within let! *)
> let test x = x*x = j*j + k*k in
> let! () = guard (test i) in
> ret (i,j,k)
> ;;
>
> let [(5, 4, 3); (5, 3, 4); (10, 8, 6); (10, 6, 8); (13, 12, 5); (13, 5, 12);
> (15, 12, 9); (15, 9, 12); (17, 15, 8); (17, 8, 15)]
> =
> run 10 pyth;;
>
>
> (The file also implements the non-determinism monad that is
> illustrated in the example.)
>
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [Caml-list] [ANN] ppx_monadic.1.0.2, ppx for monadic do,
2015-01-18 14:47 ` Jun Furuse
@ 2015-01-19 7:33 ` oleg
2015-01-19 8:34 ` Alain Frisch
2015-01-19 8:56 ` [Caml-list] [ANN] ppx_monadic.1.0.2, ppx for monadic do, pattern Alain Frisch
1 sibling, 1 reply; 11+ messages in thread
From: oleg @ 2015-01-19 7:33 UTC (permalink / raw)
To: jun.furuse, caml-list
> Current OCaml syntax has shortage of pattern binding expression and
> only usable is let%xxx p = e in which is a bit pain for ppx writers.
Indeed. One may wish that
let rec p = e1 in e2
were treated as if it were
let[@ocaml.let "rec"] p = e1 in e2
and likewise let module. Come to think of it, 'rec! or 'module' are
annotations on let. Then we can generalize so that
let something p = e1 in e2
(where something is any reserved word or an operator -- something that
cannot be mistaken for a regular identifier) is parsed as if it were
let[@ocaml.let "something"] p = e1 in e2
The type-checker will complain if it finds the ocaml.let attribute it
does not understand. (Therefore, Typedtree does not have to be changed
-- although one may wish for a specifically letrec node). Thus we
can define let !, let >>=, let LWP, let struct, let when, let if and all other
potentially useful binding forms.
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [Caml-list] [ANN] ppx_monadic.1.0.2, ppx for monadic do,
2015-01-19 7:33 ` [Caml-list] [ANN] ppx_monadic.1.0.2, ppx for monadic do, oleg
@ 2015-01-19 8:34 ` Alain Frisch
2015-01-19 9:06 ` Gabriel Scherer
0 siblings, 1 reply; 11+ messages in thread
From: Alain Frisch @ 2015-01-19 8:34 UTC (permalink / raw)
To: oleg, jun.furuse, caml-list
On 01/19/2015 08:33 AM, oleg@okmij.org wrote:
>> Current OCaml syntax has shortage of pattern binding expression and
>> only usable is let%xxx p = e in which is a bit pain for ppx writers.
>
> Indeed. One may wish that
>
> let rec p = e1 in e2
>
> were treated as if it were
> let[@ocaml.let "rec"] p = e1 in e2
>
> and likewise let module.
Please, no! Attributes are intended to add meta-data for external tools
(ppx, tools parsing .cmt files, etc), perhaps also to tweak the behavior
of the compiler (trigger/control warnings, etc), certainly not to encode
core language features (otherwise, let's use s-expressions instead of
Parsetree). Facilitating language experiments is also a good use for
attributes, but not as a long-term solution for the official compiler.
> Come to think of it, 'rec! or 'module' are
> annotations on let.
"let module" has a different shape (module
identifiers/types/expressions) than "let". And it doesn't seem
realistic to merge, say, core types and module types, or core
expressions and module expressions.
Alain
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [Caml-list] [ANN] ppx_monadic.1.0.2, ppx for monadic do, pattern
2015-01-18 14:47 ` Jun Furuse
2015-01-19 7:33 ` [Caml-list] [ANN] ppx_monadic.1.0.2, ppx for monadic do, oleg
@ 2015-01-19 8:56 ` Alain Frisch
2015-01-19 21:52 ` Drup
1 sibling, 1 reply; 11+ messages in thread
From: Alain Frisch @ 2015-01-19 8:56 UTC (permalink / raw)
To: Jun Furuse, oleg, caml-list
On 01/18/2015 03:47 PM, Jun Furuse wrote:
> Thanks,
>
> let! is not valid in the vanilla syntax therefore I guess you have
> patched the compiler.
>
> Current OCaml syntax has shortage of pattern binding expression and
> only usable is let%xxx p = e in which is a bit pain for ppx writers.
If it's a pain, it's rather for users of ppx, no?
Providing "alternative" forms of existing constructs (i.e. forms that
look syntactically similar to these constructs) to be interpreted before
they reach the type-checker, is indeed what extension nodes [%foo ...]
were designed for. For expression constructs starting with a keyword,
the short form KEYWORD%foo ... makes the use of extension nodes very
cheap syntactically.
I can appreciate that authors of tools that requires special syntactic
support would love to have their new forms look completely native to
users, but the counter-argument can be made that keeping an explicit
syntax (through the '%' character) for features that are not part of the
official language is a good property. (Camlp4/campl5 are still
available for people who want to play with the concrete syntax.)
With the short form, an alternative binding construct can be as short as:
let%L p = e in ....
I'm not suggesting to reserve one-letter extension identifiers for
specific projects, but each tool could let the user choose explicitly
which letter to use:
[%%Project1 alt_id = "L"]
[%%Project2 alt_id = "A"]
...
...
let%L p1 = e1 in ....
let%A p2 = e2 in ....
Alain
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [Caml-list] [ANN] ppx_monadic.1.0.2, ppx for monadic do,
2015-01-19 8:34 ` Alain Frisch
@ 2015-01-19 9:06 ` Gabriel Scherer
2015-01-19 9:40 ` Alain Frisch
0 siblings, 1 reply; 11+ messages in thread
From: Gabriel Scherer @ 2015-01-19 9:06 UTC (permalink / raw)
To: Alain Frisch; +Cc: oleg, Jun Furuse, caml users
[-- Attachment #1: Type: text/plain, Size: 1612 bytes --]
(On the other hand, the remark that the existing uses of keyword-bang in
the language, namely (method!) and (open!), could now be represented as
annotations is fairly reasonable.)
On Mon, Jan 19, 2015 at 9:34 AM, Alain Frisch <alain@frisch.fr> wrote:
> On 01/19/2015 08:33 AM, oleg@okmij.org wrote:
>
>> Current OCaml syntax has shortage of pattern binding expression and
>>> only usable is let%xxx p = e in which is a bit pain for ppx writers.
>>>
>>
>> Indeed. One may wish that
>>
>> let rec p = e1 in e2
>>
>> were treated as if it were
>> let[@ocaml.let "rec"] p = e1 in e2
>>
>> and likewise let module.
>>
>
> Please, no! Attributes are intended to add meta-data for external tools
> (ppx, tools parsing .cmt files, etc), perhaps also to tweak the behavior of
> the compiler (trigger/control warnings, etc), certainly not to encode core
> language features (otherwise, let's use s-expressions instead of
> Parsetree). Facilitating language experiments is also a good use for
> attributes, but not as a long-term solution for the official compiler.
>
> Come to think of it, 'rec! or 'module' are
>> annotations on let.
>>
>
> "let module" has a different shape (module identifiers/types/expressions)
> than "let". And it doesn't seem realistic to merge, say, core types and
> module types, or core expressions and module expressions.
>
>
> Alain
>
>
> --
> Caml-list mailing list. Subscription management and archives:
> https://sympa.inria.fr/sympa/arc/caml-list
> Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
> Bug reports: http://caml.inria.fr/bin/caml-bugs
>
[-- Attachment #2: Type: text/html, Size: 2816 bytes --]
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [Caml-list] [ANN] ppx_monadic.1.0.2, ppx for monadic do,
2015-01-19 9:06 ` Gabriel Scherer
@ 2015-01-19 9:40 ` Alain Frisch
2015-01-19 16:10 ` Jeremy Yallop
0 siblings, 1 reply; 11+ messages in thread
From: Alain Frisch @ 2015-01-19 9:40 UTC (permalink / raw)
To: Gabriel Scherer; +Cc: oleg, Jun Furuse, caml users
On 01/19/2015 10:06 AM, Gabriel Scherer wrote:
> (On the other hand, the remark that the existing uses of keyword-bang in
> the language, namely (method!) and (open!), could now be represented as
> annotations is fairly reasonable.)
Indeed, these ! markers only affect warnings, and don't change the
static or dynamic semantics otherwise, so I wouldn't be shocked if they
were represented internally with attributes. Unless perhaps if we
consider that forcing users to mark method overrides, as in many other
class-based OO languages, should become part of the language definition
(i.e. turned into a strong error at some point).
-- Alain
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [Caml-list] [ANN] ppx_monadic.1.0.2, ppx for monadic do,
2015-01-19 9:40 ` Alain Frisch
@ 2015-01-19 16:10 ` Jeremy Yallop
0 siblings, 0 replies; 11+ messages in thread
From: Jeremy Yallop @ 2015-01-19 16:10 UTC (permalink / raw)
To: Alain Frisch; +Cc: Gabriel Scherer, Oleg Kiselyov, Jun Furuse, caml users
On 19 January 2015 at 09:40, Alain Frisch <alain.frisch@lexifi.com> wrote:
> On 01/19/2015 10:06 AM, Gabriel Scherer wrote:
>>
>> (On the other hand, the remark that the existing uses of keyword-bang in
>> the language, namely (method!) and (open!), could now be represented as
>> annotations is fairly reasonable.)
>
> Indeed, these ! markers only affect warnings, and don't change the static or
> dynamic semantics otherwise, so I wouldn't be shocked if they were
> represented internally with attributes. Unless perhaps if we consider that
> forcing users to mark method overrides, as in many other class-based OO
> languages, should become part of the language definition (i.e. turned into a
> strong error at some point).
A nit: for methods, at least, the ! already produces an error in the
case where the method is not previously defined:
# object method! m = 3 end;;
Characters 7-20:
object method! m = 3 end;;
^^^^^^^^^^^^^
Error: The method `m' has no previous definition
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [Caml-list] [ANN] ppx_monadic.1.0.2, ppx for monadic do, pattern
2015-01-19 8:56 ` [Caml-list] [ANN] ppx_monadic.1.0.2, ppx for monadic do, pattern Alain Frisch
@ 2015-01-19 21:52 ` Drup
2015-01-20 3:53 ` Jun Furuse
0 siblings, 1 reply; 11+ messages in thread
From: Drup @ 2015-01-19 21:52 UTC (permalink / raw)
To: Alain Frisch, Jun Furuse, oleg, caml-list
> I can appreciate that authors of tools that requires special syntactic
> support would love to have their new forms look completely native to
> users, but the counter-argument can be made that keeping an explicit
> syntax (through the '%' character) for features that are not part of
> the official language is a good property. (Camlp4/campl5 are still
> available for people who want to play with the concrete syntax.)
I personally like the explicitness of the syntax a lot. The only issue
in OCaml currently is that, given the need for retro compatibility, it
goes sometimes against the terseness. For example the impossibility to
do " x@foo" instead of "x[@foo]". That's unavoidable, though.
This is, by the way, a point I dislike a lot with ppx_monadic. It abuses
the native syntax in completely alien ways and without annotations.
I like ppx_monad's syntax quite better due to the fact that it's always
explicitly a ppx (thanks to %monad) and do not overload the "do_"
identifier.
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [Caml-list] [ANN] ppx_monadic.1.0.2, ppx for monadic do, pattern
2015-01-19 21:52 ` Drup
@ 2015-01-20 3:53 ` Jun Furuse
0 siblings, 0 replies; 11+ messages in thread
From: Jun Furuse @ 2015-01-20 3:53 UTC (permalink / raw)
To: Drup; +Cc: caml-list, Alain Frisch, oleg
[-- Attachment #1: Type: text/plain, Size: 2995 bytes --]
I know what you wrote, since I always asked myself "isn't it too bizarre?"
when I was writing ppx_monadic. Here are some justifications I made:
The first intension of ppx_monadic is to port my code with pa_monad without
pain. Unfortunately ppx_monad required too many small fixes due to the
following reasons:
· "perform" needed to be replaced by "begin%monad .. end" or "[%monad
.. ]" which requires closing, which is really pain. Ppx_monad provides
"fun%monad", "match%monad" without closing but they were not always helpful
for me.
· The pattern "p" of "p <- e" is limited to a variable, since it
overrides the syntax of object member mutation. In addition, I use lots of
monadic binds inside my class methods. Therefore this override is not
acceptable for me.
Secondary, I see the monadic syntax sugar is to reduce the number of key
types, and I accepted some alien syntax weirdness for the purpose. If the
number of key types would not matter, I would be happy with the good old
bind (>>=) chains and would not use "do" at all. People think bind chains
are hard to read but my experience with Jane Street Async tells me it it
not quite. Ppx_monad does not really gain in this point unfortunately: I
was often forced to write "let%monad (x,y) = e in" just for "(x,y) <-- e;".
I write Haskell do-notations daily and wanted to have something comparable
in OCaml.
Anyway, the current OCaml syntax is limited to have do-notation which makes
everyone happy. If there would be a way in OCaml to write "foo e" for some
keyword "foo" which is like "begin" but does not require "end", I would be
pretty happy to change the weird "Option.do_; e" to "foo%Option e". Before
implementing "do_; e", I tried a bit of "[%do] e" but it did not work well
since "[%do] p <-- e" is parsed as "([%do] p) <-- e", not "[%do] (p <-- e)".
Best,
Jun
On 20 Jan, 2015 5:53 am, "Drup" <drupyog+caml@zoho.com> wrote:
>
> I can appreciate that authors of tools that requires special syntactic
>> support would love to have their new forms look completely native to users,
>> but the counter-argument can be made that keeping an explicit syntax
>> (through the '%' character) for features that are not part of the official
>> language is a good property. (Camlp4/campl5 are still available for people
>> who want to play with the concrete syntax.)
>>
>
> I personally like the explicitness of the syntax a lot. The only issue in
> OCaml currently is that, given the need for retro compatibility, it goes
> sometimes against the terseness. For example the impossibility to do " x@foo"
> instead of "x[@foo]". That's unavoidable, though.
>
> This is, by the way, a point I dislike a lot with ppx_monadic. It abuses
> the native syntax in completely alien ways and without annotations.
>
> I like ppx_monad's syntax quite better due to the fact that it's always
> explicitly a ppx (thanks to %monad) and do not overload the "do_"
> identifier.
>
>
[-- Attachment #2: Type: text/html, Size: 3808 bytes --]
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2015-01-20 3:53 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-01-13 14:23 [Caml-list] [ANN] ppx_monadic.1.0.2, ppx for monadic do, pattern guards and monadic comprehension Jun Furuse
2015-01-14 8:40 ` [Caml-list] [ANN] ppx_monadic.1.0.2, ppx for monadic do, pattern oleg
2015-01-18 14:47 ` Jun Furuse
2015-01-19 7:33 ` [Caml-list] [ANN] ppx_monadic.1.0.2, ppx for monadic do, oleg
2015-01-19 8:34 ` Alain Frisch
2015-01-19 9:06 ` Gabriel Scherer
2015-01-19 9:40 ` Alain Frisch
2015-01-19 16:10 ` Jeremy Yallop
2015-01-19 8:56 ` [Caml-list] [ANN] ppx_monadic.1.0.2, ppx for monadic do, pattern Alain Frisch
2015-01-19 21:52 ` Drup
2015-01-20 3:53 ` Jun Furuse
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox