ocaml - OCaml 特殊字符格式化?
问题描述
我有以下 ocaml 代码:
let rec c_write =
"printf(\" %d \");\n"
在解释器中调用这个函数时,我希望得到输出 printf("%d"); 后跟一个新行,但我得到了
printf(\" %d \");\n
当我在不使用任何其他 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 文件(以不存在函数体为模)。
推荐阅读
- reactjs - 当我将表单提交到 Firestore 时如何使我的反应组件重新呈现
- python - drf 序列化程序数据未正确显示所有字段数据
- python - 如何在 Python 中对包含数据库调用的方法进行单元测试
- python - 为什么我突然不能再用 Python 写文件了?
- github - 使用 keycloak 像 Github 一样进行身份验证和授权
- flutter - Flutter:完成所有屏幕/活动(适用于 android/iOS)
- flutter - 没有id的firestore文档更新数据
- scala - Aux 模式是否提供比类型参数更好的类型安全性?
- c# - 如何使用堆中的类型对象定位结构实例的虚拟方法?
- vba - 如何检查密件抄送字段是否为空