thedeemon: (office)
[personal profile] thedeemon
К чему был предыдущий пост. У меня тут написанный на Идрисе кодогенератор, который генерит десятки разных вариаций компенсации движения на С++, т.е. на выходе много текста. Лучше всего для этого дела подошла бы 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) ""

Date: 2013-11-28 01:05 pm (UTC)
From: [identity profile] helvegr.livejournal.com
> Но в Идрисе такого тоже нет,

Надо же; я думал, что type-safe printf это poster child для зависимых типов. Ещё в статье про Cayenne было.

Date: 2013-11-28 03:17 pm (UTC)
From: [identity profile] thedeemon.livejournal.com
Ну одно дело "можно сделать и написать статью/пост", другое - "уже сделано и включено в стандартную библиотеку". Идрис пока ближе к первой стадии, стандартная библиотека в нем очень скромная.

Date: 2013-11-28 01:28 pm (UTC)
From: [identity profile] dmytrish.livejournal.com
Лучше всего для этого дела подошла бы string interpolation, но в Идрисе такого нету и не предвидится. — а что именно мешает запилить, или это тема не для чайников?

Date: 2013-11-28 03:11 pm (UTC)
From: [identity profile] thedeemon.livejournal.com
Как я понимаю, это надо или в компилятор поддержку вставлять (а авторам не до того), либо макросы, которых пока тоже нет.

Date: 2013-11-28 03:00 pm (UTC)
From: [identity profile] voidex.livejournal.com
На хватает обработки "$$"

Date: 2013-11-28 03:09 pm (UTC)
From: [identity profile] thedeemon.livejournal.com
Сейчас это две подряд идущих строки, такое встречается.
А вот сам символ $ в генерируемом С++ коде никогда не встречается, так что эскейпинг в моем случае не понадобился.

Date: 2013-11-28 04:28 pm (UTC)
From: [identity profile] theiced.livejournal.com
то есть создаём себе проблемы на ровном месте что бы ублажить божество статической тупизации. sooo ooook.

Date: 2013-11-28 05:10 pm (UTC)
From: [identity profile] thedeemon.livejournal.com
Какие проблемы? Не было нужной фичи в языке, добавил за 10 строк.

Зато сэкономил 8 месяцев отладки и 12487 строк тестов, которые понадобились бы без статической типизации.

Date: 2013-11-28 05:12 pm (UTC)
From: [identity profile] theiced.livejournal.com
и вот какие конкретно проблемы решила статическая тупизация?

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

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

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

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

Date: 2013-11-28 05:53 pm (UTC)
From: [identity profile] voidex.livejournal.com
Она не допускает к языку всяких идиотов.
Впрочем, альтернативный вариант - скобочки.
Edited Date: 2013-11-28 05:54 pm (UTC)

Profile

thedeemon: (Default)
Dmitry Popov

May 2025

S M T W T F S
    123
45678910
11 121314151617
18192021222324
25262728293031

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jun. 15th, 2025 12:48 pm
Powered by Dreamwidth Studios