我有以下ocaml代码:
let rec c_write =
"printf(" %d ");n"
在解释器中调用此函数时,我希望获得输出 printf("%d"(;后跟一行新行,但相反,我得到
printf(\" %d \"(;
如何在不使用任何其他 I/O 函数的情况下调用函数时获得预期输出?
表达式let rec c_write = "printf(" %d ");n"
不是函数。它是类型为string
的值,绑定到名为c_write
的变量。因此,您没有在代码中使用任何 I/O 函数。
在交互式顶层输入时,为方便用户,解释器评估循环会打印此值。这与 Python 解释器为您打印您刚刚输入的值时相同。
通常,OCaml 顶级解释器选择的表示形式与用于在文件中存储值或打印值的表示形式无关。此外,在 OCaml 中,没有规范表示。
如果你想写一个打印C printf语句的函数,那么这就是它在OCaml中的样子
。let print_printf () =
print_endline {|printf("%d");|}
在上面的例子中,我用{||}
来表示刺痛的文字而不是更常见的""
,因为在这个文字中,没有必要转义特殊字符,并且它们被字面解释(即,没有任何特殊含义(。
您可以使用常规""
引号来表示它,从而获得相同的结果
let print_printf () =
print_endline "printf("%d");"
下面是使用这些定义的顶级交互示例:
# let print_printf () =
print_endline {|printf("%d");|};;
val print_printf : unit -> unit = <fun>
# print_printf ();;
printf("%d");
- : unit = ()
# let print_printf () =
print_endline "printf("%d");";;
val print_printf : unit -> unit = <fun>
# print_printf ();;
printf("%d");
- : unit = ()
如果你把这段代码放在一个文件中,编译,执行并重定向到一个C文件中,它将是一个格式良好的C文件(模化函数体的缺失(。
由于您以某种方式使用顶级打印机进行打印,并且以某种方式需要非常特定的格式,因此您需要安装自定义打印机。 以下方法将起作用:
# #install_printer Format.pp_print_string;;
# " This " is not escaped " ;;
- : string = This " is not escaped
但是,这似乎很可能不是您要解决的问题。