LINUX.ORG.RU

Контекстно-зависимость в синтаксисе ЯП

 ,


0

3

Вот такой чисто теоретический вопрос, навеянный топиком Странная ошибка c шаблоном (или я идиот, или одно из двух)

В C++ одна из особенностей, делающих грамматику контекстно-зависимой — это неоднозначность парсинга выражения

foo<a>(b);

То ли это шаблонная функция foo<a>, вызываемая с аргументом b.

То ли это выражение (foo < a) > b.

Чтобы это понять, компилятор должен иметь доступ к декларации foo.

Как бы вы сделали эту часть грамматики контекстно-свободной, если бы дизайнили ЯП с нуля? Ваши идеи?

★★

Последнее исправление: wandrien (всего исправлений: 2)

Ответ на: комментарий от anonymous

Все закорючки по возможности заменить буквами. Архаичное дрочево на символьную кашу решительно упразднить. Несогласным выдать Перл и знакосинтезирующий дисплей со шрифтом 8х8.

За выход за 80 позицию в строке бить по голове восьмидюймовым дисководом на два диска.

thesis ★★★★★
()
Последнее исправление: thesis (всего исправлений: 1)

Шаблоны это эрзац мета-классов и мета-функций. Логично было бы ввести мета-параметры, однозначно отличимые от обычных переменных. Например, тем же префиксом из символа.

новые символы для

Но у членов комитета очень старые клавиатуры, поэтому там нет символов «$» и «@».

thunar ★★★★★
()
Ответ на: комментарий от thunar

Шаблоны это эрзац мета-классов и мета-функций. Логично было бы ввести мета-параметры, однозначно отличимые от обычных переменных. Например, тем же префиксом из символа.

На мой взгляд, чисто из общих соображений, даже маркировать отдельно не нужно. Необходимость маркировать, где у нас что, связана с особенностями наследия Си и его всратого синтаксиса.

Берём выражение в вакууме:

f(x)(y)(z)

Какая разница парсеру, что тут что? Он дерево построит однозначным образом. А потом уже на этапе вывода типов, компилятор решит, имеет это выражение смысл, или является ошибочным.

Правда веселее становится, если у нас есть неявные шаблоны. Когда написано foo, но подразумевается foo<сам догадайся>.

wandrien ★★
() автор топика
Последнее исправление: wandrien (всего исправлений: 2)
Ответ на: комментарий от thesis

Все закорючки по возможности заменить буквами.

Я бы с удовольствием поглядел бы как Вы будете забивать какую нить сложную численную схему, которая написана в терминах векторов и на бумаге занимает две страницы А4, без «закорючек». А с еще большим удовольствием бы поглядел как Вы потом это все отлаживаете…

За выход за 80 позицию в строке бить по голове восьмидюймовым дисководом на два диска.

Перфокарты давно ушли в прошлое, но дело их живет!

Давайте Вы не будете проецировать стандарты области в которой Вы работаете на весь мир? Если хочется кому то дать по голове - постучитесь своей головой об угол.

AntonI ★★★★★
()

Ну с нуля разрабатывать ЯП дело неблагодарное, ЯП то для людей пишется, а они знают другие ЯП а Ваш не знают, и учить его не захотят. Можно конечно к ним засылать @thesis -а с восьмидюймовым дисководом шоб он стимулировал процесс познания, но боюсь надолго его не хватит… ;-)

AntonI ★★★★★
()
Последнее исправление: AntonI (всего исправлений: 1)
Ответ на: комментарий от AntonI

Давайте Вы не будете проецировать стандарты области в которой Вы работаете на весь мир?

Я тут работаю преимущественно в области клоунады, а ее невозможно не проецировать на весь мир((

Если хочется кому то дать по голове - постучитесь своей головой об угол.

Не понимаю, как это должно работать. Есть истории успеха?

thesis ★★★★★
()
Последнее исправление: thesis (всего исправлений: 1)
Ответ на: комментарий от AntonI

Ну с нуля разрабатывать ЯП дело неблагодарное

Язык не трогать, поменять только синтаксис, чтобы синтаксис был простым. За основу синтаксиса взять академические языки: Pascal, (Standard)ML, Lisp (почему бы и нет).

Поменять только фронтенд, парсер. Чтобы синтаксические конструкции на «новом» языке однозначно конвертировались на оригинальный язык.

anonymous
()

Как бы вы сделали эту часть грамматики контекстно-свободной, если бы дизайнили ЯП с нуля?

Например, как в (Oca)ML/Haskell.

foo (x : a)
(foo x : a)
foo (x :: A)
foo x :: A
korvin_ ★★★★★
()

Как бы вы сделали эту часть грамматики контекстно-свободной, если бы дизайнили ЯП с нуля? Ваши идеи?

Я бы сделал нормальный макропроцессор, тогда шаблоны были бы в принципе не нужны. Собственно шаблоны, это потуга вытеснить уродливый Сишный препроцессор.

zx_gamer ★★★
()
Ответ на: комментарий от thesis

Не понимаю, как это должно работать. Есть истории успеха?

Разумеется! Если человек обуреваемый жаждой бить кого то по голове с разбегу бьется головой об угол, то такие желания тут же пропадают. Элементарная физика, остается одна мысль - как хорошо что mv^2 пополам.

AntonI ★★★★★
()
Ответ на: комментарий от AntonI

Дык синтаксис в плане изучения нового ЯП не менее важен чем то что под капотом

Поэтому нужен непротиворечивый синтакис. Синтаксис академических языков более цельный, продуманный.

Хотя С++ новый синтаксис не сильно улучшит. У него разброд и шатание в стандартной библиотеке: исключения нужны/не нужны, аллокаторы неизвестно во что полиморфируют (в автоматический сборщик мусора?), итераторы/ренжи, недопроектированная семантика перемещения как бы замена линейным типам.

И это разброд создает различные огороженные подязыки, типа программирования с выключенными исключениями и тп.

anonymous
()

а просто не надо различать шаблонные и не-шаблонные параметры, типы и данные, и допустить функции высшего порядка. lisp-на-стероидах и чистокровная функциональщина :-)

foo<a>(b) это-ж foo(a,b) или (foo(a))(b) и так далее.

компилятор сам, бех костыльных подсказок template должен разбираться что он может сделать в компил-тайм, что оставит на дальнейшее.

То есть сам по себе синтаксис «template <>» он от убогости и текущей ограниченности получился .. это костыль

MKuznetsov ★★★★★
()

В развитие темы предлагаю аналогичный вопрос про макросы.

А что касается этого - думаю лучше всего оставить как есть, потому как единственная альтернатива это городить какие-то более длинные (в символах) конструкции, что очевидно хуже.

firkax ★★★★★
()

проблема просто в скобках. любой не КС синтаксис - зло. вот тут как раз один из примеров.

были б на клавиатуре еще какие-нить скобки - взяли бы их и сняло бы вопрос как рукой.

alysnix ★★★
()
Последнее исправление: alysnix (всего исправлений: 1)
Ответ на: комментарий от Obezyan

Ссылку я посмотреть не могу, что там?

Если там возражение на мой комментарий, то порядок в обоих случаях будет такой: сначала 'foo' сравнивается с 'a', потом результат сравнения сравнивается с 'b'.

firkax ★★★★★
()

Как бы вы сделали эту часть грамматики контекстно-свободной, если бы дизайнили ЯП с нуля? Ваши идеи?

Ну ты понимаешь, что требуется переписать синтаксис C++ нахрен? В данном случае, можно вставить костыль и потребовать ключевое слово в параметрах шаблона. Например, вот так: foo<type a>(b).

hateyoufeel ★★★★★
()

Чтобы это понять, компилятор должен иметь доступ к декларации foo.

А что без декларации foo этот код можно скомпилить даже будь он однозначным?

ya-betmen ★★★★★
()
Ответ на: комментарий от zx_gamer

Нормальный — перестат быть макропроцессором и становится кодогенератором — как только там появляется система типов, рекурсия и компайл-тайм вычисления.

thunar ★★★★★
()
Ответ на: комментарий от zx_gamer

Вообще то инстацирование шаблонов гораздо сложнее чем просто макроподстановка - там и концепты, и частичная спецификация и перегрузка функций. Т.е. результат инстацирования может зависеть от типов аргументов метода - у макропроцессора такой информации априори нет и быть не может, иначе это уже не макропроцессор.

Ваш К.О.

AntonI ★★★★★
()
Последнее исправление: AntonI (всего исправлений: 1)
Ответ на: комментарий от static_lab

Мне нравится синтаксис Агды. Но context free там даже близко не пахнет лол.

А так, сделать CF грамматику для язычка не то чтобы сложно. Если выкинуть из того же хачкеля indentation rules и писать на нём с {} и ;, получится вполне себе CF.

hateyoufeel ★★★★★
()
Ответ на: комментарий от MKuznetsov

foo(b) это-ж foo(a,b) или (foo(a))(b) и так далее.

не этож. в одной области видимости может быть функция

foo(int,int) 

и шаблонная

foo<int>(int)
alysnix ★★★
()
Последнее исправление: alysnix (всего исправлений: 1)
Ответ на: комментарий от thesis

Я тут работаю преимущественно в области клоунады, а ее невозможно не проецировать на весь мир((

Спасибо, у вас хорошо получается, поднимает настроение по утрам!

blex ★★★
()