Я бы сказал, что нет. Обычно у языков-мутантов этап, на котором проводятся всевозможные трансформации, рассматривается отдельно от непосредственно парсинга.
> Я бы сказал, что нет. Обычно у языков-мутантов этап, на котором проводятся всевозможные трансформации, рассматривается отдельно от непосредственно парсинга.
В CL вообще можно ридер в рантайме менять, так что является.
если грамматику можно описать в рамках EBNF (кстати, забавно выглядит в русской раскладке), то она определённо контекстно-свободна. как бы оное описание ни выглядело
Если не принимать во внимание ридер-макросы в CL, то она контекстно-свободная.
И большинство вменяемых случаев использования макросов чтения ничего в этом не меняют, ибо они выглядят как #P"/tmp/" или #U"http://www.linux.org.ur/", т.е. сначала #, потом некая буква и текст в кавычках. Учитывая существующие проблемы с ридер-макросами их используют исключительно редко, как самое крайнее средство.
Люди, которые используют макросы чтения иным образом, обычно уже очень далеко от нас, в своём мире, полном волшебства, тайн и тяжёлых наркотиков.
(влет разобрало твой пример) И грамматика лиспа все еще остается контекстно-свободной. Или я не прав?
В общем, пока вижу, что грамматика лиспа - КС-грамматика, макросы же лишь позволяют обвешивать исходную грамматика из трех нетерминалов, дополнительными правилами, тем не менее, не меняющими класс грамматики (1, КС).
Я не понял, каким образом твоя грамматика описывает синтаксис CL?
Где фигурные скобки из моего примера? Где перлоподобный синтаксис для интерполяции в строки? Где описываются токены, разделяемые точками?
Но это фигня еще. Вот зачем ты квадратные скобки в грамматику ввел? А если программа не использует RDNZL-синтаксис? Если квадратные скобки выливаются в ошибку вида «неизвестная переменная», являются ли они частью синтаксиса?
Видишь в чем дело, если подходить к этому вопросу последовательно, и со всей серьезностью, то выйдет что либо грамматики у CL нет вообще, либо она вот такая:
Пилять, я только сейчас понял, что «КЗ» --- это «контекстно-зависимая», а не «ка-три». Ненавижу аббревиатуры и свои шрифты.
По классификации Хомского грамматика лиспа вообще скорее регулярная, вида
program ::= expression
program ::= expression program
с возможностью добавлять регулярные правила для expression и произвольные --- для тех нетерминалов, что стоят в конце добавленных правил для expression. По умолчанию есть набор правил для разбора списков, символов, чисел, строк, pathnames и т.п. Например, список реализуется так:
Таким образом, грамматика мутабельная (что в классификации Хомского не учитывается), и её можно превратить хоть в произвольную (unrestricted), но парсер, естественно, придётся дописывать самому.
Не совсем. anonymous (который, очевидно, love5an) имеет в виду вот что. В CL (не в Lisp, а именно в CL) есть такая замечательная вещь, как *readtable*. Если её никто не трогает, то всё так, мы имеем КС-грамматику. Но... Любое приложение/библиотека на CL могу модифицировать эту *readtable* произвольным образом. В итоге, в результате синтаксис, который воспринимает стандартный риадер, может быть изменен вообще как угодно. Вменяемые разработчики этой возможность пользуются редко и очень аккуратно. Но, проблема в том, в мире CL много больных людей.
на своем регулярном описании и на любом из лиспов (или на моей грамматике). Разница на лице.
На чьём лице? Твой пример парсится такой грамматикой:
program ::= expression
program ::= expression program
# список
expression ::= '(' list-tail
list-tail ::= expression ')'
list-tail ::= expression list-tail
# символ
expression ::= '+'
# quote
expression ::= '\'' expression
# число
expression ::= '1'
expression ::= '2'
Разумеется, настоящие правила для символа и числа другие, особенно если учесть, что в лиспе могут быть символы вида «1+», но реализовано всё именно таким: ридер ест пробелы, смотрит на первый символ и вызывает функцию, ассоциированную с этим символом, которая работает с потоком, разбирая остальную часть регулярного правила. Результат функции отправляется на интепретирование/компиляцию. За подробностями --- во второй раздел hyperspec, в частности вот: http://www.lispworks.com/documentation/HyperSpec/Body/02_ad.htm, второй абзац.
>Твой пример парсится такой грамматикой:
Он-то парсится и регексом: .*
Но насколько хорошо?
Практически очевидно, что последовательность "(a b c ))" не является грамматически правильным выражением лиспа, если его грамматика (с readtable или без) максимум контекстно-свободная.
Но может быть грамматически правильной (в моем текущем видении) в рамках языка «лисп + некий dsl» (переопределенный ридер), однако это уже не совсем лисп, иначе придется признать что грамматика лиспа покрывает любой ЯП, в т.ч. - и любой ЕЯ; с другой же стороны очевидно, грамматика русского языка не есть грамматика лиспа. В общем, противоречие какое-то :)
Изначально меня интересует вопрос - есть ли в каком-либо из лиспов конструкции явно контекстно-зависимые? Ну, что-то вроде "( ) )"?
Возможно мне показалось, но создалось впечатление, что ты не понимаешь того, что макрос и ридер-макросы - это совершенно различные вещи, ничего общего между которыми нет.
иначе придется признать что грамматика лиспа покрывает любой ЯП
Ещё раз, модификация *readtable* позволяет запускать произвольный код на этапе чтения (именно чтения) кода и произвольным образом интерпретировать получающийся результат. Можно себе представить ридер, который будет способен читать текст на естественном языке и транслировать его в некую программу. Мало того, при небольшой доле фантазии можно представить ридер, который вообще решит, что надо бы активировать микрофон и начать интерпретировать голосовые команды. Т.е. ридер может делать вообще всё, что угодно.
Но подобное поведение находится далеко за пределами каких-либо формальных дисциплин и применять к нему понятие грамматики совершенно бессмысленно.
Никого не волнует, насколько редко или часто что там кем пользуется.
Само наличие reader-макросов, даже если бы ими вообще никто не пользовался(а это не так, если мы выйдем за пределы уютненького мирка краснодарских недоумков), делает все разговоры о синтаксисе CL бессмысленным.
>просто показать принцип работы rdnzl. Выше по треду почти такая же встречается.
Так являются ли квадратные скобки частью синтаксиса CL?
Тут вот - являются, в стандартном синтаксисе - ну, в принципе, тоже, но играют другую роль(такую же, как и обычные буквы).
С круглыми скобками абсолютно точно так же всё.
Говорить о каком-то одном синтаксисе CL - бессмысленно.
Мог бы расписать, но ты сам должен понимать - качественно от описания/опускания подобных моментов грамматика не изменится.
Да как раз изменится. С перлом точно, кстати, такая же интересная штука - для него (E)BNF или PEG составить нельзя.
А как же тогда выражение (+ ' 2 '1)) разбирается ???
Открывающая скобка это макро-литера, она активирует встроенную функцию считывания дерева из cons-ячеек из текстового потока. Для каждого элемента списка или дерева эта функция вызывает READ. Всё.
делает все разговоры о синтаксисе CL бессмысленным.
Такие понятия, как контекстно-свободная грамматика - являются математическими абстракциями, а не проявлениями объективной реальности. Мы же может только соотносить их каким-либо образом с явлениями реального мира, но при этом всегда понимаем, что с одной стороны абстракция, а с другой действительность и точного сопоставления никогда быть не может. Т.е. это самая абстракция всегда применяется в каком-то приближении, отражая выраженный идеальный случай. Прямолинейная же попытка провести однозначное соответствие между абстракцией и реальным миром всегда обречена на неудачу, что согласно вашей логике делает абстракции бесполезными, что, естественно, не так.
Является ли грамматика CL контекстно-свободной - да, в подавляющем большинстве случаев если рассматривать конкретное состояния образа. Тот факт, что грамматика, описывающая текущее состояние образа, может отличаться от грамматики, описывающей начальное состояние образа, никак этому не противоречит. В абстракции «контекстно-свободная грамматика» вообще нет такого понятия, как состояние образа, что вполне естественно, это же абстракция.
P.S. Перестань себя вести как мелкая шлюшка, у которой отобрали выручку за ночь.
Формальные языки это не какая-то воздушная математическая абстракция, и не какое-то там приближение. Это вполне конкретные понятия. Которые вполне конкретно применяются в компиляторах и просто парсерах.
Является ли грамматика CL контекстно-свободной - да
Ты вообще в курсе, что такое контекстно-свободная грамматика? Что такое грамматики формальных языков вообще? Нет. Ты вообще в CS не понимаешь ровным счетом ничего, и тем не менее, пиздишь.
Впрочем, это, конечно, хорошо, что ты показываешь на примере, что на CL тоже могут писать дебилы(в медицинском смысле этого слова).
Ну так вот, недоумок - возможность изменения правил разбора текста прямо в процессе его разбора делает разговоры о грамматике языка(или о синтаксисе, что одно и то же) бессмысленными. Филофизикам с IQ ниже среднего это осознать сложно, понятное дело, но так хоть читателей в заблуждение не вводи.
Извини, я не собираюсь объяснять дебилам то, что они понять просто физически не способы(если бы были способны - давно бы уже понял, благо информации в интернете на эту тему - куча).
> Ты вообще в CS не понимаешь ровным счетом ничего
Оставим в стороне, что знаю я. Давай лучше о тебе. У тебя есть замечательная манера утверждать что-то с видом что ты просто охренеть как в этом разбираешься. Ты же во всём разбираешься, начиная с философии (как мы недавно выяснили), интеллект же могучий, мда.
Так вот. Тут случайно обнаружил твой блок на Жуйке. И вижу, что ты с таким же видом эксперта совершенно категорично заявляешь, что RESTAS это переписанный Pylons, не строчка в строчку, но абсолютно тоже самое. Понимаешь, большего маразма придумать было нельзя. Сказать такое можно только будучи АБСОЛЮТНО не в теме. Но ты говоришь это совершенно категорично и делаешь вид, что прекрасно разбираешься в вопросе.
И так во всех твоих постах. Я пробежался по твоим постам на тему lisp и чуть не помер со смеху. Такого количества откровенной дезинформации я не ожидал. У тебя как будто филиал ЕР в интернете.
ты показываешь на примере, что на CL тоже могут писать дебилы
Отлично. Но меня давно мучает один вопрос. Как ты, такой умный, образованный и всё знающий человек, за столько лет дрочерства с CL, умудрился не написать ни одной программы? Вообще ничего сколько-нибудь полезного?
Извини, я не собираюсь объяснять дебилам
Ты бы сходил покурить что ли? А то такое впечатление, что у тебя заработок не за ночь, а за всю неделю отобрали.
Но формально это же не совсем лисп.
Образно выражаясь, от того, что для Си есть YACC/BISON (ну или Spirit для С++), еще не следует. что XML является частью синтаксиса Си/C++.
Вот собственно и путаница в ппонятиях - я рассуждаю о «костяке». вы с архимагом - обо всем, что можно подать на вход компилятора. да еще подозреваю - весьма конкретного.
Принимая вашу т.з. на понятие «синтаксиса» (все входы которые может обработать компилятор со всеми возможными его изменениями) - да, если у лиспа и имеется грамматика, то она самого общего вида. С моей т.з. на понятие «синтаксиса» (все входы, которые может обработать исходный компилятор) - грамматика довольно простая и конкретная. И подозреваю. что она все же контекстная - т.к. во всех известных мне реализациях есть переменные.
>Оставим в стороне, что знаю я. Давай лучше о тебе. У тебя есть замечательная манера утверждать что-то с видом что ты просто охренеть как в этом разбираешься. Ты же во всём разбираешься, начиная с философии (как мы недавно выяснили), интеллект же могучий, мда.
О, ну а ты то знаменитый философ у нас тут, да. Физика тебе, философии не противоречит, и никогда с ней не расходилась, и так далее. Да, до такой степени даже я дойти не могу, что бы там не употребив.
Так вот. Тут случайно обнаружил твой блок на Жуйке. И вижу, что ты с таким же видом эксперта совершенно категорично заявляешь, что RESTAS это переписанный Pylons, не строчка в строчку, но абсолютно тоже самое. Понимаешь, большего маразма придумать было нельзя. Сказать такое можно только будучи АБСОЛЮТНО не в теме. Но ты говоришь это совершенно категорично и делаешь вид, что прекрасно разбираешься в вопросе.
Давай, докажи обратное.
И так во всех твоих постах. Я пробежался по твоим постам на тему lisp и чуть не помер со смеху. Такого количества откровенной дезинформации я не ожидал. У тебя как будто филиал ЕР в интернете.
Опять пиздаболишь? Конкретику слабо предъявить, хуелософ?
Отлично. Но меня давно мучает один вопрос. Как ты, такой умный, образованный и всё знающий человек, за столько лет дрочерства с CL, умудрился не написать ни одной программы? Вообще ничего сколько-нибудь полезного?
Схуяли это блять, не умудрился написать? Вот ты как раз, я смотрю, полезного уж точно не написал нихуя. Парочка убогих сайтов, которые и на PHP то на коленке за полчаса можно наклепать, и то даже лучше выйдет.
Ты бы сходил покурить что ли? А то такое впечатление, что у тебя заработок не за ночь, а за всю неделю отобрали.
Обиделся, кисо? То, что ты дебил это факт. Просто, блять, факт.
>Но формально это же не совсем лисп.
Скобок круглых мало?
Работает на CL, значит - CL.
Образно выражаясь, от того, что для Си есть YACC/BISON (ну или Spirit для С++), еще не следует. что XML является частью синтаксиса Си/C++.
В сях lex, yacc и bison в состав стандартной библиотеки языка не входят. И на процесс работы компилятора никак не влияют, сравнение некорректно.
Вот собственно и путаница в ппонятиях - я рассуждаю о «костяке».
Моя т.з. на этот вопрос такова, что этого «костяка» нет. Даже т.н. «стандартный синтаксис» CL за таковой считать сложно(опять же, потому что может изменяться прямо в процессе парсинга).
В Scheme - другое дело. Для нее даже вон EBNF выше привели.
С моей т.з. на понятие «синтаксиса» (все входы, которые может обработать исходный компилятор) - грамматика довольно простая и конкретная.
Ты не учитываешь то, что правила обработки могут изменяться прямо в процессе работы компилятора.
Вот видишь, в этом ты весь. Ляпнешь какую-нибудь откровенную глупость, а потом ещё и начинаешь её доказывать оголтело. Пойди просто почитай, что такое и Pylons и что такое RESTAS. И не утверждай потом, что ты не пиздабол. Просто признайся в этом често. Хотя бы самому себе. Потому что все остальные итак это прекрасно знают.
Конкретику слабо предъявить
Да одну я тебе уже предъявил. Пойди сам себя почитай, когда дурь (который, ты вероятно наелся) у тебя из головы выйдет.
Схуяли это блять, не умудрился написать?
Я не знаю, вот сижу удивляюсь. Но ты ведь самую дурную мысль, которая тебе в голову приходит, сразу бежишь всему миру рассказать как новое достижение в прогрессе человечества. Если бы ты хоть что-нибудь написал, что бы оно где-нибудь да работало, то ты бы это так на весь интернет раструбил.
Вот ты как раз, я смотрю, полезного уж точно не написал нихуя
У меня бизнес-приложения на CL в двух организациях работают, а в PHP я думаю ты понимаешь не больше, чем в Pylons (ну т.е. ноль), так что не тебе судить, да?
То, что ты дебил это факт. Просто, блять, факт.
У нас в стране многие люди мат для связки слов используют, ибо нормально двух слов связать не могут. Ты же мат используешь там, где логически мысль связать не можешь. И поэтому мат у тебя буквально через слово. Прям настоящий полковник.
К слову, ридер вообще не обязан читать поток символов. Можно сделать ридер, который будет принимать звук с микрофона и транслировать в ту или иную форму в зависимости от тональности, например. Так что лунная соната - корректная программа на лиспе (на лиспе, не только на CL).