Здравствуйте, so5team, Вы писали:
S>>>Т.е. вы настолько оптимистичны, что считаете, что этого еще не случилось?
N>>Ну вот call/cc, например, в него не успели встроить.
S>А что, call/cc -- это необходимое условие для того, чтобы язык считался монстром?
Если вопрос ставится в стиле
BFE>>Считаю, что в конечном итоге из C++ должен получится монстр включающий все возможные техники и парадигмы программирования.
то да, монстр, в котором _все_ техники и парадигмы — без call/cc недостаточен.
С другой стороны, если не ограничиваться им, то это не необходимое, а достаточное условие — по крайней мере для тех 95-99% коллег, что на любую рекурсию начинают смотреть как на признак присутствия самого Люцифера.
S>Одной россыпи UB в языке (как унаследованной из C, так и собственной) уже вполне достаточно. А если добавить сюда еще и список способов инициализации локальных переменных...
Подозреваю, что кое-кто в комитете или рядом с ним думает, что этого недостаточно.
Большое спасибо за ответ. А можно я попрошу прямо здесь показать, на что они годятся? На двух актуальных примерах, обсуждавшихся на этих форумах в последнее время.
Вот в таком виде, не потеряв в производительности?
if (!(errno is in (
EAGAIN,
EWOULDBLOCK,
EINTR,
ENOSPC,
ENOBUFS,
ENOMEM
))
{
...
}
(Я понимаю, что дизайнер языков из меня так себе и синтаксис "is in", возможно, не лучшее решение, и если это ещё выразительнее можно записать, то я не против ).
На самом-то деле, шаблон тут довольно уместен. Может быть даже, это самое выразительное решение при объявлении переменной. Но, допустим в духе идеи того обсуждения, нам захотелось изобразить псевдовстроенный тип с ограничениями и каким-нибудь выразительным синтаксисом наподобие (более удачные вариации приветствуются):
a: int 1..100
Можно ли это сделать на rust и как? Много хорошего про него слышу, но так и не удосужился попробовать самому. Буду благодарен за примеры, чтобы понять, стоит ли изучать.
A>>А если этот ЯП в итоге транспилируется в C++ (как сами плюсы изначально транспилировались в си), то я даже знаю, где применить
FR>Тут разве что nim, там есть макросы близкие к процедурным и шаблоны уровня C++, еще возможно haxe но не помню как там с макросами. Оба умеют транслироваться в си, а nim и в с++.
Здравствуйте, Alekzander, Вы писали:
A>Здравствуйте, FR, Вы писали:
A>Большое спасибо за ответ. А можно я попрошу прямо здесь показать, на что они годятся? На двух актуальных примерах, обсуждавшихся на этих форумах в последнее время.
Сейчас с примерами разбираться времени нет, может позже посмотрю.
Но сразу скажу что rust далеко не nemerle или lisp и произвольно менять синтаксис везде не дает, весь измененный синтаксис должен быть внутри макроса, и токены все должны быть допустимыми в rust, но примерно такое:
вполне при этом позволяет. Подробнее про пример выше можно тут посмотреть.
Твои примеры вполне реализуемы на процедурных макросах, но с теми ограничениями что я описал кажутся не очень полезными. Ну и второй пример наверно проще и удобнее будет реализовать через new type idiom.
Здравствуйте, B0FEE664, Вы писали:
R>>Для кодогенерации сущесвуют custom build steps, куда можно запихать что угодно и сгенерировать что угодно. BFE>Только вот в некоторых случаях для это нужно иметь инструменты равные компилятору по сложности.
Так и есть.
Можно получить модель кода с помощью clang — у него есть режим дампа AST.
А так же есть тулзины (если поискать) по чтению этого AST и манипулированию им.
BFE>иначе нам придётся парсить код ещё раз и не факт, что код будет рапарсен одинаково
Тоже верно.
Если пользоваться cmake, то есть возможность взять именно те же аргументы командной строки и добавить нужный аргумент -ast-dump.
Насчёт ситуации с другими целевыми компиляторами — clang может выступать фронендом для msvc и gcc, что покрывает щепетильный вопрос однозначности парсинга для кодогенерации и для целевого образа.
Здравствуйте, Shmj, Вы писали:
S>Вот если брать только С++ времени компиляции — пишут Тьюринг полный. Ну ОК, это по вопросу вычислений. А по вопросу интеграции с системой — что можно а чего нельзя?
S>Можно сделать assert — вывести сообщение и отменить компиляцию. А что-то еще можно? Файл создать — никак?
- Что делаешь?
— Пишу игру на шаблонах.
— И как?
— Победил во время компиляции.
R>Ты имеешь в виду ран-тайм кодогенерацию, наподобие дотнетовых Emit и CodeDOM, или же генерацию исходного текста программ?
А вот в nim, например, и не то, и не другое. И не эмитирование, и не генерация текста. А генерация AST. Коммон-лисповская идеология, так полюбившаяся в свое время Полу Грему, да натянутая на нативно компилируемый язык — это ж пЭстня же ж Да и вообще, как говаривал один мудрый Лиспер, "язык, не позволяющий размышлять в терминах AST больше мешает, чем помогает". Если б ещё сам nim в целом не был глючноват (при переходе от версии к версии порой происходит полный трындец), то цены б ему не было.
R>Коноплю тебе в компайл-тайм не нужно выращивать?
Тссс, не подсказывай. А то кто-нибудь из прочитавших упорется, и действительно такое сделает. И если раньше программисты пинали балду во время компиляции, играя в пинг-понг, то теперь будут ждать урожая