OCaml仅从模块中打开某些值/类型

时间:2016-08-13 22:28:36

标签: ocaml

OCaml是否具有等效的(可能涉及camlp4指令)

Python中的

from module import value1, value2

Perl中的

use Module qw[value1 value2];

我希望能够写出类似

的内容

open Ctypes (@->), string;;open Ctypes ((@->), string);;

而不是

let (@->) = Ctypes.(@->);;
let string = Ctypes.string;;

3 个答案:

答案 0 :(得分:3)

最接近的是:

let value1, value2 = Module.(value1, value2) 

由于这个原因,开放陈述大部分时间都是邪恶的(特别是在最高层)。

答案 1 :(得分:1)

我担心没有像你描述的那样打开部分模块。

  • 如果您的模块没有命名冲突,那么只需使用open Ctypes

  • 就足够了
  • 否则,您可以通过

    缩短模块名称
    module CT = Ctypes
    
    (* and then just call CT.some_function instead of Ctypes.some_function *)
    
  • 您的解决方案非常简洁,但请注意名称string可能会覆盖OCaml的基本类型string

    let (@->) = Ctypes.(@->);;
    let string = Ctypes.string;;  (* override the type string *)
    

答案 2 :(得分:0)

cppo和C99以后的C预处理器都具有处理可变参数宏的功能。

这意味着您可以将mookid的元组分配隐藏在宏后面,以避免重复自己。

#define USE_FROM(MODULE, ...) \
  let ( __VA_ARGS__ ) = (MODULE . ( __VA_ARGS__ )) ;;

USE_FROM(Printf, printf, sprintf, eprintf);;

let main = begin
  Printf.printf "%s\n" "a"
end

还可以通过使用以括号括起来的逗号分隔列表的形式提供参数来使用非可变宏。

#define USE_FROM(MODULE, STUFF) \
  let ( STUFF ) = (MODULE . ( STUFF )) ;;

USE_FROM(Printf, (printf, sprintf, eprintf));;

let main = begin
  Printf.printf "%s\n" "a"
end