LINUX.ORG.RU

> Является ли грамматика Lisp КЗ-грамматикой?

Есть макросы - значит является.

anonymous
()

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

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

> Я бы сказал, что нет. Обычно у языков-мутантов этап, на котором проводятся всевозможные трансформации, рассматривается отдельно от непосредственно парсинга.

В CL вообще можно ридер в рантайме менять, так что является.

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

В КЗ-грамматиках под «контекстом» понимается синтаксический контекст.

О синтаксисе CL, по озвученной причине, мы вообще не можем сказать, какой бы там синтаксический контекст нам не дали.

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

> у CL нет грамматики

+100500

Лиспы — это аналог китайского языка среди ЯП: изучения языка сводится к изучению словаря.

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

Хуже! У китайского словарь таки фиксированный.

anonymous
()

Реквестирую ссылку на книгу или статью, в которой можно прочитать про K3-грамматику

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

Ридер-макро - это, конечно, отдельный рзговор. Но даже если он есть, то ответ все равно «нет, до тех пор пока сам себе жизнь не испортишь».

dmsh
()
Ответ на: комментарий от jtootf

Не, это не та разница, которую стоило бы учитывать :)

Очень общо выражаясь, там грамматика

<Program> ::= <LExpr> <Program> | <LExpr>
<LExpr> ::= '(' <List> ')'
<List> ::= atom <List> | <LExpr> <List> |
обвешанная кучей спецслучаев.

Или нет?

yaws
() автор топика
Ответ на: комментарий от yaws

> А как же тогда выражение (+ ' 2 '1)) разбирается

его разбирает ридер, который как уже было сказано может меняться во время исполнения программы.

Собственно, с помощью ридер макр делаются всякие #x, #(), #', #\ и прочие «литералы», которые в обычных языках являются частью грамматики.

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

> Ридер-макро - это, конечно, отдельный рзговор. Но даже если он есть, то ответ все равно «нет, до тех пор пока сам себе жизнь не испортишь».

Да является, потому что не исполняя код, нельзя понять его семантики.

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

если грамматику можно описать в рамках EBNF (кстати, забавно выглядит в русской раскладке), то она определённо контекстно-свободна. как бы оное описание ни выглядело

jtootf ★★★★★
()

Если не принимать во внимание ридер-макросы в CL, то она контекстно-свободная.

И большинство вменяемых случаев использования макросов чтения ничего в этом не меняют, ибо они выглядят как #P"/tmp/" или #U"http://www.linux.org.ur/", т.е. сначала #, потом некая буква и текст в кавычках. Учитывая существующие проблемы с ридер-макросами их используют исключительно редко, как самое крайнее средство.

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

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

Я и читал.

Но грамматики нет, есть только отдельные правила разбора отдельных литер, которые изменяются в любую сторону.

Например, вот. Это не перл, и это не новый диалект лиспа под .NET

[ShowDialog (let* ((*list-delimiter* #\,)
                   (width 150.0)
                   (window
                     (cast
                       [System.Windows.Markup.XamlReader.Parse
                         #?<<Window xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'
                                    Title="Hello, world!"
                                    SizeToContent='WidthAndHeight'
                                    ResizeMode='NoResize'
                                    WindowStyle='ToolWindow'>
                              <Button Content="Close"
                                      Margin='@{(list (/ width 3) (/ width 6))}'
                                      Width='${width}'
                                      Height='${(/ width 2.5)}'/>
                            </Window>>]
                       "Window")))
              [+Click (cast [%Content window] "Button")
                      (new "RoutedEventHandler"
                           (lambda (sender e)
                             (setf [%Handled e] t)
                             [Close (cast [%Parent (cast sender "Button")]
                                          "Window")]))]
              window)]

Это все тот же CL, при условии что мы заюзали cl-interpol и rdnzl

(eval-when (:compile-toplevel :load-toplevel :execute)
  (ql:quickload :rdnzl)
  (ql:quickload :cl-interpol))

(eval-when (:compile-toplevel :load-toplevel :execute)
  (use-package :cl-interpol)
  (use-package :rdnzl))

(import-assembly "mscorlib")
(import-assembly "System")
(import-assembly "System.Core")
(import-assembly "System.Xml")
(import-assembly "System.Xaml")
(import-assembly "WindowsBase")
(import-assembly "PresentationCore")
(import-assembly "PresentationFramework")

(use-namespace "System.Windows")
(use-namespace "System.Windows.Controls")

(enable-interpol-syntax)
(enable-rdnzl-syntax)

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

А вот этого товарисча лучше не слушать, он понятия грамматики и семантики то не различает.

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

Например, вот. Это не перл, и это не новый диалект лиспа под .NET

rdnzl? Добавляет по сути лишь парные квадратные скобки...

<Program> ::= <LExpr> <Program> | <LExpr>
<LExpr> ::= '(' <List> ')' | '[' <List> ']'
<List> ::= atom <List> | <LExpr> <List> |
(влет разобрало твой пример) И грамматика лиспа все еще остается контекстно-свободной. Или я не прав?

В общем, пока вижу, что грамматика лиспа - КС-грамматика, макросы же лишь позволяют обвешивать исходную грамматика из трех нетерминалов, дополнительными правилами, тем не менее, не меняющими класс грамматики (1, КС).

yaws
() автор топика
Ответ на: комментарий от yaws

Я не понял, каким образом твоя грамматика описывает синтаксис CL? Где фигурные скобки из моего примера? Где перлоподобный синтаксис для интерполяции в строки? Где описываются токены, разделяемые точками?

Но это фигня еще. Вот зачем ты квадратные скобки в грамматику ввел? А если программа не использует RDNZL-синтаксис? Если квадратные скобки выливаются в ошибку вида «неизвестная переменная», являются ли они частью синтаксиса?

Видишь в чем дело, если подходить к этому вопросу последовательно, и со всей серьезностью, то выйдет что либо грамматики у CL нет вообще, либо она вот такая:

<Program> ::= <Что-угодно>*

Что, в принципе, означает то же самое.

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

Пилять, я только сейчас понял, что «КЗ» --- это «контекстно-зависимая», а не «ка-три». Ненавижу аббревиатуры и свои шрифты.

По классификации Хомского грамматика лиспа вообще скорее регулярная, вида

program ::= expression
program ::= expression program

с возможностью добавлять регулярные правила для expression и произвольные --- для тех нетерминалов, что стоят в конце добавленных правил для expression. По умолчанию есть набор правил для разбора списков, символов, чисел, строк, pathnames и т.п. Например, список реализуется так:

expression ::= '(' list-tail
list-tail ::= expression ')'
list-tail ::= expression list-tail

Таким образом, грамматика мутабельная (что в классификации Хомского не учитывается), и её можно превратить хоть в произвольную (unrestricted), но парсер, естественно, придётся дописывать самому.

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

Прогони вот этот пример:
http://www.linux.org.ru/jump-message.jsp?msgid=5911169&cid=5912696

на своем регулярном описании и на любом из лиспов (или на моей грамматике). Разница на лице.

Вот зачем ты квадратные скобки в грамматику ввел?

просто показать принцип работы rdnzl. Выше по треду почти такая же встречается.

Где перлоподобный синтаксис для интерполяции в строки? Где описываются токены, разделяемые точками?


Мог бы расписать, но ты сам должен понимать - качественно от описания/опускания подобных моментов грамматика не изменится.

yaws
() автор топика
Ответ на: комментарий от anonymous

Вот так, все в мире уже изобретено до нас :)
// Года четыре назад сам думал про многоуровневость :)

yaws
() автор топика
Ответ на: комментарий от yaws

> Мог бы расписать

Не совсем. anonymous (который, очевидно, love5an) имеет в виду вот что. В CL (не в Lisp, а именно в CL) есть такая замечательная вещь, как *readtable*. Если её никто не трогает, то всё так, мы имеем КС-грамматику. Но... Любое приложение/библиотека на CL могу модифицировать эту *readtable* произвольным образом. В итоге, в результате синтаксис, который воспринимает стандартный риадер, может быть изменен вообще как угодно. Вменяемые разработчики этой возможность пользуются редко и очень аккуратно. Но, проблема в том, в мире CL много больных людей.

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

Прогони вот этот пример: Является ли грамматика Lisp КЗ-грамматикой? (комментарий)

на своем регулярном описании и на любом из лиспов (или на моей грамматике). Разница на лице.

На чьём лице? Твой пример парсится такой грамматикой:

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, второй абзац.

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

Кстати, чтобы распарсить код из поста http://www.linux.org.ru/jump-message.jsp?msgid=5911169&cid=5916285 достаточно добавить правило

[code] expression ::= '[' .NET-tail .NET-tail ::= .NET ']' [/code]

и описать грамматику того, что собственно можно написать в квадратных скобках, используя .NET в качестве начального символа.

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

>Твой пример парсится такой грамматикой:
Он-то парсится и регексом: .*
Но насколько хорошо?

Практически очевидно, что последовательность "(a b c ))" не является грамматически правильным выражением лиспа, если его грамматика (с readtable или без) максимум контекстно-свободная.

Но может быть грамматически правильной (в моем текущем видении) в рамках языка «лисп + некий dsl» (переопределенный ридер), однако это уже не совсем лисп, иначе придется признать что грамматика лиспа покрывает любой ЯП, в т.ч. - и любой ЕЯ; с другой же стороны очевидно, грамматика русского языка не есть грамматика лиспа. В общем, противоречие какое-то :)

Изначально меня интересует вопрос - есть ли в каком-либо из лиспов конструкции явно контекстно-зависимые? Ну, что-то вроде "( ) )"?

yaws
() автор топика
Ответ на: комментарий от yaws

> «лисп + некий dsl» (переопределенный ридер)

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

иначе придется признать что грамматика лиспа покрывает любой ЯП


Ещё раз, модификация *readtable* позволяет запускать произвольный код на этапе чтения (именно чтения) кода и произвольным образом интерпретировать получающийся результат. Можно себе представить ридер, который будет способен читать текст на естественном языке и транслировать его в некую программу. Мало того, при небольшой доле фантазии можно представить ридер, который вообще решит, что надо бы активировать микрофон и начать интерпретировать голосовые команды. Т.е. ридер может делать вообще всё, что угодно.

Но подобное поведение находится далеко за пределами каких-либо формальных дисциплин и применять к нему понятие грамматики совершенно бессмысленно.

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

Никого не волнует, насколько редко или часто что там кем пользуется.
Само наличие reader-макросов, даже если бы ими вообще никто не пользовался(а это не так, если мы выйдем за пределы уютненького мирка краснодарских недоумков), делает все разговоры о синтаксисе CL бессмысленным.

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

>просто показать принцип работы rdnzl. Выше по треду почти такая же встречается.
Так являются ли квадратные скобки частью синтаксиса CL?
Тут вот - являются, в стандартном синтаксисе - ну, в принципе, тоже, но играют другую роль(такую же, как и обычные буквы).
С круглыми скобками абсолютно точно так же всё.
Говорить о каком-то одном синтаксисе CL - бессмысленно.

Мог бы расписать, но ты сам должен понимать - качественно от описания/опускания подобных моментов грамматика не изменится.


Да как раз изменится. С перлом точно, кстати, такая же интересная штука - для него (E)BNF или PEG составить нельзя.

А как же тогда выражение (+ ' 2 '1)) разбирается ???


Открывающая скобка это макро-литера, она активирует встроенную функцию считывания дерева из cons-ячеек из текстового потока. Для каждого элемента списка или дерева эта функция вызывает READ. Всё.

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

> Само наличие reader-макросов

делает все разговоры о синтаксисе CL бессмысленным.


Такие понятия, как контекстно-свободная грамматика - являются математическими абстракциями, а не проявлениями объективной реальности. Мы же может только соотносить их каким-либо образом с явлениями реального мира, но при этом всегда понимаем, что с одной стороны абстракция, а с другой действительность и точного сопоставления никогда быть не может. Т.е. это самая абстракция всегда применяется в каком-то приближении, отражая выраженный идеальный случай. Прямолинейная же попытка провести однозначное соответствие между абстракцией и реальным миром всегда обречена на неудачу, что согласно вашей логике делает абстракции бесполезными, что, естественно, не так.

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

P.S. Перестань себя вести как мелкая шлюшка, у которой отобрали выручку за ночь.

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

Формальные языки это не какая-то воздушная математическая абстракция, и не какое-то там приближение. Это вполне конкретные понятия. Которые вполне конкретно применяются в компиляторах и просто парсерах.

Является ли грамматика CL контекстно-свободной - да


Ты вообще в курсе, что такое контекстно-свободная грамматика? Что такое грамматики формальных языков вообще? Нет. Ты вообще в CS не понимаешь ровным счетом ничего, и тем не менее, пиздишь.

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

Ну так вот, недоумок - возможность изменения правил разбора текста прямо в процессе его разбора делает разговоры о грамматике языка(или о синтаксисе, что одно и то же) бессмысленными. Филофизикам с IQ ниже среднего это осознать сложно, понятное дело, но так хоть читателей в заблуждение не вводи.

З.Ы: Рожа(что на юзерпике) так и просит кирпича.

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

> Формальные языки это не какая-то воздушная математическая абстракция,

и не какое-то там приближение. Это вполне конкретные понятия.


Расскажите, пожалуйста, чем же «конкретные понятия» (пацанские?) отличаются от математических абстракций?

Которые вполне конкретно применяются в компиляторах

и просто парсерах.



Конечно, ведь в этом вся суть абстракций, что их можно использовать (и используют!) для самых разных вещей.

Слушай, если ты с понятием абстракции разобраться не можешь, зачем ты вообще куда-то дальше лезешь?

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

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

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

> Ты вообще в CS не понимаешь ровным счетом ничего

Оставим в стороне, что знаю я. Давай лучше о тебе. У тебя есть замечательная манера утверждать что-то с видом что ты просто охренеть как в этом разбираешься. Ты же во всём разбираешься, начиная с философии (как мы недавно выяснили), интеллект же могучий, мда.

Так вот. Тут случайно обнаружил твой блок на Жуйке. И вижу, что ты с таким же видом эксперта совершенно категорично заявляешь, что RESTAS это переписанный Pylons, не строчка в строчку, но абсолютно тоже самое. Понимаешь, большего маразма придумать было нельзя. Сказать такое можно только будучи АБСОЛЮТНО не в теме. Но ты говоришь это совершенно категорично и делаешь вид, что прекрасно разбираешься в вопросе.

И так во всех твоих постах. Я пробежался по твоим постам на тему lisp и чуть не помер со смеху. Такого количества откровенной дезинформации я не ожидал. У тебя как будто филиал ЕР в интернете.

ты показываешь на примере, что на CL тоже могут писать дебилы


Отлично. Но меня давно мучает один вопрос. Как ты, такой умный, образованный и всё знающий человек, за столько лет дрочерства с CL, умудрился не написать ни одной программы? Вообще ничего сколько-нибудь полезного?

Извини, я не собираюсь объяснять дебилам


Ты бы сходил покурить что ли? А то такое впечатление, что у тебя заработок не за ночь, а за всю неделю отобрали.

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

Говорить о каком-то одном синтаксисе CL - бессмысленно.

Говорить о каком-то одном синтаксисе Лиспа. Лиспа. Лиспа - бессмысленно. (fix)

Ну почему? Во всех реализациях лиспов так или иначе имеются открывающая скобка, закрывающая скобка. понятие атома, списка

Короче, все укладывающается в эту банальность (костяк .если хотите)

<Program> ::= <LExpr> <Program> | <LExpr>
<LExpr> ::= '(' <List> ')'
<List> ::= atom <List> | <LExpr> <List> |
вот в его рамках можно задать такой макрос:
(defmacro enable-rdnzl-syntax ()
  `(eval-when (:compile-toplevel :load-toplevel :execute)
    (%enable-rdnzl-syntax)))
и ему подобные.

И обработать, используя данный макрос, исходный текст навроде этого:

[ShowDialog (let* ((*list-delimiter* #\,)
                   (width 150.0)
                   (window
                     (cast
                       [System.Windows.Markup.XamlReader.Parse
                         #?<<Window xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'
                                    Title="Hello, world!"
                                    SizeToContent='WidthAndHeight'
                                    ResizeMode='NoResize'
                                    WindowStyle='ToolWindow'>
                              <Button Content="Close"
                                      Margin='@{(list (/ width 3) (/ width 6))}'
                                      Width='${width}'
                                      Height='${(/ width 2.5)}'/>
                            </Window>>]
                       "Window")))
              [+Click (cast [%Content window] "Button")
                      (new "RoutedEventHandler"
                           (lambda (sender e)
                             (setf [%Handled e] t)
                             [Close (cast [%Parent (cast sender "Button")]
                                          "Window")]))]
              window)]

Но формально это же не совсем лисп. Образно выражаясь, от того, что для Си есть YACC/BISON (ну или Spirit для С++), еще не следует. что XML является частью синтаксиса Си/C++.

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

Принимая вашу т.з. на понятие «синтаксиса» (все входы которые может обработать компилятор со всеми возможными его изменениями) - да, если у лиспа и имеется грамматика, то она самого общего вида. С моей т.з. на понятие «синтаксиса» (все входы, которые может обработать исходный компилятор) - грамматика довольно простая и конкретная. И подозреваю. что она все же контекстная - т.к. во всех известных мне реализациях есть переменные.

yaws
() автор топика
Ответ на: комментарий от archimag

>Оставим в стороне, что знаю я. Давай лучше о тебе. У тебя есть замечательная манера утверждать что-то с видом что ты просто охренеть как в этом разбираешься. Ты же во всём разбираешься, начиная с философии (как мы недавно выяснили), интеллект же могучий, мда.

О, ну а ты то знаменитый философ у нас тут, да. Физика тебе, философии не противоречит, и никогда с ней не расходилась, и так далее. Да, до такой степени даже я дойти не могу, что бы там не употребив.

Так вот. Тут случайно обнаружил твой блок на Жуйке. И вижу, что ты с таким же видом эксперта совершенно категорично заявляешь, что RESTAS это переписанный Pylons, не строчка в строчку, но абсолютно тоже самое. Понимаешь, большего маразма придумать было нельзя. Сказать такое можно только будучи АБСОЛЮТНО не в теме. Но ты говоришь это совершенно категорично и делаешь вид, что прекрасно разбираешься в вопросе.


Давай, докажи обратное.

И так во всех твоих постах. Я пробежался по твоим постам на тему lisp и чуть не помер со смеху. Такого количества откровенной дезинформации я не ожидал. У тебя как будто филиал ЕР в интернете.


Опять пиздаболишь? Конкретику слабо предъявить, хуелософ?

Отлично. Но меня давно мучает один вопрос. Как ты, такой умный, образованный и всё знающий человек, за столько лет дрочерства с CL, умудрился не написать ни одной программы? Вообще ничего сколько-нибудь полезного?


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

Ты бы сходил покурить что ли? А то такое впечатление, что у тебя заработок не за ночь, а за всю неделю отобрали.


Обиделся, кисо? То, что ты дебил это факт. Просто, блять, факт.

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

>Но формально это же не совсем лисп.
Скобок круглых мало?
Работает на CL, значит - CL.

Образно выражаясь, от того, что для Си есть YACC/BISON (ну или Spirit для С++), еще не следует. что XML является частью синтаксиса Си/C++.


В сях lex, yacc и bison в состав стандартной библиотеки языка не входят. И на процесс работы компилятора никак не влияют, сравнение некорректно.

Вот собственно и путаница в ппонятиях - я рассуждаю о «костяке».


Моя т.з. на этот вопрос такова, что этого «костяка» нет. Даже т.н. «стандартный синтаксис» CL за таковой считать сложно(опять же, потому что может изменяться прямо в процессе парсинга).
В Scheme - другое дело. Для нее даже вон EBNF выше привели.

С моей т.з. на понятие «синтаксиса» (все входы, которые может обработать исходный компилятор) - грамматика довольно простая и конкретная.


Ты не учитываешь то, что правила обработки могут изменяться прямо в процессе работы компилятора.

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

> Давай, докажи обратное.

Вот видишь, в этом ты весь. Ляпнешь какую-нибудь откровенную глупость, а потом ещё и начинаешь её доказывать оголтело. Пойди просто почитай, что такое и Pylons и что такое RESTAS. И не утверждай потом, что ты не пиздабол. Просто признайся в этом често. Хотя бы самому себе. Потому что все остальные итак это прекрасно знают.

Конкретику слабо предъявить


Да одну я тебе уже предъявил. Пойди сам себя почитай, когда дурь (который, ты вероятно наелся) у тебя из головы выйдет.

Схуяли это блять, не умудрился написать?


Я не знаю, вот сижу удивляюсь. Но ты ведь самую дурную мысль, которая тебе в голову приходит, сразу бежишь всему миру рассказать как новое достижение в прогрессе человечества. Если бы ты хоть что-нибудь написал, что бы оно где-нибудь да работало, то ты бы это так на весь интернет раструбил.

Вот ты как раз, я смотрю, полезного уж точно не написал нихуя


У меня бизнес-приложения на CL в двух организациях работают, а в PHP я думаю ты понимаешь не больше, чем в Pylons (ну т.е. ноль), так что не тебе судить, да?

То, что ты дебил это факт. Просто, блять, факт.


У нас в стране многие люди мат для связки слов используют, ибо нормально двух слов связать не могут. Ты же мат используешь там, где логически мысль связать не можешь. И поэтому мат у тебя буквально через слово. Прям настоящий полковник.

archimag ★★★
()

К слову, ридер вообще не обязан читать поток символов. Можно сделать ридер, который будет принимать звук с микрофона и транслировать в ту или иную форму в зависимости от тональности, например. Так что лунная соната - корректная программа на лиспе (на лиспе, не только на CL).

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.