OCaml форматирование специальных символов? - PullRequest
0 голосов
/ 18 октября 2019

У меня следующий код ocaml:

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

При вызове этой функции в интерпретаторе я ожидаю получить вывод printf ("% d");сопровождаемый новой строкой, но вместо этого я получаю

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

Как я могу получить ожидаемый результат при вызове функции без использованиялюбые другие функции ввода / вывода?

Ответы [ 2 ]

2 голосов
/ 18 октября 2019

Выражение 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 (по модулю отсутствия тела функции).

0 голосов
/ 18 октября 2019

Поскольку вы каким-то образом используете принтер верхнего уровня для печати и вам нужен какой-то очень специфический формат, вам необходимо установить специальный принтер. Сработало бы следующее:

# #install_printer Format.pp_print_string;;
# " This \" is not escaped " ;;
- : string =  This " is not escaped 

Однако вполне вероятно, что это не та проблема, которую вы пытаетесь решить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...