leostera / caramel

:candy: a functional language for building type-safe, scalable, and maintainable applications
https://caramel.run
Apache License 2.0
1.06k stars 25 forks source link

Are parameterized modules/functors available? #98

Open AeroNotix opened 3 years ago

AeroNotix commented 3 years ago

Hi,

I'm trying to make use of parameterized modules / functors and maybe I'm missing something.

module type SomeSig = sig
  val some_function : unit -> unit
end

module type SomeFunctor =
  functor (M : SomeSig) ->
  sig
    val some_function : unit -> unit
  end

module SomeModule : SomeFunctor =
  functor (M : SomeSig) ->
  struct
    let some_function () =
      Io.format "In parameterized module\n" [];
      M.some_function ();
  end

module SomeImpl =
  struct
    let some_function () =
      Io.format "In module implementing SomeSig\n" []
  end

module PMod = SomeModule(SomeImpl)

let main () =
  PMod.some_function ()

When I compile this file with caramel compile *.ml the main function gets compiled into such and there are no compilation errors:

-spec main() -> ok.
main() -> pmod:some_function().

Yet there is no pmod.erl file created, which is how I sort of expected the parameterized modules to be implemented.

AeroNotix commented 3 years ago

@ostera @michallepicki sie ma!

Is this something that should be possible? Is this something that needs adding?

AeroNotix commented 3 years ago

@ostera where can I look to start learning how to implement this?

AeroNotix commented 3 years ago

@xandkar any thoughts on my thinking here?

I was thinking that functors could compile down into "just" another Erlang module with a specific module reference at each call site into the parametrized module being replaced in each instance of a functor.

Can functors be dynamically created at runtime in OCaml? I can't find any documentation which allows for that and cannot seem to make OCaml do that.