OSDev http://osdev.su/ |
|
Беседа о создании нового языка программирования http://osdev.su/viewtopic.php?f=18&t=1026 |
Страница 26 из 29 |
Автор: | Yoda [ 17 фев 2015, 18:39 ] |
Заголовок сообщения: | Re: Беседа о создании нового языка программирования |
Юрий писал(а): Если коротко, то объяснение такое: Код: /* начало комментария char x[] = "*/"; // ошибка, начиная с «";» конец комментария */ Такой код внутри комментария «ломает» этот комментарий. Чтобы правильно определить начало и конец всех вложенных комментариев, нужно проводить, как минимум, лексический анализ. Этот момент решается очень просто – маскированием символов внутри строковой константы, например так: Код: /* начало комментария char x[] = "*\/"; // больше нет ошибки конец комментария */ И, кстати, в данном случае вложенность комментариев не играет никакой роли, такая конструкция ломает и невложенный комментарий. Хуже обстоит дело с так называемыми raw strings, там где вся предварительная обработка отключена, но они в целом и так представляют собой кошмар лексического анализатора. ЕМНИП, я пытался оставить свои комментарии на вашем сайте, но почему-то они не оставлялись. |
Автор: | Himik [ 17 фев 2015, 18:50 ] |
Заголовок сообщения: | Re: Беседа о создании нового языка программирования |
Ещё можно использовать слияние строк char x[] = "*" "/"; |
Автор: | Bargest [ 17 фев 2015, 18:56 ] |
Заголовок сообщения: | Re: Беседа о создании нового языка программирования |
По поводу elseif: Цитата: Оператор условия: <...> и именно так и должно восприниматься компилятором. Создавать лишнее ключевое слово типа elif нет никакого смысла. запретить нафиг блоки кода с одним оператором без указания скобок. Добавление новых ключевых слов - плохо, особенно когда то же самое можно было бы записать без них. Но отказ elseif в купе с обязательным наличием операторных скобок может превратить цепочку условий в нечто ужасное: Код: if str1 = "123" {} else { if str2 = "234" {} else { if str3 = "345" {} else { if str4 = "456" {} else { doSomething; } } } } И так может продолжаться долго. Иногда switch/case не применим, например, когда условия в цепочке сложные, касаются разных переменных, или когда идет не просто проверка на числа. И это будет ужас. Возможно имеет смысл сделать единственный случай отсутствия операторных скобок - наличие if после else. Это, конечно, несколько идет вразрез с обсуждаемой концепцией, но во всяком случае поможет избежать вышеописанной ситуации. А слово elseif мне не нравится по самому смыслу - это ж склейка двух уже существующих ключевых слов в третье, причем какое-то противоестественное, да еще и так сказать создающее новый тип блока ветвления. |
Автор: | Freeman [ 17 фев 2015, 19:38 ] |
Заголовок сообщения: | Re: Беседа о создании нового языка программирования |
Yoda писал(а): Этот момент решается очень просто – маскированием символов внутри строковой константы Если правильно понял, Юрий подразумевает синтаксическое обособление нерабочего кода одной командой, необязательно в IDE. Кто будет маскировать строковые константы -- IDE или программист? Если программист, то чем это отличается от обычных комментариев? Идею спецразметки для нерабочего кода я нахожу годной, рассматриваю вариант реализации. В Канторе это наверняка будет еще один DSL -- разбираемый синтаксическим анализатором Кантора в /dev/null. Нужно только символ придумать. Bargest писал(а): Возможно имеет смысл сделать единственный случай отсутствия операторных скобок - наличие if после else. Это, конечно, несколько идет вразрез с обсуждаемой концепцией, но во всяком случае поможет избежать вышеописанной ситуации. Я уже на это напоролся. Вначале принял опрометчивое решение, заменив elsif совмещением else if, а теперь его приходится исправлять, чтобы не возвращать уродца в синтаксис. |
Автор: | Bargest [ 17 фев 2015, 20:40 ] |
Заголовок сообщения: | Re: Беседа о создании нового языка программирования |
Да, действительно, неоднозначность ввиду отсутствия открывающих операторных скобок - проблема. Похоже, что при сохранении else и if отдельными словами решить эту проблему могут только строгие отступы (конкретно, else if - это тот самый elseif, а else \r\n if - это уже новая команда в блоке, требующем отдельного end). Хотя это все равно несколько нарушает концепцию и не есть комильфо. |
Автор: | Yoda [ 18 фев 2015, 11:34 ] |
Заголовок сообщения: | Re: Беседа о создании нового языка программирования |
Freeman писал(а): Если правильно понял, Юрий подразумевает синтаксическое обособление нерабочего кода одной командой, необязательно в IDE. Кто будет маскировать строковые константы -- IDE или программист? Если программист, то чем это отличается от обычных комментариев? Не совсем понимаю, о чём вы. Можно маскировать автоматически в IDE, это делается довольно просто - достаточно парсить все строковые и символьные константы и заменять последовательности */ на *\/, семантика от этого не меняется. Может это делать и программист, особенно удачно совмещается с подсветкой синтаксиса, – после комментирования участка кода случайно оставшаяся часть будет подсвечена как код. В конце концов, не проблема столкнуться с синтаксической ошибкой – это будет мгновенно обнаружено при ближайшей компиляции. Проблема – столкнуться с ситуацией, когда синтаксических и грамматических ошибок не возникнет, и код начнёт компилироваться с другой семантикой. Такая ситуация здесь практически исключена, т.к. закрывающая кавычка превратится в открывающую и чтобы сохранить компилируемость, надо сильно извратиться с содержимым строки, последующими комментариями и кодом вокруг этого участка. Bargest писал(а): Но отказ elseif в купе с обязательным наличием операторных скобок может превратить цепочку условий в нечто ужасное: Код: if str1 = "123" {} else { if str2 = "234" {} else { if str3 = "345" {} else { if str4 = "456" {} else { doSomething; } } } } И так может продолжаться долго. Я эту проблему давно решил для себя даже в C/C++ следующим образом: Код: if (num1=123) {
...; } else if (num2=234) { ...; } else if (num3=345) { ...; } else if (num4=456) { ...; } else { ...; } |
Автор: | Himik [ 18 фев 2015, 13:37 ] |
Заголовок сообщения: | Re: Беседа о создании нового языка программирования |
Чтобы не смешивать управляющие символы с выражениями, можно применить ограничение, запрещающее управляющие символы в середине строки, а только в начале и в конце. Можно так /* ... */ или так /* ... ... ... */ так же можно /* ... */ а так нельзя ... /* ... */ ... |
Автор: | rst256 [ 18 фев 2015, 14:28 ] |
Заголовок сообщения: | Re: Беседа о создании нового языка программирования |
Yoda писал(а): Юрий писал(а): Если коротко, то объяснение такое: Код: /* начало комментария char x[] = "*/"; // ошибка, начиная с «";» конец комментария */ Такой код внутри комментария «ломает» этот комментарий. Чтобы правильно определить начало и конец всех вложенных комментариев, нужно проводить, как минимум, лексический анализ. Этот момент решается очень просто – маскированием символов внутри строковой константы, например так: Код: /* начало комментария char x[] = "*\/"; // больше нет ошибки конец комментария */ И, кстати, в данном случае вложенность комментариев не играет никакой роли, такая конструкция ломает и невложенный комментарий. Хуже обстоит дело с так называемыми raw strings, там где вся предварительная обработка отключена, но они в целом и так представляют собой кошмар лексического анализатора. ЕМНИП, я пытался оставить свои комментарии на вашем сайте, но почему-то они не оставлялись. Извините, а зачем вы вообще суете в комментарии код, они же не для этого? что-то надо выкинуть из программы, но возможно вернуть или просто временно отключить? Есть такая вещь как Система управления версиями, удалил что не надо сделал коммит. не понравилось вернул. Разумеется можно внести в блок токенизатора, обходящий комментарии, обработку строковых констант, и даже вложенные обработать (только если используется формат begin-end здесь /*...*/) это вообще то тривиально. и можно дальше продолжать спокойно есть свой суп вилкой. |
Автор: | Freeman [ 18 фев 2015, 17:04 ] |
Заголовок сообщения: | Re: Беседа о создании нового языка программирования |
Yoda писал(а): особенно удачно совмещается с подсветкой синтаксиса, – после комментирования участка кода случайно оставшаяся часть будет подсвечена как код. В конце концов, не проблема столкнуться с синтаксической ошибкой – это будет мгновенно обнаружено при ближайшей компиляции. Идея в том, чтобы иметь в языке синтаксическое средство для гарантированного комментирования нерабочего кода, безо всяких там случайностей. Во время творческого процесса программист не должен отвлекаться на мелочи. А то тут компромисс, там компромисс, на авось понадеялись... и знакомое УГ вышло. |
Автор: | Himik [ 18 фев 2015, 17:20 ] |
Заголовок сообщения: | Re: Беседа о создании нового языка программирования |
Многие редакторы умеют комментировать и раскомментировать множество строк в выделенном блоке путём построчной вставки хвостового комментария типа //. Тоже хороший вариант. |
Страница 26 из 29 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |