Выражение let rec c_write = "printf(\" %d \");\n"
не является функцией. Это значение типа string
, которое связано с переменной с именем c_write
. Таким образом, вы не используете никаких функций ввода-вывода в своем коде.
При вводе в интерактивном верхнем уровне это значение печатается в цикле оценки интерпретатора для удобства пользователя. Так же, как когда интерпретатор 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 (по модулю отсутствия тела функции).