OCaml 用 Camlp4 重载数字文字
OCaml overload numeric literal with Camlp4
我正在用一些组合实用程序编写一个小脚本。当我需要不同类型的 0
或 1
之类的数字文字时,我使用 _0
和 _1
,但这个解决方案并不理想。是否可以使用 Camlp4 在给定上下文中重新解释数字文字或添加具有专用后缀的新型数字文字?
open Num
let zero = num_of_int 0
let one = num_of_int 1
let _0 = zero
let _1 = one
(* some useful infix operators *)
let ( + ) = ( +/ )
let ( - ) = ( -/ )
let ( * ) = ( */ )
let ( < ) = ( </ )
let ( > ) = ( >/ )
let ( = ) = ( =/ )
let ( / ) numer denom =
if mod_num numer denom = _0
then div_num numer denom
else invalid_arg "division is not a total function"
(* factorial, naive *)
let rec fact n =
if n < _0
then invalid_arg "negative factorial"
else if n = _0
then _1
else
n * fact (n - _1)
(* naive algorithm *)
let choose n k = (fact n / fact k) / fact (n - k)
简而言之,没有。 Camlp4 是无类型解析树的预处理器。它不能做这种类型敏感的事情。
如果您愿意(我敢打赌您不会),您可以 运行 针对 Camlp4 中的无类型解析树进行类型检查,并推断您的特殊数字的类型,然后用相应的值替换它们。理论上是可以的,但是none曾经尝试过,因为P4的解析树和OCaml完全不同。
旨在取代Campl4的PPX预处理器有一些希望,因为它处理与OCaml相同的无类型解析树,因此很容易应用OCaml类型检查器。 TyPPX (https://bitbucket.org/camlspotter/typpx) 就是这样一个框架,为类型相关的预处理提供 API。
您可能想看看 delimited overloading — 它需要用 M.(e)
包围表达式 e
来限定您的常量,其中 M
是你的模块(你可以定义别名)。
我正在用一些组合实用程序编写一个小脚本。当我需要不同类型的 0
或 1
之类的数字文字时,我使用 _0
和 _1
,但这个解决方案并不理想。是否可以使用 Camlp4 在给定上下文中重新解释数字文字或添加具有专用后缀的新型数字文字?
open Num
let zero = num_of_int 0
let one = num_of_int 1
let _0 = zero
let _1 = one
(* some useful infix operators *)
let ( + ) = ( +/ )
let ( - ) = ( -/ )
let ( * ) = ( */ )
let ( < ) = ( </ )
let ( > ) = ( >/ )
let ( = ) = ( =/ )
let ( / ) numer denom =
if mod_num numer denom = _0
then div_num numer denom
else invalid_arg "division is not a total function"
(* factorial, naive *)
let rec fact n =
if n < _0
then invalid_arg "negative factorial"
else if n = _0
then _1
else
n * fact (n - _1)
(* naive algorithm *)
let choose n k = (fact n / fact k) / fact (n - k)
简而言之,没有。 Camlp4 是无类型解析树的预处理器。它不能做这种类型敏感的事情。
如果您愿意(我敢打赌您不会),您可以 运行 针对 Camlp4 中的无类型解析树进行类型检查,并推断您的特殊数字的类型,然后用相应的值替换它们。理论上是可以的,但是none曾经尝试过,因为P4的解析树和OCaml完全不同。
旨在取代Campl4的PPX预处理器有一些希望,因为它处理与OCaml相同的无类型解析树,因此很容易应用OCaml类型检查器。 TyPPX (https://bitbucket.org/camlspotter/typpx) 就是这样一个框架,为类型相关的预处理提供 API。
您可能想看看 delimited overloading — 它需要用 M.(e)
包围表达式 e
来限定您的常量,其中 M
是你的模块(你可以定义别名)。