Критика принимается, спасибо. Обработка ошибок у меня тут и в самом деле похожа на замок от честных людей. Про то, что получился вариант с возвратом — тоже верно, сканим до парной скобки, а потом надо этот фрагмент сканить по новой, и так будут получаться вложенные циклы — тоже да. Правда при текущих скоростях компьютеров и при том, что таким способом можно парсить только что-то очень простое (соответственно, входные данные будут не слишком длинными) проседание производительности будет незаметным (хотя и неоптимально, да).
Самое, конечно, главное уточнение — что LL(...) и рекурсивный спуск — это не одно и то же. Мне они представлялись почти синонимами, а это не так.
Спасибо. Я так понимаю, вы имеете в виду то, что описано в статье «Функциональные парсеры». Но там, во-первых, все примеры на Gofer (как я понял, примерно то же самое, что Haskell), а во-вторых, это уже продвинутый уровень. Но есть ощущение, что это именно то направление, куда надо двигаться после освоения базовых принципов.
Спасибо, заглянул одним глазом. Честно говоря, не показалось, что сильно проще, чем Dragon book, но повеяло таким духом 70-х годов прошлого века ) Впрочем, я сильно внимательно не вчитывался, возможно, она и в самом деле понятнее.
Да, у вас классический рекурсивный спуск. Для каждого нетерминального символа создается процедура, которая его разбирает.
Насчет «стоило ли» колхозить «пузырьковый вычислитель» — думаю, что все же да, стоило. Потому что задача — проиллюстрировать концепцию LR-разбора, чтобы увидеть, как это — когда разбор происходит на вершине стэка. И чтобы потом более серьезные статьи и книги по теме было легче понимать.
На Go писать не довелось, но как код выглядит — нравится. Очень лаконично, особенно если сравнивать с Java.
Вау, место для философских дискуссий. Меня вот тоже в компьютерной науке больше интересует не та часть, котороая про О большое и оптимизацию алгоритмов, а та, которая про лингвистику. И я тоже, как и автор, искренне считаю, что назначение ЯП — это помочь выразить программисту то, что он хочет от компьютера в краткой и понятной форме. Другое дело, у меня есть стойкое ощущение, что процесс построения ЯП не формализуется, и математику сюда тащить бесполезно. То есть процесс создания дизайна ЯП — это творческий процесс, сродни сочинению музыки (мне так кажется).
Очень важная концепция — то, что в лингвистике называется гипотезой Сепира-Уорфа, она примерно состоит в том, что язык, которым мы пользуемся, является инструментом для мышления, и сама его структура оказывает влияние на то, что мы в принципе можем подумать. Многие программисты знают это на опыте (попробуйте на Haskell написать что-нибудь, если до этого писали только на процедурных, если не верите).
Ну а на практике, мне кажется, постепенно будет все двигаться в сторону языково-ориентированного программирования, то есть конструирования DSL под конкретную область, и дальше оно там может прижиться, как SQL, или там постепенно приживаться (как XML, который потом довольно скоро переизобрели как JSON).
Алан Кей очень умный. Но те вещи, о которых он тут говорит, требуют достаточно долгой работы, чтобы достичь того уровня, когда они начинают доходить до сознания. Благо, что путь открыт и все это можно изучать постепенно: начать с основ (архитектура фон Неймана и расширение понятия «энтропия» на информационный план, что придумал Шеннон), затем понять принцип Тьюринг-полноты (как так получается, что на любом Тьюринг-полном языке можно реализовать любой другой Тьюринг-полный язык) и увидеть схожесть этого принципа с диагональным аргументом Кантора, а потом изучить то, что сделал Джон Маккарти (изобрел функцию eval, которой на вход можно подавать программный код, и это был по сути первый интерпретатор Лиспа), и увидеть, насколько сильно наличие такой функции увеличивает семантическую выразительность языка (по мнению Пола Грэма, эссе которого «Побеждая посредственность» хорошо бы регулярно перечитывать, наличие eval в языке превращает его в диалект Лиспа и после этого он может быть использован как конструктор для разных других DSL, что мы и видим в практике).
Вот это вот и есть настоящая компьютерная наука. А не «какие аннотации в Spring для чего используются». Спасибо, что переводите такие посты.
Причем к этому можно прийти чисто путем логики. Мир — это твой дом. Ты — его часть. Ты же у себя дома поддерживаешь порядок и чистоту, чинишь вещи, а не ломаешь их. Вот и с миром надо точно так же.
Нет, многие всё равно думают, что главное нахапать себе всего побольше, а там хоть трава не расти.
Каждый студент сейчас должен уметь использовать основные монады: IO, Maybe, [] (список), Either. Это позволит ему найти работу в будущем и избавить экономику от перекосов и дефицита кадров.
Насколько я могу вспомнить, все нормальные введения в тему функционального программирования начинаются с показа функций map, filter и reduce.
Про javascript еще всегда интересны статьи на тему «Почему в javascript есть функция eval, откуда она там взялась, зачем она там нужна, и почему такой функции нету в императивных языках вроде Pascal и Java».
Еще версия — Василий Иванович Чапаев и Николай Второй (которого на самом деле не расстреляли) делают операцию Котовскому, которого зацепила белогвардейская пуля. На переднем плане — Петька, который должен внедриться к белым со шпионской миссией, поэтому так и одет )
Выскажу свое ИМХО тоже, как человек, который лет 5 проработал в бизнес-центрах со стеклянными фасадами, как раз в Санкт-Петербурге. При том, что стеклянные фасады иногда смотрятся эффектно, у них есть еще один колоссальный недостаток — в солнечную погоду, особенно летом, здание превращается в теплицу. И поэтому в нем необходимо обязательно устраивать систему принудительной приточной вентиляции и кондиционирования. При этом хоть из кожи вон лезь, воздух внутри здания получается хуже, чем если открыть окна и проветривать (кондиционеры гоняют воздух, в нем циркулирует пыль, вирусы — поэтому заболеваемость выше, воздуховоды надо по-хорошему чистить, менять фильтры, и все такое прочее). И все равно летом в жару кондиционеры не справляются нормально с охлаждением, им банально не хватает мощности.Окна при этом считается, что открывать нельзя, потому что тогда «кондиционеры будут охлаждать город».
Так что у меня сформировалось мнение, что по микроклимату самое хорошее — это «сталинская» архитектура — толстые стены из камня, высокие потолки, естественная вентиляция. Кондиционеры при этом могут быть установлены, но большой нужды в них нету. Но, конечно, вам (Лахта-центру) менять проект из-за моего комментария уже поздно :)
Как-то стремно писать статью в таком месте, где можно потерять возможность ее редактировать. Вот сотрутся куки в браузере, и все, привет, кнопка «Edit» исчезла. А ведь при работе с текстом автор обычно пишет что-нибудь, потом возвращается к написанному, дописывает, редактирует, правит, меняет формулировки, работает над стилем. И в таком месте, где возможность редактирования можно на раз потерять, лично я статью даже не начинал бы писать.
Хотя бы ссылок было два вида, например так:
http://telegra.ph/Cool-story-about-11-24 — обычная
http://telegra.ph/Cool-story-about-11-24?cookie=uiou3o42o3i4ujkldsfjk — для редактирования.
Плюс один вам. Когда видишь такие цифры, то первая реакция «аааа, ужас, 128 человек!». А потом посмотришь, вторая группа больше первой примерно в 4 раза, ну и умерло тоже больше примерно в 4 раза. Мне иногда начинает казаться, что за таким употреблением цифр стоит сознательная попытка манипуляции.
Оно надувное что ли, а не монолитное? Тогда антипрокол можно туда залить, как велосипедисты иногда делают. Не знаю, насколько помогает от проколов, но вроде и не мешает.
Да, все так. Там автор сразу пишет, что это программа не для промышленного использования, в ней есть утечки памяти, и написана она была исключительно с целью поразбираться, как вообще работает интерпретатор лиспа. И мне кажется, что ценность его примера именно в том, что интерпретатор лиспа он реализует на C (ну или на C++), а это (по авторитетному мнению Пола Грэма), две различающиеся парадигмы вообще подхода к машинным вычислениям. Если «подход Си» идет от архитектуры вычислительных машин (архитектуры фон Неймана), то «подход лисп» идет, видимо, от математических построений, когда оказывается, что можно определить несколько примитивных функций в ядре языка (те, что перечислены в комментарии выше — cons, car, cdr и пр.), и из них построить функцию eval. Пол Грэм об этом интересно писал в своих эссе, кажется, «The roots of LISP».
И в дополнение к статье Норвига еще одна статья, где автор пишет интерпретатор лиспа по мотивам Норвига, но не на Питоне, а на Си. Между прочим, там уточняется не совсем очевидный вопрос — как сделать лямбды, когда в языке реализации интерпретатора (Си) их нет. Вот ссылка:
http://howtowriteaprogram.blogspot.ru/2010/11/lisp-interpreter-in-90-lines-of-c.html
Хуже того, это не только «сюжет для фильма в жанре «техногенный апокалипсис»», а ситуация, которая уже происходила в истории, и не поручусь, что сейчас где-то что-то подобное не происходит или не будет происходить. Именно о ситуации «программа принимает решения за людей, которые не понимают, как она работает» Вейценбаум писал в своей (очень, кстати, поучительной) книжке:
Чтобы дополнить поучительную историю, рассказанную Моррисоном, нет нужды обращаться к системам, которые появятся в будущем. Во время войны США с Вьетнамом вычислительные машины, используемые офицерами, не имевшими ни малейшего понятия о том, что происходит внутри этих машин, фактически определяли, какие деревни должны подвергнуться бомбардировке и в каких зонах концентрация вьетконговцев достаточна для того, чтобы «имелись основания» объявить их «зонами стрельбы без предупреждения», т. е. в обширных географических районах летчики наделялись «правом» убивать любое живое существо.
Самое, конечно, главное уточнение — что LL(...) и рекурсивный спуск — это не одно и то же. Мне они представлялись почти синонимами, а это не так.
Насчет «стоило ли» колхозить «пузырьковый вычислитель» — думаю, что все же да, стоило. Потому что задача — проиллюстрировать концепцию LR-разбора, чтобы увидеть, как это — когда разбор происходит на вершине стэка. И чтобы потом более серьезные статьи и книги по теме было легче понимать.
На Go писать не довелось, но как код выглядит — нравится. Очень лаконично, особенно если сравнивать с Java.
Очень важная концепция — то, что в лингвистике называется гипотезой Сепира-Уорфа, она примерно состоит в том, что язык, которым мы пользуемся, является инструментом для мышления, и сама его структура оказывает влияние на то, что мы в принципе можем подумать. Многие программисты знают это на опыте (попробуйте на Haskell написать что-нибудь, если до этого писали только на процедурных, если не верите).
Ну а на практике, мне кажется, постепенно будет все двигаться в сторону языково-ориентированного программирования, то есть конструирования DSL под конкретную область, и дальше оно там может прижиться, как SQL, или там постепенно приживаться (как XML, который потом довольно скоро переизобрели как JSON).
Вот это вот и есть настоящая компьютерная наука. А не «какие аннотации в Spring для чего используются». Спасибо, что переводите такие посты.
Нет, многие всё равно думают, что главное нахапать себе всего побольше, а там хоть трава не расти.
Каждый студент сейчас должен уметь использовать основные монады: IO, Maybe, [] (список), Either. Это позволит ему найти работу в будущем и избавить экономику от перекосов и дефицита кадров.
Про javascript еще всегда интересны статьи на тему «Почему в javascript есть функция eval, откуда она там взялась, зачем она там нужна, и почему такой функции нету в императивных языках вроде Pascal и Java».
Так что у меня сформировалось мнение, что по микроклимату самое хорошее — это «сталинская» архитектура — толстые стены из камня, высокие потолки, естественная вентиляция. Кондиционеры при этом могут быть установлены, но большой нужды в них нету. Но, конечно, вам (Лахта-центру) менять проект из-за моего комментария уже поздно :)
Хотя бы ссылок было два вида, например так:
http://telegra.ph/Cool-story-about-11-24 — обычная
http://telegra.ph/Cool-story-about-11-24?cookie=uiou3o42o3i4ujkldsfjk — для редактирования.
А так… не очень понимаю, зачем оно надо такое.
http://howtowriteaprogram.blogspot.ru/2010/11/lisp-interpreter-in-90-lines-of-c.html
Чтобы дополнить поучительную историю, рассказанную Моррисоном, нет нужды обращаться к системам, которые появятся в будущем. Во время войны США с Вьетнамом вычислительные машины, используемые офицерами, не имевшими ни малейшего понятия о том, что происходит внутри этих машин, фактически определяли, какие деревни должны подвергнуться бомбардировке и в каких зонах концентрация вьетконговцев достаточна для того, чтобы «имелись основания» объявить их «зонами стрельбы без предупреждения», т. е. в обширных географических районах летчики наделялись «правом» убивать любое живое существо.