-
Notifications
You must be signed in to change notification settings - Fork 35
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Псевдокомментарии в духе Рефала-05 #195
Comments
Не сформулирована цель у псевдокомментариевВ постановке задачи говорится только о том, что надо сделать, как в Рефале-05. Но отношение между Рефалом-05 и классическим Рефалом-5 отличается от отношения между классическим и Рефалом-5λ. Рефал-05 декларируется как совместимый с Рефалом-5 минималистичный, эффективный и компилирующийся в Си (Mazdaywik/Refal-05#33). Точное вложение одного языка в другой не требуется — требуется только совместимость — наличие возможности писать программы, одинаково работающие в обоих языках. Псевдокомментарии используются для определения пустых функций, которые необходимы Рефалу-05 и не нужны Рефалу-5. Рефал-5λ позиционируется как точное надмножество, т.е. любая корректная программа на классическом Рефале-5 будет корректной для Рефала-5 и будет работать точно также. (На данный момент, однако, есть оговорка о метафункциях — А в Рефале-5λ какая цель может быть у псевдокомментариев? |
Цели у псевдокомментариевЦели можно выделить две:
Подсказки, невидимые классическому Рефалу-5Рефал-5λ декларируется как точное надмножество классического Рефала-5 (далее мы будем опускать определение «классический») — любая программа на Рефале-5 является корректной программой на Рефале-5λ, имеющей ту же семантику. Рефал-5 игнорирует все псевдокомментарии. Следовательно:
Таким образом, компилятор не может сообщать о синтаксических ошибках в псевдокомментариях как об ошибках — они должны быть предупреждениями. Также псевдокомментарии не должны изменять семантику программы. Они могут, например, влиять на оптимизацию программы (вроде ПрагмыМотивация здесь в том, что для каких-то второстепенных средств не вводится специальный синтаксис «верхнего» уровня. Вроде того, что вместо Псевдокомментариями можно, например, подавлять предупреждения. Тоже вещь второстепенная. Возможные псевдокомментарии и подходы к реализации
Минимальная реализацияМожно гарантировать соответствие семантики Рефала-5λ классическому Рефалу-5 только в режиме Такой подход позволит быстро реализовать |
|
В классическом режиме они игнорируются, в обычном режиме интерпретируются также, как одноимённые директивы. Допустимо разбивать их на несколько строчек — строчки-продолжения должны начинаться с "$* " или "*$\t". Внутри одного псевдокомментария допустима только одна конструкция.
ПодытоживаяКлючевые слова оптимизатораЦитата из топика:
В заявке #314, а именно в #314 (comment) предлагается сделать то же самое, причём в комментарии написано больше и подробнее.
|
Местоположение псевдокомментариевГде располагать псевдокомментарии? В произвольном месте программы или только вне определений? На псевдокомментарии в Рефале-5λ вдохновил Рефал-05. В нём псевдокомментарий, т.е. строчка вида В Рефале-5λ ситуация иная. Любая корректная программа на Рефале-5 должна быть корректной программой на Рефале-5λ, в том числе, с любыми комментариями. Сейчас эта цель достигается частично — в классическом режиме псевдокомментарии Опыт других проектов:
В постановке задачи #314 (comment) предлагается выдавать только предупреждения на проблемы с псевдокомментариями, что соответствует цели совместимости. Так где же допускать псевдокомментарии?Если их разрешать только на верхнем уровне, то во всех остальных местах их нужно будет учитывать и обрабатывать (игнорировать, возможно, выдавая предупреждение), как это сейчас делается с
Если разрешать их везде, то возможна другая реализация: отдельная обработка псевдокомментариев и отдельный синтаксический анализ обычных токенов.
ВыводПредлагается отдельным проходом сначала обработать все псевдокомментарии, а затем все остальные токены. |
В заявке #195 предлагалось заменить $LABEL на *$PRAGMA-NATIVE-IDENTS, но было выбрано слово $IDENT. Во-первых, вещь второстепенная и с удалением нативных вставок (см. #318) она будет удалена, во-вторых, имеющийся код легко расширить новым ключевым словом, если оно совпадает с точностью до регистра с узлом дерева. А директива $LABEL отображается на узел дерева (Ident t.Pos e.Name).
Стабильная версия иначе интерпретировала псевдокомментарии и выдавала на них ошибки компиляции. Для обеспечения совместимости внедрён костыль в виде псевдокомментариев вида *$xDRIVE. После обновления стабильной версии данный костыль нужно будет удалить. Подробности в комментарии в коде.
Эта задача — подзадача #185. Процитирую параграф оттуда.
Можно добавить только, что псевдокомментарии могут быть доступны не для всех ключевых слов, и даже наоборот, не все ключевые слова могут быть доступны без псевдокомментариев. Например, следующая конструкция бессмысленна, ибо глупа:
Но её поддерживает Рефал-05 ради минималистичности и компактности исходников.
Сейчас компилятор Рефала-5λ поддерживает директиву
$LABEL
(199c8e2), что есть костыль. Разумно подобные вещи допускать только в псевдокомментариях:Когда закрыть заявку?
*$EXTENDED
.*$CLASSIC
упрощена.The text was updated successfully, but these errors were encountered: