Пользовательские идентификаторы-литералы

Dec 17, 2019 16:06

Когда-то давно (15 лет назад) я делал наброски языка разметки текстов. С использованием квадратных скобок [] для тэгов и фигурных {} для ссылок на какие-либо термины. Фактически, как в Wikitext для ссылок используется синтаксис [[имя статьи]], так и там {термин} или {имя статьи}. Но проблема, побудившая меня на размышления о решении, была ( Read more... )

Leave a comment

Comments 6

livelight December 17 2019, 13:47:09 UTC
{ip:127.0.0.1}
{url:https://en.wikipedia.org/}
{user:johnsmith}

Reply

justy_tylor December 17 2019, 14:09:11 UTC
Вариант с ручным указанием типа и так возможен в привычных языках. В большинстве ты можешь указать его префиксом как ip "127.0.0.1", ip("127.0.0.1") или new IP("127.0.0.1"). В C++11 и последующих - с суффиксом как "127.0.0.1"_ip. Но это визуальный шум.

Если я сразу определяю IPv4 и URL, то почему бы компилятору не делать это же? А в случаях, где возможны противоречия, придётся подсказать. Поэтому {user:johnsmith} скорее всего останется с префиксом user.

Reply

livelight December 17 2019, 14:15:43 UTC
Человек напишет {10.0.0.1}, потому что уверен, что разногласия здесь невозможны, это же айпишник!
Компилятор тоже уверен, что разногласия здесь невозможны, и смело вставит в этом месте, например, ссылку на release notes для версии 10.0.0.1 нашего замечательного продукта.

Reply

justy_tylor December 17 2019, 14:30:09 UTC
Компилятор выдаст ошибку: пользовательский литерал одновременно распознан как network.ip_address и hipster.web.product.release_notes, уточните написание литерала или отключите распознавание литералов для данного проекта в одной из конфликтующих библиотек. В общем, как обычно с сигнатурами.

Reply


ailev December 17 2019, 13:50:09 UTC
Ну да, на удивление прилично выглядит. В той же Julia ужасно -- в версии 1.3 добавили syntax var"#str#" for printing and parsing non-standard variable names.

Reply

justy_tylor December 17 2019, 14:24:30 UTC
Насколько я понял, у них это решение и для FFI, и для "макросы нагенерировали странного" одновременно.

При том, что для FFI это не нужно, т.к. в FFI нет локальных переменных, и любые имена существуют в контексте. Достаточно:
x = current_row."Absolute x value"

А макросами лучше не генерировать странное. Машине имена безразличны, важна уникальность. А вот читать мусор при отладке не очень комфортно.

Reply


Leave a comment

Up