OCaml 仅打开模块中的某些 values/types

OCaml open only certain values/types from module

OCaml 是否具有

的等效项(可能涉及 camlp4 指令)

from module import value1, value2 在 Python 或

use Module qw[value1 value2]; 在 Perl 中 ?

我希望能够写出类似

的东西

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

而不是

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

恐怕没有像您描述的那样部分模块打开。

  • 如果你的模块没有命名冲突,那么使用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 *)
    

最接近的是:

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

正是因为这个原因,open 语句在大多数情况下都是邪恶的(尤其是在顶层)。

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