我是一个非常新手的OCaml程序员,所以如果这是一个愚蠢/明显的问题,请原谅我.有很多东西要吸收,我可能在文档中错过了这个.
我有一个代码基础,看起来像这样:
let update_x p x = add_delta p; p.x <- x; refresh p let update_y p y = add_delta p; p.y <- y; refresh p let update_z p z = add_delta p; p.z <- z; refresh p
复制被开始的错误我,因为我想要写的是这样的:
let update_scalar p scalar value = add_delta p; magic_reflection (p, scalar) <- value; refresh p
这样当我更新x时我可以简单地调用:
update_scalar p 'x' value
这就是"宏!" 对我而言,我不相信OCaml有一个宏系统.我还可以做些什么?
你无法做到你想要的,但你可以通过更高阶函数大大减少样板:
let update_gen set p x = add_delta p; set p x; refresh p let update_x = update_gen (fun p v -> p.x <- v) let update_y = update_gen (fun p v -> p.y <- v) let update_z = update_gen (fun p v -> p.z <- v)
OCaml确实有一个宏系统(camlp4),它允许你实现这种事情,有些工作.