Все это начинается с простой идеи: как написать отформатированную строку в стиле python в ocaml.
pythoners может начать строку как:
str = "this var: %s" % this_var
str2 = "this: %s; that: %s" % (this_var, that_var)
но форматированный строковый код ocaml как:
let str = Printf.sprintf "this var: %s" this_var
let str2 = Printf.sprintf "this: %s; that: %s" this_var that_var
Я верил, что смогу сделать что-то, чтобы строка ocaml форматировала код как Python
Сначала я определил функцию следующим образом:
let (%) s x = Printf.sprintf s x
тогда я могу написать прямо как:
let str = "this: %s" % "sth"
но простая функция не может обрабатывать более сложные ситуации как две или более переменных.
поэтому я хотел написать небольшую сложную функцию, чтобы она идеально имитировала путь Python.
Я написал это как ниже:
let (%) s li =
let split_list = Str.full_split (regexp "%[a-z]") s in
let rec fmt result_str s_list x_list = match s_list with
| [] -> result_str
| shd::stl -> match shd with
| Text t -> fmt (result_str^t) stl x_list
| Delim d -> match x_list with
| [] -> fmt result_str stl []
| xhd::xtl -> fmt (result_str^(Printf.sprintf d xhd)) stl xtl
in
fmt "" split_list li
Но функция просто НЕ МОЖЕТ работать, потому что ошибка типа, а также список ocaml не могут содержать несколько типов.
если вы напишите что-то вроде: "name: %s; age: %d" % ["John"; 20]
мир компиляторов ocaml рассмеется над кодом и скажет вам что-то типа ERROR.
Очевидно, я должен использовать Tuple для замены List. но я просто НЕ знаю, как выполнить хвостовую рекурсию кортежа переменной длины.
приветствуется любое предложение. У меня действительно два вопроса.
- как написать код python для ocaml для форматирования строки.
Если Ocaml не может динамически генерировать какую-либо строку в формате format6 str и
передать его в sprintf? для кода:
let s = "% s" в Printf.sprintf s "привет"
сгенерирует информацию об ОШИБКЕ как:
Ошибка: это выражение имеет строку типа
но ожидалось выражение типа
('a ->' b, единица измерения, строка) format =
('a ->' b, единица, строка, строка, строка, строка) format6