thedeemon: (office)
Dmitry Popov ([personal profile] thedeemon) wrote2013-11-28 04:37 pm
Entry tags:

sprintf-like

К чему был предыдущий пост. У меня тут написанный на Идрисе кодогенератор, который генерит десятки разных вариаций компенсации движения на С++, т.е. на выходе много текста. Лучше всего для этого дела подошла бы string interpolation, но в Идрисе такого нету и не предвидится. В окамле вон есть модуль Printf, где вызов вроде
Printf.sprintf "%d %s of beer" 99 "bottles"
вернет строчку
"99 bottles of beer"
и компилятор проверит, что число и типы параметров соответствуют формат-строке, это умение встроено в сам компилятор как специальный случай для этого модуля, насколько я помню. Но в Идрисе такого тоже нет, поэтому приходилось просто соединять строчки оператором ++, получалось не слишком удобно. Теперь же вот сделал себе упрощенный аналог sprintf, который просто вставляет строчки в нужные позиции. Вместо
"bigLuma.halveBlockHP(" ++ vec st ++", " ++ block ++ ");"
"PBlock<"++ w++"> "++block++" = halfLuma.makePBlock<"++w++">();"
теперь просто
ins "bigLuma.halveBlockHP($, $);" (vec st) block
ins "PBlock<$> $ = halfLuma.makePBlock<$>();" w block w
Параметры пока только строковые, но зато соответствие их числа формат-строке проверяется статически.

Реализовано так:

numS : String -> Nat
numS = List.length . filter (=='$') . unpack

prnType : Nat -> Type
prnType Z = String
prnType (S k) = String -> prnType k

prn : (n:Nat) -> List String -> String -> prnType n
prn Z [s] acc = acc ++ s
prn (S k) (s::rest) acc = \x => prn k rest (acc ++ s ++ x)

ins : (fmt:String) -> prnType (numS fmt)
ins src = prn (numS src) (Strings.split (=='$') src) ""

[identity profile] theiced.livejournal.com 2013-11-28 06:17 pm (UTC)(link)
мне бы примеры, а то пока только привели пример когда заменили список на хэш и всё сломалось.

[identity profile] voidex.livejournal.com 2013-11-28 07:16 pm (UTC)(link)
В GCC и OCaml встроена отдельно поддержка printf не от простой жизни.

[identity profile] theiced.livejournal.com 2013-11-28 11:35 pm (UTC)(link)
да, у рукожопых жизнь непростая :)

[identity profile] voidex.livejournal.com 2013-11-29 06:09 am (UTC)(link)
Так себе аргумент. Моя бабка такие на любой случай придумать может.