首页 文章

OCaml插件的任意类型的接口

提问于
浏览
1

我正在使用ocaml_plugin编写计算器,它能够在运行时评估OCaml表达式 .

这是我的插件界面 .

open Ocaml_plugin.Std

module type S = sig
  val f : unit -> float
end

let univ_constr : (module S) Ocaml_dynloader.Univ_constr.t =
  Ocaml_dynloader.Univ_constr.create ()

我可以加载带有签名 unit -> float 的函数,例如,

let f () = 3.14159
let f () = 1.5 *. 1.5 *. 3.

并在主程序中调用f()来计算函数体中的表达式 . 但是,它仅支持float类型 .

如果我希望它支持int,我该怎么办? Time.t?或Pervasive中的任意OCaml类型?

let f () = List.length [1;2;3]  (* int *)
let f () = Time.now ()          (* Time.t *)
let f () = "hello world!!!"     (* string *)

为了在运行时进行评估,ocaml_plugin似乎是唯一的出路 . 但是,为了让加载器/编译器知道动态加载什么,我必须编写一个接口 . 我应该如何更改接口文件以便它支持其他类型?

1 回答

  • 2

    GADT(广义代数数据类型)进行救援 .

    尽管GADT存在很长时间,但它在OCaml中是一个相对较新的主题 . 它在安全地编写OCaml中的通用库方面有很大帮助 .

    module Value = struct
       type 'a t
    
       module Packed = struct
         type 'a unpacked = 'a t
         type t = T : 'a unpacked -> t
       end
    
    end
    

    Value.Packed.t是我们想要的打包数据类型 . 理论上可以打包任何数据类型 'a .

相关问题