caml-list - the Caml user's mailing list
 help / color / mirror / Atom feed
* [Caml-list] concerning using of `deriving' syntactic plugin
@ 2012-03-07 11:49 Matej Košík
  2012-03-07 12:31 ` Gabriel Scherer
  2012-03-07 12:34 ` Yaron Minsky
  0 siblings, 2 replies; 10+ messages in thread
From: Matej Košík @ 2012-03-07 11:49 UTC (permalink / raw)
  To: Caml List

Hi,

I would like to print out the response of a modified Ocaml's typechecker
to various inputs.

One way to do it would be to write a pretty-printer by hand.

Before I do that, I would like to apply "deriving" machinery:
http://code.google.com/p/deriving/wiki/Introduction
to this (chore) job.

In some cases I do not know what to do.

E.g., file "types/types.mli" contains the following definition:

  and value_kind =
      Val_reg
    | Val_prim of Primitive.description
    | Val_ivar of mutable_flag * string
    | Val_self of
        (Ident.t * type_expr) Meths.t ref *
        (Ident.t * mutable_flag * virtual_flag * type_expr) Vars.t ref *
      string * type_expr
    | Val_anc of (string * Ident.t) list * string
    | Val_unbound

If I add

  deriving (Show)

at the end of the above definition, I get an error:

  Error: Unbound module Meths.Show_t

That is expected but I am not sure what to do. That is, I am not sure
what is the official way to "deriving"-sify the "Meth" module which
defined in the following way:

  module Meths = Map.Make(OrderedString)

without the need to modify files "map.ml{i,}".

Is something like that possible?

Thank you very much in advance for any help.

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [Caml-list] concerning using of `deriving' syntactic plugin
  2012-03-07 11:49 [Caml-list] concerning using of `deriving' syntactic plugin Matej Košík
@ 2012-03-07 12:31 ` Gabriel Scherer
  2012-03-07 16:44   ` Matej Košík
  2012-03-07 12:34 ` Yaron Minsky
  1 sibling, 1 reply; 10+ messages in thread
From: Gabriel Scherer @ 2012-03-07 12:31 UTC (permalink / raw)
  To: Matej Košík; +Cc: Caml List

You can inject the definition you want in the following way:

  module Meths = struct
    include Meths
    module Show_t = ...
  end

  type value_kind = ...
  deriving (Show)

This works because deriving, being a Camlp4 extension, does not refer
to "the" module Meths, but any module Meths that is in scope at the
place of expansion. This could be seen as a defect of hygiene (indeed
that makes camlp4 macro non-hygienic according to the Scheme notion of
hygiene) but is also a feature, rather than a bug, of the syntactic
macro system; because as a macro-writer you can give flexibility to
the user by specifying the free variables you rely on.

On Wed, Mar 7, 2012 at 12:49 PM, Matej Košík
<5764c029b688c1c0d24a2e97cd764f@gmail.com> wrote:
> Hi,
>
> I would like to print out the response of a modified Ocaml's typechecker
> to various inputs.
>
> One way to do it would be to write a pretty-printer by hand.
>
> Before I do that, I would like to apply "deriving" machinery:
> http://code.google.com/p/deriving/wiki/Introduction
> to this (chore) job.
>
> In some cases I do not know what to do.
>
> E.g., file "types/types.mli" contains the following definition:
>
>  and value_kind =
>      Val_reg
>    | Val_prim of Primitive.description
>    | Val_ivar of mutable_flag * string
>    | Val_self of
>        (Ident.t * type_expr) Meths.t ref *
>        (Ident.t * mutable_flag * virtual_flag * type_expr) Vars.t ref *
>      string * type_expr
>    | Val_anc of (string * Ident.t) list * string
>    | Val_unbound
>
> If I add
>
>  deriving (Show)
>
> at the end of the above definition, I get an error:
>
>  Error: Unbound module Meths.Show_t
>
> That is expected but I am not sure what to do. That is, I am not sure
> what is the official way to "deriving"-sify the "Meth" module which
> defined in the following way:
>
>  module Meths = Map.Make(OrderedString)
>
> without the need to modify files "map.ml{i,}".
>
> Is something like that possible?
>
> Thank you very much in advance for any help.
>
> --
> Caml-list mailing list.  Subscription management and archives:
> https://sympa-roc.inria.fr/wws/info/caml-list
> Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
> Bug reports: http://caml.inria.fr/bin/caml-bugs
>


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [Caml-list] concerning using of `deriving' syntactic plugin
  2012-03-07 11:49 [Caml-list] concerning using of `deriving' syntactic plugin Matej Košík
  2012-03-07 12:31 ` Gabriel Scherer
@ 2012-03-07 12:34 ` Yaron Minsky
  2012-03-07 16:44   ` Matej Košík
  1 sibling, 1 reply; 10+ messages in thread
From: Yaron Minsky @ 2012-03-07 12:34 UTC (permalink / raw)
  To: Matej Košík; +Cc: Caml List

[-- Attachment #1: Type: text/plain, Size: 2288 bytes --]

Are you familiar with type-conv and the family of syntax-extensions that go
along with it?  You can do thinks like:

type t = { foo: int; bar: string }
with sexp, compare, bin_io


and automatically get sexp-conversion functions, a comparison function, and
binary protocol converters.  And type-conv has been used to build other
type-directed functions by other people outside of Jane Street.

The latest version is available on bitbucket, and we'll have a new blessed
release in a few days.

https://bitbucket.org/yminsky/ocaml-core/


Note that this is done purely syntactically, and yet gets you there.

y

On Wed, Mar 7, 2012 at 6:49 AM, Matej Košík <
5764c029b688c1c0d24a2e97cd764f@gmail.com> wrote:

> Hi,
>
> I would like to print out the response of a modified Ocaml's typechecker
> to various inputs.
>
> One way to do it would be to write a pretty-printer by hand.
>
> Before I do that, I would like to apply "deriving" machinery:
> http://code.google.com/p/deriving/wiki/Introduction
> to this (chore) job.
>
> In some cases I do not know what to do.
>
> E.g., file "types/types.mli" contains the following definition:
>
>  and value_kind =
>      Val_reg
>    | Val_prim of Primitive.description
>    | Val_ivar of mutable_flag * string
>    | Val_self of
>        (Ident.t * type_expr) Meths.t ref *
>        (Ident.t * mutable_flag * virtual_flag * type_expr) Vars.t ref *
>      string * type_expr
>    | Val_anc of (string * Ident.t) list * string
>    | Val_unbound
>
> If I add
>
>  deriving (Show)
>
> at the end of the above definition, I get an error:
>
>  Error: Unbound module Meths.Show_t
>
> That is expected but I am not sure what to do. That is, I am not sure
> what is the official way to "deriving"-sify the "Meth" module which
> defined in the following way:
>
>  module Meths = Map.Make(OrderedString)
>
> without the need to modify files "map.ml{i,}".
>
> Is something like that possible?
>
> Thank you very much in advance for any help.
>
> --
> Caml-list mailing list.  Subscription management and archives:
> https://sympa-roc.inria.fr/wws/info/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: 3622 bytes --]

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [Caml-list] concerning using of `deriving' syntactic plugin
  2012-03-07 12:34 ` Yaron Minsky
@ 2012-03-07 16:44   ` Matej Košík
  2012-03-07 17:10     ` Markus Mottl
  0 siblings, 1 reply; 10+ messages in thread
From: Matej Košík @ 2012-03-07 16:44 UTC (permalink / raw)
  To: Yaron Minsky; +Cc: Caml List

On 03/07/2012 12:34 PM, Yaron Minsky wrote:
> Are you familiar with type-conv and the family of syntax-extensions that
> go along with it?  You can do thinks like:
> 
>     type t = { foo: int; bar: string }
>     with sexp, compare, bin_io
> 
> 
> and automatically get sexp-conversion functions, a comparison function,
> and binary protocol converters.  And type-conv has been used to build
> other type-directed functions by other people outside of Jane Street.
> 
> The latest version is available on bitbucket, and we'll have a new
> blessed release in a few days.
> 
>     https://bitbucket.org/yminsky/ocaml-core/
> 
> 
> Note that this is done purely syntactically, and yet gets you there.

I have looked at bin_prot and sexplib previously.
They are very nice and useful.

I have found one (I guess unnecessary) disadvantage over `deriving'.
If you process your *.ml file with sexplib/bin_prot preprocessor, you
have to append "with ..." suffix to every type definition, otherwise you
will get a an error report from the preprocessor. `Deriving' does not
force you to do that. You can annotate only those type definitions,
which for you makes sense to annotate.

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [Caml-list] concerning using of `deriving' syntactic plugin
  2012-03-07 12:31 ` Gabriel Scherer
@ 2012-03-07 16:44   ` Matej Košík
  2012-03-07 17:06     ` Jérémie Dimino
  0 siblings, 1 reply; 10+ messages in thread
From: Matej Košík @ 2012-03-07 16:44 UTC (permalink / raw)
  To: Gabriel Scherer; +Cc: Caml List

On 03/07/2012 12:31 PM, Gabriel Scherer wrote:
> You can inject the definition you want in the following way:
> 
>   module Meths = struct
>     include Meths
>     module Show_t = ...
>   end
> 
>   type value_kind = ...
>   deriving (Show)
> 
> This works because deriving, being a Camlp4 extension, does not refer
> to "the" module Meths, but any module Meths that is in scope at the
> place of expansion. This could be seen as a defect of hygiene (indeed
> that makes camlp4 macro non-hygienic according to the Scheme notion of
> hygiene) but is also a feature, rather than a bug, of the syntactic
> macro system; because as a macro-writer you can give flexibility to
> the user by specifying the free variables you rely on.

I have never used "include" construct myself but I always wanted it. Its
cool that we have it :-)

The above problem can indeed be solved, i.e. pretty-printer can be
generated in this way. The tricky part is to figure out how to define
the "Show_t" module definition, which is non-obvious.

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [Caml-list] concerning using of `deriving' syntactic plugin
  2012-03-07 16:44   ` Matej Košík
@ 2012-03-07 17:06     ` Jérémie Dimino
  0 siblings, 0 replies; 10+ messages in thread
From: Jérémie Dimino @ 2012-03-07 17:06 UTC (permalink / raw)
  To: Matej Košík; +Cc: Caml List

Le Wed, 07 Mar 2012 16:44:20 +0000,
Matej Košík <5764c029b688c1c0d24a2e97cd764f@gmail.com> a écrit :

> The above problem can indeed be solved, i.e. pretty-printer can be
> generated in this way. The tricky part is to figure out how to define
> the "Show_t" module definition, which is non-obvious.

If you can modify the definition of Meths the easiest way is:

module Meths = struct
  include Map.Make(OrderedString)
  module Show_t = Show.Show_map(OrderedString)(Show.Show_string)
end

-- 
Jérémie


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [Caml-list] concerning using of `deriving' syntactic plugin
  2012-03-07 16:44   ` Matej Košík
@ 2012-03-07 17:10     ` Markus Mottl
  2012-03-07 17:28       ` Matej Košík
  0 siblings, 1 reply; 10+ messages in thread
From: Markus Mottl @ 2012-03-07 17:10 UTC (permalink / raw)
  To: Matej Košík; +Cc: Yaron Minsky, Caml List

On Wed, Mar 7, 2012 at 11:44, Matej Košík
<5764c029b688c1c0d24a2e97cd764f@gmail.com> wrote:
> I have found one (I guess unnecessary) disadvantage over `deriving'.
> If you process your *.ml file with sexplib/bin_prot preprocessor, you
> have to append "with ..." suffix to every type definition, otherwise you
> will get a an error report from the preprocessor. `Deriving' does not
> force you to do that. You can annotate only those type definitions,
> which for you makes sense to annotate.

I'm not sure what the perceived problem is, but there should be no
need to annotate all type definitions.  It should suffice to annotate
those for which converters are needed.  This, of course, means that
any types that a type definition is referring to will also need
annotations (or hand-written conversion functions).

Regards,
Markus

-- 
Markus Mottl        http://www.ocaml.info        markus.mottl@gmail.com


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [Caml-list] concerning using of `deriving' syntactic plugin
  2012-03-07 17:10     ` Markus Mottl
@ 2012-03-07 17:28       ` Matej Košík
  2012-03-07 20:47         ` Till Varoquaux
  2012-03-08  2:49         ` Markus Mottl
  0 siblings, 2 replies; 10+ messages in thread
From: Matej Košík @ 2012-03-07 17:28 UTC (permalink / raw)
  To: Markus Mottl, Yaron Minsky; +Cc: Caml List

Hi Markus,

On 03/07/2012 05:10 PM, Markus Mottl wrote:
> On Wed, Mar 7, 2012 at 11:44, Matej Košík
> <5764c029b688c1c0d24a2e97cd764f@gmail.com> wrote:
>> I have found one (I guess unnecessary) disadvantage over `deriving'.
>> If you process your *.ml file with sexplib/bin_prot preprocessor, you
>> have to append "with ..." suffix to every type definition, otherwise you
>> will get a an error report from the preprocessor. `Deriving' does not
>> force you to do that. You can annotate only those type definitions,
>> which for you makes sense to annotate.
> 
> I'm not sure what the perceived problem is, but there should be no
> need to annotate all type definitions.  It should suffice to annotate
> those for which converters are needed.

The following artificial example:

  open Sexplib.Conv
  type foo = int * int with sexp
  type bar = float * float with sexp

is compilable

  (e.g.:
   ocamlc -o main -pp "camlp4of -I
/home/mkosik/lib/godi/lib/ocaml/std-lib/../pkg-lib/sexplib -I
/home/mkosik/lib/godi/lib/ocaml/std-lib/../pkg-lib/type-conv
pa_type_conv.cma pa_sexp_conv.cma" -I
/home/mkosik/lib/godi/lib/ocaml/std-lib/../pkg-lib/sexplib -I
/home/mkosik/lib/godi/lib/ocaml/std-lib/../pkg-lib/type-conv unix.cma
nums.cma bigarray.cma sexplib.cma main.ml
  )

If you remove any of the "with sexp" clauses, you will get a
preprocessor error:

  File "main.ml", line 4, characters 18-23:
  Parse error: "with" expected after [type_declaration] (in [str_item])
  File "main.ml", line 1, characters 0-1:

This is at least what I am experiencing.

> This, of course, means that
> any types that a type definition is referring to will also need
> annotations (or hand-written conversion functions).

Regards,

Matej Kosik

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [Caml-list] concerning using of `deriving' syntactic plugin
  2012-03-07 17:28       ` Matej Košík
@ 2012-03-07 20:47         ` Till Varoquaux
  2012-03-08  2:49         ` Markus Mottl
  1 sibling, 0 replies; 10+ messages in thread
From: Till Varoquaux @ 2012-03-07 20:47 UTC (permalink / raw)
  To: Matej Košík; +Cc: Markus Mottl, Yaron Minsky, Caml List

You are the wrong version of camlp4 (the different campl4 binaries
load different libraries, syntaxes etc...). If you switch camlp4orf to
camlp4o your code should compile fine. Also note that I would
recommend using the excellent ocamlfind tool:

ocamlfind c -linkpkg -package sexplib,sexplib.syntax -syntax camlp4o main.ml

Till

On Wed, Mar 7, 2012 at 12:28 PM, Matej Košík
<5764c029b688c1c0d24a2e97cd764f@gmail.com> wrote:
> Hi Markus,
>
> On 03/07/2012 05:10 PM, Markus Mottl wrote:
>> On Wed, Mar 7, 2012 at 11:44, Matej Košík
>> <5764c029b688c1c0d24a2e97cd764f@gmail.com> wrote:
>>> I have found one (I guess unnecessary) disadvantage over `deriving'.
>>> If you process your *.ml file with sexplib/bin_prot preprocessor, you
>>> have to append "with ..." suffix to every type definition, otherwise you
>>> will get a an error report from the preprocessor. `Deriving' does not
>>> force you to do that. You can annotate only those type definitions,
>>> which for you makes sense to annotate.
>>
>> I'm not sure what the perceived problem is, but there should be no
>> need to annotate all type definitions.  It should suffice to annotate
>> those for which converters are needed.
>
> The following artificial example:
>
>  open Sexplib.Conv
>  type foo = int * int with sexp
>  type bar = float * float with sexp
>
> is compilable
>
>  (e.g.:
>   ocamlc -o main -pp "camlp4of -I
> /home/mkosik/lib/godi/lib/ocaml/std-lib/../pkg-lib/sexplib -I
> /home/mkosik/lib/godi/lib/ocaml/std-lib/../pkg-lib/type-conv
> pa_type_conv.cma pa_sexp_conv.cma" -I
> /home/mkosik/lib/godi/lib/ocaml/std-lib/../pkg-lib/sexplib -I
> /home/mkosik/lib/godi/lib/ocaml/std-lib/../pkg-lib/type-conv unix.cma
> nums.cma bigarray.cma sexplib.cma main.ml
>  )
>
> If you remove any of the "with sexp" clauses, you will get a
> preprocessor error:
>
>  File "main.ml", line 4, characters 18-23:
>  Parse error: "with" expected after [type_declaration] (in [str_item])
>  File "main.ml", line 1, characters 0-1:
>
> This is at least what I am experiencing.
>
>> This, of course, means that
>> any types that a type definition is referring to will also need
>> annotations (or hand-written conversion functions).
>
> Regards,
>
> Matej Kosik
>
> --
> Caml-list mailing list.  Subscription management and archives:
> https://sympa-roc.inria.fr/wws/info/caml-list
> Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
> Bug reports: http://caml.inria.fr/bin/caml-bugs
>


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [Caml-list] concerning using of `deriving' syntactic plugin
  2012-03-07 17:28       ` Matej Košík
  2012-03-07 20:47         ` Till Varoquaux
@ 2012-03-08  2:49         ` Markus Mottl
  1 sibling, 0 replies; 10+ messages in thread
From: Markus Mottl @ 2012-03-08  2:49 UTC (permalink / raw)
  To: Matej Košík; +Cc: Yaron Minsky, Caml List

On Wed, Mar 7, 2012 at 12:28, Matej Košík
<5764c029b688c1c0d24a2e97cd764f@gmail.com> wrote:
> If you remove any of the "with sexp" clauses, you will get a
> preprocessor error:
>
>  File "main.ml", line 4, characters 18-23:
>  Parse error: "with" expected after [type_declaration] (in [str_item])
>  File "main.ml", line 1, characters 0-1:

Till's fix suggestion should work, you'll have to use camlp4o as preprocessor.

Btw., you also may want to "open Sexplib.Std" instead of
"Sexplib.Conv", which is the "standard" way.

Regards,
Markus

-- 
Markus Mottl        http://www.ocaml.info        markus.mottl@gmail.com


^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2012-03-08  2:49 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-03-07 11:49 [Caml-list] concerning using of `deriving' syntactic plugin Matej Košík
2012-03-07 12:31 ` Gabriel Scherer
2012-03-07 16:44   ` Matej Košík
2012-03-07 17:06     ` Jérémie Dimino
2012-03-07 12:34 ` Yaron Minsky
2012-03-07 16:44   ` Matej Košík
2012-03-07 17:10     ` Markus Mottl
2012-03-07 17:28       ` Matej Košík
2012-03-07 20:47         ` Till Varoquaux
2012-03-08  2:49         ` Markus Mottl

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).