首页 > 解决方案 > OCaml 特殊字符格式化?

问题描述

我有以下 ocaml 代码:

let rec c_write =                                                                                                                                                                                                                                                                                           
  "printf(\" %d \");\n"

在解释器中调用这个函数时,我希望得到输出 printf("%d"); 后跟一个新行,但我得到了

printf(\" %d \");\n

当我在不使用任何其他 I/O 函数的情况下调用函数时,如何获得预期的输出?

标签: ocaml

解决方案


表达式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 文件(以不存在函数体为模)。


推荐阅读