gpt4 book ai didi

printf - ocaml printf 函数 : skip formatting entirely if some condition holds

转载 作者:行者123 更新时间:2023-12-05 01:47:54 25 4
gpt4 key购买 nike

(摘自ocaml: exposing a printf function in an object's method,可独立回答)

我有以下(简化的)ocaml 代码,用于记录器:

type log_level =
| Error
| Warn
| Info

let ord lvl =
match lvl with
| Error -> 50
| Warn -> 40
| Info -> 30

let current_level = ref (ord Warn)

let logf name lvl =
let do_log str =
if (ord lvl) >= !current_level then
print_endline str
in
Printf.ksprintf do_log

logf 函数可以与 printf 格式一起使用,如:

logf "func" Warn "testing with string: %s and int: %d" "str" 42;

有没有什么方法可以实现仅在实际需要时格式化参数的典型日志记录行为?即类似于:

let logf name lvl <args> =
if (ord lvl) >= !current_level then
Printf.printf <args>

我在想这是因为只有编译器知道格式表达式中会有多少个参数,而且我猜在 ocaml 中没有 varargs 这样的东西?因此,您永远无法定义 printf 函数的完整 主体,您只能使用柯里化(Currying)并让编译器魔法解决它。有什么办法可以实现我想要的吗?也许使用 mkprintf

最佳答案

Printf.kfprintf 等延续函数专门用于允许这样的格式包装器。它看起来像这样:

open Printf

type log_level = Error | Warn | Info

let ord = function Error -> 50 | Warn -> 40 | Info -> 30

let string_of_lvl = function
| Error -> "error"
| Warn -> "warn"
| Info -> "info"

let current_level = ref (ord Warn)

let printf_with_info name lvl =
kfprintf fprintf stdout "[<%s>] <%s>: " name (string_of_lvl lvl)

let logf name lvl =
if ord lvl >= !current_level then match lvl with
| Error | Warn -> printf
| Info -> printf_with_info name lvl
else
ifprintf stdout

关于printf - ocaml printf 函数 : skip formatting entirely if some condition holds,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20413684/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com