четверг, 27 мая 2010 г.

[prog.flame] Утренняя попытка прочесть статью о Lisp-е в журнале fprog #5

Утро, заварил чаю, просмотрел несколько новостей. Чтобы окончательно проснуться, решил глянуть на статью “Лисп — философия разработки” из пятого номера журнала Теория Практика Функционального Программирования. Дошел до абзаца:

Синтаксис этого языка — это единообразная префиксная нотация (S-выражения). Вот простейший пример Лисп-кода: (defun sum (a b) (+ a b)), эквивалентом которого в языке Алгол-семейства был бы function sum(a, b) { return a + b; }. Благодаря этому исходный код гомоморфен синтаксическому дереву, используемому компилятором. Языки, обладающие таким свойством, называются также гомоиконными языками.

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

На статью забил. Она явно написано лисперами для лисперов. Все остальные люди им пофиг. Впрочем, не пофиг. Программисты на других языках им нужны для организации эпических флеймов, в которых пара-тройка убежденных лисперов будут доказывать всему остальному миру, что Lisp не мертв.

17 комментариев:

Rigidus комментирует...

Лисп не мертв, подтверждаю :)
А что касается гомоморфности, вспоминается один из топиков на rsdn, где кто-то говорил, что программист умирает, когда перестает гуглить незнакомые слова. Чем гомоморфность хуже, например, полиморфизма? Тем что полиморфизм уже знаком, а гомоморфность - еще нет? Синдром первой освоенной технологии?

eao197 комментирует...

>Лисп не мертв, подтверждаю :)

Лисп -- это идея. Идеи не умирают :)

>Чем гомоморфность хуже, например, полиморфизма?

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

Quaker комментирует...

На статью забил.
А вот что было в конце статьи (стр. 158-160) - это ужас какой-то. Лисперы как прошлись по всем языкам: C, C++, Javscript, PHP, Python. Видите ли, им не нравится девиз языка Python "Батарейки в комплекте":
"Пакет, который попадает в стандартную библиотеку, стоит одной ногой в могиле". Затем попинали JavBeans, не забыв при этом бросить камни в сторону ООП. При этом всячески нахваливали протоколы в Лиспе (стр. 148). В общем, почитать вполне можно, пусть даже ради смеху :)

eao197 комментирует...

>В общем, почитать вполне можно,

Я бросил читать, когда в начале статьи авторы начали показывать во что раскрываются какие-то макросы. Мне, как далекому от Lisp-а человеку, это сильно не понравилось. Я и в исходном фрагменте мало что понимал, а тут на тебе, еще лиспа. Что, зачем, почему? Имхо, как-то по другому нужно было показывать достоинства языка. А так получилась статья опытных лисперов для начинающих лисперов.

>А вот что было в конце статьи (стр. 158-160) - это ужас какой-то.

Нужно будет почитать конец статьи.

Quaker комментирует...

Да и слово практика в названии журнала не совсем соответствует действительности. Яркий пример - статьи Душкина, которые носят скорее теоретический характер. А сегодня зашел в книжный магазин и в течение 20 минут внимательно просмотрел его книгу "Практика работы на языке Haskell". Вместо языка в основном описывались вспомогательные инструменты (компилятор, интерпретатор и т.д.). Причем описание было в стиле справочника, зачастую по 3-4 страницы описаний параметров запуска тех или иных инструментов. В нормальных книгах сначала идет постановка конкретной задачи, потом описание решения, затем может быть обсуждение этого решения (сравнения с аналогами, выявление достоинств и недостатков и т.д.). А здесь ничего - ни целей, ни конкретных задач, последовательное энциклопедическое описание отдельных частей. И это называется практикой? Большинство того, что написано в этой книге, либо вообще не должно присутствовать (описание ключей компилятора можно найти), либо должно быть включено в приложение. В этом вопросе очень хорошая позиция у Бертрана Мейера, который считает, что даже самому языку нужно уделять как можно меньше времени, а больше уделять внимания самим концепциям ООП. Про инструменты с среды даже и говорить не приходится - максимум десять страниц в тысячестраничной книге.

eao197 комментирует...

2Quaker: ну бывает так -- человек хочет рассказать что-то интересное, но не получается у него. Не его это дело. В смысле: художник не обязательно должен уметь писать стихи. Так и программист не обязательно будет хорошим писателем.

eao197 комментирует...

Прочитат заключительную часть статьи ("Заключение: с расширяемостью в уме"). Заявление, что Smalltalk вышел из Lisp-а -- это сильно, однако.

"Главным достижением ОО-подхода, по нашему мнению, является концепция интерфейса, т. е. спецификации полиморфного набора функций, необходимых для решения какой-то задачи." -- еще сильнее. Насколько я помню, интерфейсы -- это часть концепции Абстрактных Типов Данных. ООП является всего лишь одним из пользователей данной концепции. Другой пользователь АДТ -- это, например, стандартные алгоритмы в STL (foreach), которые могут работать с разными типами контейнеров и не только контейнеров. Корни же STL-я растут из Scheme-овской функциональной реализации.

Alex комментирует...

не к месту, наверное, но курс по Lisp во время учёбы в институте - одно из самых приятных воспоминаний.
В какой-то момент наступило озарение и всё стало очень красиво и приятно.
Про практическую сторону этих знаний говорить не приходится - это был muLisp/DOS, следы которого можно найти на Wikipedia.
единственное "но" - опыт самого разного программирования, включая языки/парадигмы и всё остальное в большинстве случаев помогают развитию программиста.

eao197: Я не думаю, что освоение Ruby и его использование "испортило" программы на C++, но практически уверен, что новые знания добавили что-то к общему результату. А? :-)

Alex комментирует...

P.S. Забыл подписаться на комментарии

eao197 комментирует...

2Alex: у нас в универе Lisp-а не было. Был Pascal, Assembler, FoxBase, Prolog, какой-то язык символьных вычислений. Это то, что нам читали. Сами мы изучали C, C++, SQL и еще чего-то там, что могли находить. На Lisp я позже пытался смотреть, но меня Lisp никогда не цеплял. Как и Smalltalk и Python. А вот Ruby чем-то зацепил.

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

Как-то так, хотя все аналогии ложны по определению :)

Alex комментирует...

Аналогии хорошие, попробовал их продолжить, но заносит совсем в другую степь. :-)
Надо действительно отталкиваться от практики - no silver bullet, нет ничего идеального.
"Каждый хрюшонок имеет право, всем должно быть хорошо" (c) Э. Успенский.
Где-то так.

eao197 комментирует...

>"Каждый хрюшонок имеет право, всем должно быть хорошо" (c) Э. Успенский.

Да тут все проще :)
Не нужно притягивать красивые идиомы из одного языка в другой. Например, не очень здорово в C++ вводить общий базовый класс Object, и требовать, чтобы все наследовались от него. Хотя в Java это прекрасно работает. Не нужно в Java пытаться использовать generic-и, как шаблоны в C++. Не нужно в Ruby пытаться имитировать статическую типизацию. А в C++ не следует увлекаться динамической типизацией. И т.д. Куча мелкий вещей из-за которых оказавается, что знание Ruby не сильно помогает программировать на C++ :)

Quaker комментирует...

На Lisp я позже пытался смотреть, но меня Lisp никогда не цеплял. Как и Smalltalk и Python.
А я сейчас буду пытаться разбираться со Smalltalk. Заинтриговал меня этот язык.

eao197 комментирует...

А я сейчас буду пытаться разбираться со Smalltalk.

Удачи! :)

[DiMa] комментирует...

Журнал сам по себе - странный. Уже пятый выпуск - пролистываю и на этом все заканчивается. И уж Лиспом бы точно не заинтересовался после его прочтения.

[DiMa] комментирует...

И ещё - сообщество "функциональщиков" у нас элитарно-агрессивное - ИМХО :)
По лиспу есть же хорошая книга PCL - как раз таки простая и вполне конкретная.

eao197 комментирует...

2DM: у меня есть впечатление, что в fprog сейчас очень низкие требования к статьям. Фактически, написал человек статью по своему разумению, ее (может быть) как-то между собой обсудили и, за неимением альтернатив, опубликовали.

А следовало бы очень жестко относиться к статьям. Чтобы они были интересны, в первую очередь, не самим функциональщикам, а просто интересующимся. Соответственно, должны быть иные требования как к содержанию статьи, так и к ее стилю.

Что до агрессивности -- так это да, феномен. Интересно, только в русскоязычных странах он проявляется или вообще :) И, надо сказать, лисперы здесь еще не самые оголтелые (за исключением Луговского).