www.blogspot.com
alexott-ru
Alex Ott's Russian blog about IT-related things
1	http://feedproxy.google.com/~r/alexott-ru/~3/iUPrFymQI9g/clojure-programming.html	Готовится перевод "Clojure Programming"	2013-01-11T10:40:17.995+01:00	tag: clojure endoftag tag: book endoftag 	Издательство "ДМК-Пресс" продолжает серию переводов книг про новые языки программирования, и следующая вещь в списке - "Clojure Programming". Перевод уже начался, и они ищут людей которые помогут с технической вычиткой перевода.  Если кому-то интересно, то пишите на dm at dmk-press.ru.
2	http://feedproxy.google.com/~r/alexott-ru/~3/ccikJJAC-Dg/blog-post.html	Переводы книжек на тему ФП...	2012-12-07T08:19:10.408+01:00	tag: fp endoftag tag: book endoftag 	Я регулярно общаюсь с издательством ДМК-Пресс, которое в последнее время занимается изданием переводов книг по функциональному программированию и языкам ФП. В данный момент они занимаются переводом "Scala for Impatient" и им нужны люди которые бы могли сделать техническую вычитку. Если кому интересно, то напишите Дмитрию Мовчану на dm at dmk-press.ru - я сам не знаю как это дело будет организовано... Они также заинтересованы в издании перевода Practical Common Lisp, который находится в подвешенном состоянии уже давно (надо доперевести 1.5 главы и пройтись по тексту, вычитывая).  Издательство приобрело права на издание книги в России, и обещает напечатать книгу по себестоимости. Если кто может принять участие в этом проекте, напишите мне, я выдам .git-репозиторий с текстом в формате LaTeX (или залить это дело на github?). У меня честно говоря совсем нет свободного времени довести PCL до ума.  Update: PCL залит на github, кто хочет поучавствовать - присылайте свои login names, я добавлю к проекту. Координация и обсуждения происходят в списке рассылки
3	http://feedproxy.google.com/~r/alexott-ru/~3/fCnoDM6VmQc/cedet.html	Новая версия статьи про CEDET	2012-10-30T19:39:42.455+01:00	tag: c++ endoftag tag: java endoftag tag: emacs endoftag tag: article endoftag tag: cedet endoftag 	Только что залил на сайт новую версию своей статьи про настройку CEDET. Я также оставил доступной старую версию статьи, но в виде отдельной страницы. Новая версия описывает новую схему расположения исходного кода, а также новый способ активации под-режимов, так что статья теперь применима и к версии из bzr, и к версии идущей в составе GNU Emacs (после того как выпустят новую его версию). Кроме того, я добавил небольшое описание того, как настроить связку CEDET + Java, а также небольшое описание настройки дополнений через auto-complete.  Вместо моего конфига, который очень уж сильно замусорен, теперь лучше воспользоваться отдельным конфигом.  P.S. кстати, в последних снапшотах, CEDET умеет находить проекты Maven, и получать информацию о classpath прямо из них, так что теперь работает и дополнение имен для классов из сторонних библиотек.  Например, вот так (Это дополнение при работе с кодом Apache Tika):   P.P.S. If you found error, or typo - please write comment on page, or fork source code on github (it's enough to fix only .muse file), and create pull request :-)
4	http://feedproxy.google.com/~r/alexott-ru/~3/tP5liUfCgz0/clojure-itsea-2012.html	Выступление про Clojure на ITSea 2012	2012-09-26T16:13:59.801+01:00	tag: presentations endoftag tag: fp endoftag tag: conference endoftag tag: clojure endoftag 	На прошлой неделе я рассказывал про Clojure на небольшой конференции ITSea (совмещенной с купанием в море и т.п. :-), и затем еще давал небольшой мастер-класс на тему практического использования Clojure. Слайды доступны на slideshare (а вот записи выступления к сожалению не было):  Данный постинг является дополнением к этим слайдам, и содержит ссылки на разные ресурсы, упоминавшиеся в рассказе:  Сайт языка Список доступных книг про Clojure (разделы про конкретные языки в обзоре литературы по ФП) Введение в Clojure на русском языке  Список видео-лекций и презентаций про Clojure Planet Clojure - аггрегатор блогов Getting started with Clojure - описание первых шагов, включая установку и настройку средств разработки  Интерактивные ресурсы/учебники: 4Clojure, TryClojure, Himera, labrepl Списки рассылки: clojure, clojure-russian  IDE/редактора (остальные редактора/IDE описаны в подразделах Getting Started): Eclipse, IntelliJ IDEA Средства сборки: поддержка Clojure в Maven, Leiningen  Библиотеки/фреймворки:  Web: Ring, Compojure, Noir, Hiccup, lein-ring, ClojureScript, ClojureScript One, lein-cljsbuild SQL: Korma, clojure.java.jdbc NoSQL: Monger (MongoDB), Clutch (CouchDB), clojure-hbase-schemas (HBase) GUI: Seesaw  core.logic Contrib libraries   Внутреннее устройство persistent коллекций: вектора, отображения (maps)  
5	http://feedproxy.google.com/~r/alexott-ru/~3/fdAD6IoLY0E/gnu-emacs-241.html	Вышел GNU Emacs 24.1!	2012-06-10T17:05:57.242+01:00	___	После длительной разработки, была выпущена новая версия GNU Emacs - 24.1. Среди основных изменений в данной версии можно отметить следующие:  система пакетов, которая позволяет скачивать и устанавливать пакеты из внешних источников - как официальных, так и сторонних поддержка отображения и редактирования текстов на языках, где текст пишется справа-налево  поддержка lexical scoping в Emacs Lisp улучшения в системе дополнений (completion) - большинство пакетов теперь используют одинаковый метод показа дополнений встроенная поддержка тем оформления  улучшения в интеграции с внешними библиотеками - GTK+3, ImageMagic, GNU TLS, etc.  Более подробную информацию можно найти в поставке GNU Emacs (файл etc/NEWS) и в статьях, перечисленных на странице wikemacs.
6	http://feedproxy.google.com/~r/alexott-ru/~3/hhAm4CR2-RY/natural-language-processing.html	Впечатления о курсе "Natural Language Processing"	2012-06-03T17:22:47.425+01:00	tag: education endoftag tag: NLP endoftag 	Продолжая традицию постоянного обучения, я не смог не пройти мимо еще одного из курсов предлагаемых Coursera. После курсов прошедших прошлой осенью, у меня осталось очень хорошее впечатление о них. Среди большого набора новых курсов я выбрал курс Natural Language Processing (NLP) - та тема, которая меня давно интересовала. А на этой неделе я наконец-то получил сертификат об окончании этого курса, и решил написать по свежим следам... Курс длится 8 недель и преподается двумя известными специлистами в этой области - Dan Jurafsky &amp; Christopher Manning (оба из университета Stanford). В качестве основы для курса взяты две книги: Speech &amp; Language Processing, 2ed и Introduction to Information Retrieval (можно найти и онлайн-версии обоих книг - в виде последних снапшотов перед отравкой в издательство). Так получилось, что обе книги у меня уже были достаточно давно, но все не доходили руки сесть за их чтение. Хочется отметить, что читать книги все-таки требовалось, чтобы лучше понять то, что объяснялось в лекциях. Каждую неделю необходимо было прослушать примерно 2 часа лекций, ответить на набор вопросов, и выполнить домашнее задание (в виде программы). В качестве языка программирования можно было использовать Java или Python - каждую неделю публиковалось новое задание, которое содержало заготовку кода, куда надо было вписать свое решение. Одним из отличий от осенних курсов было то, что на выполнение заданий отводилось больше времени - две недели (эти сроки иногда увеличивались - в зависимости от сложности задания и технических проблем). Первые три недели были достаточно простыми - разбирали использование регулярных выражений для NLP, моделирование языков, spell correction и классификацию текстов с помощью Naive Bayes - задания выполнялись достаточно быстро. А вот недели 4-6 были достаточно сложными - рассматривались maximum entropy модели, вычленение именованных объектов и отношений между ними, part of speech tagging, а также вероятностный парсинг текста.  5-е и 6-е задания были самыми сложными в этом курсе (стоит отметить, что много народу просто пропустило 6-ю домашнюю работу) - необходимо было уметь программировать на достаточно хорошем уровне. Но зато было очень интересно смотреть как твоя программа выдает корректную структуру даже для очень сложных предложений с правильно присвоенными частями речи. 7-е задание было очень легким - надо было запрограммировать индексирование текста и вычисление tf-idf. А вот 8-е, хоть и казалось несложным, но требовало достаточно много времени для доводки регулярных выражений, которые должны были извлекать кусочки информации из входных данных. Времени к сожалению было не особо много, так что я сдал первый работающий вариант, за который получил около 70% от макс. оценки. В итоге, после прохождения всего курса, я набрал 93% от макс. кол-ва баллов. Также вспомнил/научился как программировать на питоне - языке на котором я писал очень редко, а в основном читал код. И даже применил новые знание на практике, соорудив категоризатор текста на базе HBase/Clojure/Hadoop в виде эксперементального модуля для нашего продукта.  Так что если вам интересны вопросы information retrieval/natural language processing - я очень рекомендую этот курс - он дает очень хорошее представление об этих областях и формирует основу для дальнейшего изучения. 
7	http://feedproxy.google.com/~r/alexott-ru/~3/uo9FaANDZRI/clojure-14.html	Clojure 1.4!	2012-04-15T18:46:33.292+01:00	tag: fp endoftag tag: clojure endoftag 	А между тем, незаметно подкрался релиз новой версии языка Clojure - 1.4. Rich Hickey называет этот релиз в основном maintenance, хотя есть и достаточно крупные изменения: Расширяемая процедура чтения (reader) - разработчик может указать функцию чтения для своих типов данных. Разработчик должен указать метку для своего типа данных, и соответствующую функцию чтения, и данная функция будет вызвана после того, как следующая (после метки) форма будет считана стандартным reader. Например, можно будет писать вот так: #foo/bar [1 2 3] - в этом случае, после чтения метки, процедура чтения сначала считает форму [1 2 3], а затем вызовет процедуру связанную с данной меткой (если она определена) и передаст ей прочитанные данные. В состав новой версии вошла поддержка чтения двух новых типов - #inst - для времени и даты, и #uuid - для UUID.   Новый синтаксис для доступа к полям записей (унифицировано с ClojureScript) - теперь можно писать (.-field_name record-instance). Возможность контролировать поведение компилятора Clojure с помощью опций, указанных через переменную *compiler-options*. Остальные изменения включают в себя добавление новых функций в базовую библиотеку, достаточно много исправлений ошибки, оптимизации производительности.  Полный список изменений можно найти в репозитории. Кроме того, может быть интересным интервью Rich Hickey в котором он рассказывает про некоторые изменения в новой версии.
8	http://feedproxy.google.com/~r/alexott-ru/~3/60CdHTxkalc/blog-post_31.html	Итоги года...	2011-12-31T16:27:24.668+01:00	___	Сейчас самое подвести итоги уходящего года, и посмотреть вперед - 2011-й год был достаточно насыщеным, свободного времени практически не было....  получил повышение до Principal разработчика, что добавило задач, но проекты были интересными, и будут новые достаточно много ездил - в другие страны (англия, голландия, канарские острова) и в германии (по рейну, в Кельн на карнавал, и т.д.) накатал 2000км на велосипеде, хотя это меньше чем я планировал достаточно много "книжных" проектов - работал с Manning над "Mahout in Action" &amp; "Tika in Action", наконец-то вышел перевод TaPL в его окончательном варианте в части open source активность была не особо высокой - обычно в виде небольших патчей для разных проектов для статей тоже не особо много времени находилось - написал только статью про TDD &amp; Unit testing in C++, и вместе с Дмитрием Бушенко, написали небольшое пособие про Emacs, которое мы планируем в следующем году значительно расширить информацией про CEDET/Semantic для Java и т.п. много читал, в основном техническую литературу учился в двух стенфордских классах, что доставило очень большое удовольствие и позволило многому научиться  В следующем году продолжу разбираться с темами, которые мне интересны - machine learning, natural language processing (в том числе возьму и стенфордский класс на эту тему), постараюсь больше писать на разные темы, и более активно учавствовать в open source проектах. И проехать 3000км на велосипеде (надо только его проапгрейдить до шоссейника)... И хочу поздравить всех моих читателей с Новым, 2012-м годом - пусть он будет успешным и интересным для вас!
9	http://feedproxy.google.com/~r/alexott-ru/~3/KBrX8wxWv2E/blog-post.html	Про Стэнфордские курсы...	2011-12-23T20:14:12.988+01:00	tag: AI endoftag tag: ML endoftag tag: NLP endoftag 	Я как и многие мои знакомые, учавствовал в экспериментальных учебных курсах предложенных Стэнфордским университетом. В виду патологической жадности любви к учебе, записался сразу на два курса Artificial Intelligence (AI) &amp; Machine Leaning (ML), оба на advanced track, что предполагало делание домашних заданий в дополнение к вопросам в ходе лекций. Вчера я получил свой сертификат для AI - 89%, чему я с одной стороны рад, поскольку я смог это сделать, с другой стороны - корю себя за невнимательность и несобранность - было сделано достаточно много глупых ошибок. Сертификат по ML скорее всего придет на той неделе. Я собирался написать про свои впечатления об обоих курсах, но Lev Walkin меня опередил отличных постом в своем журнале. Мои впечатления полностью совпадают с тем, что он написал - возможность получения немедленного feedback на ML-курсе, позволила гораздо лучше запомнить материал по сравнению с тем что давали на AI. Но стоит отметить, что AI тоже не прошел даром - обзорные лекции по разным темам дали возможность на них посмотреть чуть ближе, и понять что из них будет интересно и применимо. Оба курса были также хорошей возможностью чуть лучше сконцентрироваться на определенных темах, поскольку домашние работы надо было выполнять в срок. Плюс это дало возможность наконец-то почитать давно купленные книги, например, Artificial Intelligence: A Modern Approach (у меня 2-е, русское издание), купленное много лет назад, и иногда доставаемое с полки для чтения какой-то главы :-)  А в конце января, начнется новая серия курсов, я скорее всего возьму только один - Natural Language Processing (так что я достану из загашников еще пару книжек :-), хотя хочется взять половину из новых курсов, даже 2 курса одновременно - это достаточно затратно по времени, так что буду надеяться что все курсы будут оставаться в открытом доступе и в дальнейшем (по крайней мере, курс по ML будет повторен и в новом семестре).
10	http://feedproxy.google.com/~r/alexott-ru/~3/PNoslRayl08/tapl.html	Перевод TaPL в продаже	2011-11-28T10:20:59.153+01:00	tag: fp endoftag tag: book endoftag 	Для заинтересованных - перевод TaPL можно уже купить. findbook показывает что можно заказать через goodreads.ru, books.ru имеет книгу в каталоге, но она помечена как "нет в продаже"... Судя по информаци из juick, в Москве можно купить в обычных книжных магазинах: "В москве продаётся как минимум в МДК (на арбате и в техкниге), в Москве (на тверской), и в библиоглобусе. Дешевле всего (за 1100р) можно купить в МЦНМО (mccme.ru). туда лучше заранее позвонить, ибо много книг хранить они не могут"...P.S. а озон почему-то выставил безумную цену в 2 с лишним тысячи, поэтому они идут лесом :-)  Update: Алексей Махоткин написал пост, где собрал список всех известных магазинов и других способов покупки книги...
11	http://feedproxy.google.com/~r/alexott-ru/~3/drnFsGh6c-E/blog-post_22.html	Еще книжное...	2011-10-22T14:12:12.330+01:00	tag: book endoftag 	Осень выдается достаточно результативной на книги, к которым я имею отношение в той или иной мере... Кроме релиза про перевод Types &amp; programming languages, про который я писал вчера, сегодня я получил свой экземпляр книги Mahout in Action, в издании которой я принимал участие в качестве technical proofreader. В том же качестве я поработал и над книгой Tika in Action, которая должна выйти в ближайшее время. А началось все с того, что люди из Manning предложили мне сделать review для нескольких книг, часть из которых я уже купил как MEAP, а потом предложили сделать и technical proofreading - проверить примеры, формулы и т.п., что и было с удовольствием сделано - все равно я собирался читать эту книгу, а тут такая возможность :-)   Mahout in Action - интересная книга, если вы интересуетесь machine learning, особенно в large scale. В книжке почти нет теории, но в ней подробно описывается как использовать Apache Mahout для классификации и кластеризации данных, а также рекомендаций (для товаров и т.п.). В книге описаны только основные алгоритмы, в самом Mahout их гораздо больше, и все больше добавляется с каждым релизом. В электронной версии (в PDF) есть мультимедийные вставки, с помощью которых рассказывают или показывают про сложные места - интересно сделано. На амазоне, печатная книга стоит дешевле чем у Manning'а, но у Manning'а вместе с печатной версией дают и электронную - это у них стандартные условия, плюс регулярно бывают 40-50% скидки - если кому интересно. Все примеры были протестированы на Mahout версии 0.5 (актуальный релиз), но я планирую в ближайшее время сделать их совместимыми со следующим релизом - 0.6 - там совсем небольшое изменение...  P.S. будет еще несколько книг, но уже на русском, но я пока не знаю еще точных сроков выхода, но обязательно напишу :-)
12	http://feedproxy.google.com/~r/alexott-ru/~3/g5yO-ea0G60/blog-post.html	Книга "Типы в языках программирования"	2011-10-21T11:59:09.132+01:00	tag: fp endoftag tag: book endoftag 	Из достоверных источников стало известно, что книга "Типы в языках программирования" (перевод известной "Types and Programming Languages") вышла в бумажном виде, и это не миф :-) Пока правда неизвестно где ее можно купить, но вы можете связаться с Алексеем Махоткиным (aka squadette) и узнать об этом.  Я тоже напишу когда она будет доступна в магазинах. Также доступна полная электронная версия книги, она совпадает с печатной версией. Меньшего формата не будет (пока?), поскольку там есть проблемы с таблицами и листингами, но вы можете попытаться переверстать, благо исходные тексты также доступны. Эта книга труд многих людей - Юра Бронников сделал львинную часть перевода, Алексей Махоткин сделал огромную работу по вычитке и редактированию, а Вадим Родионов так красиво и правильно все сверстал. Кроме того, много людей читало промежуточные версии перевода и присылало замечания и пожелания - всем спасибо!
13	http://feedproxy.google.com/~r/alexott-ru/~3/r7zO2YbxDkg/clojure-13.html	Что нового в Clojure 1.3?	2011-09-24T16:14:07.297+01:00	tag: fp endoftag tag: clojure endoftag 	Сегодня ночью была выпущена новая версия языка Clojure &mdash; 1.3.  Что нового в этой версии? Давайте рассмотрим основные изменения сделанные в этой версии (детальный список изменений можно найти в соответствующей ветке репозитория).Расширенная поддержка примитивных типовВ предыдущих версиях, примитивные типы (long, double, etc.) поддерживались только для локальных арифметических операций и при объявлении полей deftype/defrecord, но не для аргументов функций и не для возвращаемых значений.  Boxing выполнялся всегда, что часто приводило к ощутимым накладным расходам.В новой версии примитивные типы поддерживаются в полной мере, что приводит к значительному увеличению производительности кода (в соответствующих тестах, в среднем в 3-5 раз).  Соответственно изменилась работа с арифметическими выражениями &mdash; для примитивных типов будут использоваться стандартные операторы Java.  Но при этом не будет происходит автоматического превращения в "Big*" типы при переполнении, как это происходило раньше &mdash; вместо этого будет брошено исключение.  Если вам все-таки нужно автоматическая конвертация, то вы можете использовать операторы +', *', и т.д., хотя они и более медленные.  Битовые операции теперь только поддерживаются для примитивных типов, и вся их поддержка для "Big*" была убрана из языка.Для использования примитивных типов вам необходимо добавить соответствующие type hints, например:(defn fib ^long [^long n]     (if (&lt;= n 1)         1         (+ (fib (dec n)) (fib (- n 2))))) Более подробно обо всем этом на соответствующей странице JIRA.Улучшения defrecord и deftypeВ версии 1.3 были сделаны различные улучшения для работы с  defrecord и deftype:новый синтаксис для чтения и записи &mdash; либо с метками (#myns.MyRecord{:a 1, :b 2} &mdash; только для записей), либо позиционный (#myns.MyRecord[1 2] &mdash; для записей и типов); автоматическая генерация функций для создания типов и записей: myns/map-&gt;MyRecord (только для записей) и myns/-&gt;MyRecord (для записей и типов).Подробнее можно прочитать вот тут.Reflection APIВведено новое пространство имен clojure.reflect, функции которого должны обеспечить более удобную и быструю работу с классами, методами и т.д.  Подробнее об этом тут.Модульный clojure-contribНачиная с версии 1.3, больше не существует монолитного набора библиотек известного как clojure-contrib &mdash; вместо этого, были созданы отдельные проекты для каждой из библиотек, что позволяет им развиваться и выпускаться независимо друг от друга. Полный список всех старых библиотек, и соответствующих им новых, можно найти на отдельной странице.Множественные улучшения производительностиКроме улучшений в части производительности, описанных выше, в новом релизе сделано множество изменений чтобы обеспечить более высокую скорость работы программ на Clojure:Более быстрый доступ к переменным; Ускорение загрузки Promises не используют блокировок (locks); Инлайнинг nil?, битовых функций, математических операций, функций min &amp; max с разным числом аргументов; и многое другое...ПрочееПомимо новой функциональности описанной выше, а также различных исправлений ошибок, в новой версии реализованы новые вещи (перечислены не все):Некоторые вспомогательные пространства имен (clojure.set, clojure.xml, clojure.zip) не загружаются при запуске; Объявления сделанные с помощью def более не являются "динамическими" по умолчанию &mdash; вы должны использовать ^:dynamic если хотите иметь возможность использования ее в binding; Улучшенные сообщения об ошибках и исключениях; Можно вызвать deref с указанием таймаута; Функция comp возвращает identity если вызвана без параметров; Возможность указания разных возвращаемых типов в объявлениях одной функции с разными количествами аргументов; Некоторые функции перемещены в другие пространства имен;
14	http://feedproxy.google.com/~r/alexott-ru/~3/24yBtW8Mg9Q/learn-you-haskell-for-great-good.html	Перевод " Learn You a Haskell for Great Good!"	2011-09-19T10:12:57.397+01:00	tag: fp endoftag tag: haskell endoftag tag: book endoftag 	BTW, планируется выпуск русского перевода "Learn You a Haskell for Great Good!" в виде бумажной книги. Переводом занимается Yasir Arsanukaev, и работа над переводом ведется на bitbucket - кто может, присоединяйтесь к вычитке перевода! :-)  P.S. Из достоверных источников стало известно, что книжка уже на этапе верстки, так что недолго ждать осталось :-)
15	http://feedproxy.google.com/~r/alexott-ru/~3/Zr-Gx7IeLLU/practical-common-lisp.html	Опрос: название для русской версии Practical Common Lisp	2011-07-01T12:05:50.477+01:00	tag: lisp endoftag tag: fp endoftag tag: book endoftag 	В процессе причесывания русского перевода Practical Common Lisp, выползла проблема того, как книжка должна называться на русском языке. Пока вариантов немного, и некоторые звучат не особо :-( Поэтому хочу попросить помощи у сообщества - какой из переводов вам больше нравится (или можете предложить свой) - пишите номера или сови предложения в комментариях: Practical Common Lisp - оставить оригинальное название (будет плохо искаться в поиске, имхо) (ru '(Practical Common Lisp)) - вариант catap'а Практика Common Lisp Common Lisp на практике Практический Common Lisp  Практический Lisp 
16	http://feedproxy.google.com/~r/alexott-ru/~3/wQe0vjXOWjY/blog-post.html	Небольшой книжный обзор	2011-05-15T10:45:11.049+01:00	tag: fp endoftag tag: file formats endoftag tag: common-lisp endoftag tag: f# endoftag tag: book endoftag 	Давно не писал в блог, даже собирался как-то продолжить свою серию обзоров книг, прочитанных за последние два месяца, но со временем полный завал - релизы на работе, плюс дополнительные проекты, поэтому писать про книги буду реже... Так что рецензии на уже прочитанные книги, и то, что я буду дальше читать, можно найти на Goodreads. Вкратце  о разных книгахЗа мартовский отпуск дочитал давно лежащую в очереди "The art of meta-object protocol" - книжка дает понимание как проектировался CLOS, как были выбраны те или иные решения, и т.д. В апреле в достаточно быстром темпе (они предложили сделать ревью) прочитал две книги издательства Manning: Tika in Action и ManifoldCF in Action. Первая была не особо интересной для меня, поскольку я в этой области работаю уже давно, да и tika знаю достаточно хорошо, но я думаю, что книжка все равно будет интересна для людей, которым нужно выделять текст и мета-информацию из файлов разных форматов.  А вот вторая книга была более интересной - я ее купил когда она еще только была анонсирована, но руки не доходили ее прочитать.  Книга описывает ManifoldCF - расширяемый фреймворк для работы с разными content repositories, откуда можно извлекать информацию для индексирования и прочей обработки. Фреймворк очень интересный, и я надеюсь его запользовать в одном из своих проектов. Функциональное программирование на F#Также в апреле мне попала на руки книга Дмитрия Сошникова Функциональное программирование на F# (спасибо издательству ДМК-Пресс за предоставленный файл), и я ее неспешно прочитал... Книга чисто практическая, начинается с примеров, и все остальное вводится по мере повествования. Это же является и ее недостатком - нет подробностей о лямбда-исчислении и синтаксисе языка - для этого требуется обратиться к другим источникам, типа перевода курса лекций Джона Хариссона, и переводу орейлевской книги про F#, которая вышла в издательстве "Символ-Плюс" (я ее правда не читал в переводе).  Описываются все основные приемы программирования - функциональный, императивный и объектно-ориентированный. Достаточно хорошо описаны расширения языка типа активных паттернов, async, etc.   Ну и стоит отдельно упоминуть 7-ю главу, которая содержит примеры решения задач в различных областях - "научное" программирование, графика, программирование для Windows Phone 7, веб-программирование, включая использование F# с ASP.Net, работу с веб-сервисами и т.п. Я думаю, что книга может быть полезна студентам и начинающим программистам для использования в качестве сборника примеров решения задач. А затем, если язык заинтересует, то можно переходить и к другим книгам...
17	http://feedproxy.google.com/~r/alexott-ru/~3/KVp1ubWLYB8/blog-post_13.html	Новый номер журнала «Практика функционального программирования»	2011-04-13T13:23:31.500+01:00	tag: fp endoftag 	Вышел свежий (7-й) номер журнала «Практика функционального программирования». В новом номере вы можете прочитать следующие статьи: Язык РЕФАЛ &mdash; взгляд со стороны. Бойко Банчев расскажет о сущности, истории и современном состоянии языка РЕФАЛ. Circumflex &mdash; веб-фреймворк на Scala comme il faut. Александр Темерев даст урок использования этого &laquo;обезжиренного&raquo; и гибкого веб-фреймворка, написанного на Scala. Разработка алгоритма обнаружения движения в среде программирования Mathematica. Вадим Залива расскажет об опыте прототипирования такого алгоритма при разработке iPhone-приложения iSentry. Как написать LDAP-сервер на Erlang и Как написать LDAP-сервер на Си. Максим Сохацкий и Олег Смирнов обменяются любезностями со Львом Валкиным: Максим и Олег похвалят Erlang за то, что на нем можно за 20 минут написать LDAP-сервер, а Лев докажет, что дело тут вовсе не в Erlang. Продолжения в практике. Алексей Вознюк расскажет об использовании продолжений для упрятывания асинхронности кода за обыкновенным &laquo;последовательным&raquo; синтаксисом. Суперкомпиляция: идеи и методы. Илья Ключников, расскажет о суперкомпиляции, построив поразительно компактный и понятный суперкомпилятор простого языка, и покажет, что она применима не только для удивительно мощной оптимизации многих классов программ, но имеет и другие неожиданные применения.Кроме электронной версии, этот номер доступен и в печатном виде!Обсудить статьи вы можете в fprog@ЖЖ.
18	http://feedproxy.google.com/~r/alexott-ru/~3/NnwGEZzkiDk/monad-tutorial.html	Monad tutorial для кложуры	2011-04-07T09:40:33.551+01:00	tag: fp endoftag tag: clojure endoftag 	Серия слайдкастов про монады на примере Clojure сделанный Brian Marick.  Первая лекция начинается со следующей фразы "Существует предсказание, что когда-то, каждый человек на земле сделает monad tutorial, и высшая цель вселенной будет достигнута, и все человечество попадет в рай..." :-)
19	http://feedproxy.google.com/~r/alexott-ru/~3/fT5mHej1wc8/blog-post.html	Реклама в журнале "Практика функционального программирования"	2011-04-05T10:43:14.663+01:00	___	Может быть это заинтересует кого-то из моих читателей - вы можете разместить свои вакансии (или другую рекламу) в журнале "Практика функционального программирования". Преимуществом такой рекламы является достаточно большая аудитория разработчиков ПО, которые, как мне кажется, имеют хороший уровень образования. Подробности тут
20	http://feedproxy.google.com/~r/alexott-ru/~3/ERuel1unKrQ/2011.html	Дайджест прочитанных книг. Январь 2011	2011-02-09T19:08:02.980+01:00	tag: fp endoftag tag: 2011 endoftag tag: apache camel endoftag tag: DSL endoftag tag: clojure endoftag tag: testing endoftag tag: scala endoftag tag: book endoftag 	Как вы наверное уже заметили, в прошлом месяце не было обзора литературы &mdash; было слишком много дел, поэтому никакой книги я читать не закончил.  Но зато рождественские и новогодние праздники позволили прочитать больше книг.DSLs in Action Camel in Action Test-driven development: By ExampleDSLs in ActionДавно собирался почитать что-то про domain specific languages (DSL) чтобы найти новые идеи, сравнить с тем что я сам делаю (у меня есть несколько DSL, которые я применяю в рабочих проектах), может быть улучшить свои решения.  Мой выбор пал на DSLs in Action, написанную Debasish Ghosh, который является достаточно известным разработчиком в Scala сообществе, хотя использует и другие языки, например, Haskell, Groovy, Clojure.  Когда я выбирал что почитать, я также смотрел в сторону книги Domain-Specific Languages, написанную Martin Fowler, но Manning прислал очередную партию скидок, и я купил книгу у них (и не пожалел).Книга написана очень простым языком, но при этом дается материал очень высокого качества. Автор показывает различные приемы разработки DSL используя разные языки &mdash; Ruby, Groovy, Scala, Clojure (в книге используются только языки, работающие только на JVM, и многие вещи применимы только к этой платформе).  Это позволяет показать разные подходы к проектированию и реализации DSL (есть также статья в блоге автора о том, почему использовались разные языки).Первая часть книги посвящена основам DSL &mdash; автор начинает рассказ с описания что такое DSL, из чего они состоят, какие бывают виды DSL, как они выполняются, преимущества и недостатки использования DSL в ваших проектах.  Отдельно описывается то, как моделируются предметные области, и как они влияют на структуру DSL.Вторая глава демонстрирует простой DSL, который реализован с помощью стандартной Java, и анализируются недостатки конкретного подхода.  Затем, аналогичный DSL создается с помощью Groovy, и рассматриваются его преимущества по сравнению с первой реализаций.  В остальной части главы рассматриваются паттерны реализации DSL, с учетом предыдущей информации.Третья глава посвящена вопросам интеграции DSL в основной проект.  В ней обсуждаются java scripting engine, интеграция на базе Spring, и т.д.  Для каждого из возможных подходов, рассматриваются преимущества и недостатки данного подхода, то, как он может повлиять на реализацию DSL, и т.д.Вторая часть (главы 4-8) посвящены реализации DSL на конкретных языках программирования. 4-я глава описывает основные приемы реализации внедряемых (internal) DSL &mdash; мета-программирование, типизированные абстракции, генерацию кода во время компиляции и т.д.  И следующие две главы (5 и 6), подробно показывают как эти абстракции применяются при реализации DSL на Ruby, Groovy, Clojure и Scala.Седьмая глава продолжает тему реализации DSL, но уже с точки зрения использования внешних (external) DSL.  Рассматриваются разные виды парсеров, с помощью которых можно разбирать код использующий DSL, показывается небольшой пример использования ANTLR для генерации парсеров, и приводится небольшое описание Xtext &mdash; фреймворка для Eclipse, который упрощает разработку внешних DSL.В восьмой главе продолжается тематика использования внешних DSL и в ней показывается применение комбинаторов парсеров для разбора исходного кода DSL.  Глава начинается с небольшого описания того, что такое комбинаторы парсеров, а затем показывается пример использования комбинаторов парсеров в Scala для работы с внешними DSL.И в заключительной части книги рассматриваются текущие тенденции в части разработки и использования DSL, утилит для упрощения разработки, и сопутствующие темы.Кроме основного материала, в книге имеется несколько приложений, в которых собраны краткие описания используемых языков, что позволяет ознакомиться с примерами даже тем людям, которые не программируют на конкретных языках.  Отдельно стоит упомянуть "философское" приложение A, которое посвящено обсуждению роли абстракций в моделировании предметной области, влиянию чистоты, отсутствия побочных эффектов на разработку, и сопутствующим проблемам. Кроме этого, может быть интересным приложение B, где обсуждается роль мета-программирования в разработке DSL.Заключение: если вы используете и/или разрабатываете DSL, или вам просто интересна эта тема, то книгу обязательно стоит прочитать &mdash; в ней много практической информации, которая будет полезна при разработке DSL.Camel in ActionДля очередного из "домашних" проектов понадобилось слепить систему обработки данных из разных источников, поэтому погуглив, я нашел Apache Camel, который показался мне интересным и достаточно зрелым проектом, а на очередной маннинговской распродаже я прикупил книжку Camel in Action авторства Claus Ibsen и Jonathan Anstey.Книга начинается (глава 1) с объяснения что такое Apache Camel, какие задачи он решает и из чего он состоит.  Во второй главе более подробно рассматриваются маршруты (routes) и показывается как можно их создавать используя код на Java или Spring.Вторая часть книги полностью посвящена базовым вопросам разработки с использованием Camel, показывается как преобразовывать данные, обрабатывать ошибки, тестировать код, и использовать дополнительные компоненты, такие как JMS, базы данных и т.д.А третья часть посвящена таким вопросам как использование транзакций, организация конкурентной обработки данных, а также вопросам мониторинга и деплоймента проектов.Отдельная глава (11-я) описывает организацию процесса разработки с использованием Camel, включая разработку новых компонентов и адаптеров.  Кроме этого, на примере DSL для Scala, показывается как использовать Camel с другими языками (хотя на мой взгляд проект scalaz-camel выглядит более интересным).Заключение: если вы заинтересованы в применении Apache Camel, то книжку стоит прочитать &mdash; она может служить как хорошим введением в данную систему, так и достаточно подробным руководством по основным компонентам.P.S. Для Clojure также начата работа по созданию библиотеки для интеграции с Apache Camel. Проект называется Hackamore и находится в начальной стадии разработки.  Если вам это интересно, то вы можете присоединиться к обсуждению в специально созданном списке рассылки.Test-driven development: By ExampleНедавно я готовил презентацию для внутреннего семинара о test driven development (TDD), и решил прочитать что-то от основоположников этого движения.  Серию Extreme Programming я читал много лет назад, сразу после ее выхода, поэтому взгляд остановился на книге Test Driven Development: By Example Кента Бека.Книжка небольшая &mdash; чуть больше 200 страниц, но и этот объем является слишком большим для данной темы &mdash; автор взял одну проблему, и подробно разбирает процесс ее реализации, который управляется тестами, которые создаются по мере добавления новых требований.  На протяжении первой части книги, с помощью данного примера иллюстрируются основы TDD и Unit testing.Во второй части, применение TDD иллюстрируются описанием процесса реализации xUnit-подобного фреймворка для тестирования кода на Python, начиная с определения основной функциональности фреймворка, и затем, последовательной реализацией кода.В третьей части рассматриваются основные приемы и паттерны использования TDD, проектирования кода для тестирования, разработки тестов и т.д.Заключение: хорошее введение в TDD, но стоит прочитать только для людей кто никогда с ним не сталкивался &mdash; слишком уж начального уровня. Хотя иногда попадаются полезные советы по организации кода, неплохое описание рабочего процесса и т.п.  Если вы уже хоть как-то применяли тесты в своей работе, то можно найти более короткий источник нужной информации.
21	http://feedproxy.google.com/~r/alexott-ru/~3/UvTKUHWWc28/clojure.html	Типы и протоколы в Clojure	2011-02-04T15:30:27.471+01:00	tag: fp endoftag tag: clojure endoftag tag: article endoftag 	Эта заметка также опубликована как часть статьи "Введение в Clojure"... Одно из самых больших изменений в Clojure версии 1.2 &mdash; введение в язык новых артефактов: протоколов (protocols) и типов  данных (datatypes).  Данные изменения позволяют улучшить производительность программ по сравнению с мультиметодами, что в будущем даст возможность написать Clojure на Clojure (в данный момент протоколы и типы данных уже активно используются при реализации Clojure).Что это такое и зачем нужно?Определение протоколовРеализация протоколовОпределение типов данныхdeftype &amp; defrecordreifyДополнительные функции и макросыДополнительная информацияЧто это такое и зачем нужно?Протоколы и типы данных &mdash; два связанных друг с другом понятия.  Протоколы используются для определения полиморфных функций, которые затем могут быть реализованы для конкретных типов данных (в том числе и из других библиотек).Существует несколько причин введения протоколов и типов данных в новую версию языка:Увеличить скорость работы полиморфных функций, при этом поддерживая большую часть функциональности мультиметодов, поскольку для протоколов диспатчеризация выполняется только по типу данных; Использовать лучшие стороны интерфейсов (только спецификация функций, без реализации, реализация нескольких интерфейсов одним типом), в тоже время избегая недостатков (список реализуемых интерфейсов задан во время реализации типа данных, создание иерархии типов вида isa/instanceof); Избежать Expression problem и дать возможность расширять набор операций над типами данных без изменениях определения типов данных (в том числе и чужих) и перекомпиляции исходного кода1; Использовать высокоуровневые абстракции для типов данных и операций над ними2, что упрощает проектирование программ. Также как и интерфейсы, протоколы позволяют объединить объявление нескольких полиморфных функций (или одной функции) в один объект3.  Отличием от интерфейсов является то, что вы не можете унаследовать новый протокол от существующего протокола.В отличии от имеющегося в Clojure gen-interface (и соответствующих proxy/gen-class) определение протоколов и типов не требует AOT (ahead-of-time) компиляции исходного кода, что упрощает распространение программ на Clojure.  Однако при определении протокола, Clojure автоматически создает соответствующий интерфейс, который будет доступен для кода, написанного на Java.Типы данных, определенные с помощью deftype или defrecord позволяют программисту на Clojure определять свои структуры данных, вместо использования обычных отображений и структур, но об этом ниже.Важно помнить, что протоколы и типы данных с одним и тем же именем могут быть определены в разных пространствах имен, так что стоит быть осторожным и не наделать ошибок при импорте определений и последующей реализации протоколов!Определение протоколовПротоколом называется именованный набор функций с определенными сигнатурами.  Для определения используется макрос, применение которого выглядит следующим образом:(defprotocol &#1085;&#1072;&#1079;&#1074;&#1072;&#1085;&#1080;&#1077; "&#1086;&#1087;&#1080;&#1089;&#1072;&#1085;&#1080;&#1077;" &amp; &#1089;&#1080;&#1075;&#1085;&#1072;&#1090;&#1091;&#1088;&#1099;) название &mdash; единственный обязательный параметр, хотя определение протокола без функций не имеет особого смысла.  В описании вы можете описать ваш протокол, и это описание будет показываться при вызове функции doc для вашего протокола.  Для протокола вы можете указать одну или несколько сигнатур функций, где каждая сигнатура выглядит следующим образом:(&#1080;&#1084;&#1103; [&#1072;&#1088;&#1075;&#1091;&#1084;&#1077;&#1085;&#1090;&#1099;+]+ "&#1086;&#1087;&#1080;&#1089;&#1072;&#1085;&#1080;&#1077;") Вы можете определять одну функцию, которая будет принимать различное количество параметров, но первым аргументом функции всегда является объект, на основании которого будет выполняться диспатчеризация, и к которому эта функция будет применяться.  Вы можете рассматривать его как this в Java и C++.  В дополнение к сигнатурам, вы можете описать вашу функцию, но это необязательно.Давайте посмотрим на стандартный пример:(defprotocol AProtocol   "A doc string for AProtocol abstraction"   (bar [a b] "bar docs")   (baz [a] [a b] [a b c] "baz docs")) Данный протокол определяет две функции: bar &mdash; с двумя параметрами, и baz &mdash; с одним, двумя или тремя параметрами.defprotocol также создаст соответствующий интерфейс, с тем же самым именем что и протокол. Данный интерфейс будет иметь те же самые функции, что и протокол.Реализация протоколовПротокол сам по себе ни на что не влияет &mdash; чтобы использовать его, мы должны добавить его специализации для типов данных или классов JVM.  Для этого может использоваться функция extend, использование которой выглядит следующим образом:(extend &#1090;&#1080;&#1087;-&#1080;&#1083;&#1080;-&#1082;&#1083;&#1072;&#1089;&#1089;   &#1087;&#1088;&#1086;&#1090;&#1086;&#1082;&#1086;&#1083;-1    {:&#1084;&#1077;&#1090;&#1086;&#1076;-1 &#1091;&#1078;&#1077;-&#1086;&#1087;&#1088;&#1077;&#1076;&#1077;&#1083;&#1077;&#1085;&#1085;&#1072;&#1103;-&#1092;&#1091;&#1085;&#1082;&#1094;&#1080;&#1103;     :&#1084;&#1077;&#1090;&#1086;&#1076;-2 (fn [a b] ...)     :&#1084;&#1077;&#1090;&#1086;&#1076;-3 (fn ([a]...) ([a b] ...)...)}   &#1087;&#1088;&#1086;&#1090;&#1086;&#1082;&#1086;&#1083;-2     {...} ...) Для этой функции вы указываете имя типа данных или класса (или nil), и передаете список состоящий из названий протоколов (протокол-1 и т.д.) и отображений, которые связывают функции протокола (метод-1 и т.д.) с их реализациями &mdash; анонимными или именованными функциями.Стоит отметить, что функция extend является низкоуровневым инструментом реализации протоколов.  Кроме этого, в состав языка введены макросы extend-protocol &amp; extend-type, которые немного упрощают реализацию протоколов4.  Протокол также может быть реализован непосредственно при объявлении типа данных.Использование extend-type выглядит практически также как и использование extend, но пользователь записывает реализации в более удобном виде (extend-type раскрывается в соответствующий вызов extend):(extend-type &#1090;&#1080;&#1087;-&#1080;&#1083;&#1080;-&#1082;&#1083;&#1072;&#1089;&#1089;   &#1087;&#1088;&#1086;&#1090;&#1086;&#1082;&#1086;&#1083;-1     (&#1084;&#1077;&#1090;&#1086;&#1076;-2 [a b] ...)     (&#1084;&#1077;&#1090;&#1086;&#1076;-3 ([a]...)              ([a b] ...)...)   &#1087;&#1088;&#1086;&#1090;&#1086;&#1082;&#1086;&#1083;-2     (....) ...) Макрос extend-protocol использоваться в тех случаях, если вы хотите реализовать один протокол для нескольких типов данных или классов.  В общем виде использование extend-protocol выглядит следующим образом:(extend-protocol &#1085;&#1072;&#1079;&#1074;&#1072;&#1085;&#1080;&#1077;-&#1087;&#1088;&#1086;&#1090;&#1086;&#1082;&#1086;&#1083;&#1072;   &#1058;&#1080;&#1087;-&#1080;&#1083;&#1080;-&#1050;&#1083;&#1072;&#1089;&#1089;-1    (&#1084;&#1077;&#1090;&#1086;&#1076;-1 ...)    (&#1084;&#1077;&#1090;&#1086;&#1076;-2 ...)   &#1058;&#1080;&#1087;-&#1080;&#1083;&#1080;-&#1050;&#1083;&#1072;&#1089;&#1089;-2    (&#1084;&#1077;&#1090;&#1086;&#1076;-1 ...)    (&#1084;&#1077;&#1090;&#1086;&#1076;-2 ...) ...) При использовании, extend-protocol раскрывается в серию вызовов extend-type для каждого из используемых типов.Давайте рассмотрим небольшой пример.  Пусть мы объявим следующий простой протокол:(defprotocol Hello "Test of protocol"   (hello [this] "hello function")) Мы можем использовать extend, extend-protocol, или extend-type для его специализации для класса String:(extend String   Hello   {:hello (fn [this] (str "Hello " this "!"))})  (extend-protocol Hello String   (hello [this] (str "Hello " this "!")))  (extend-type String Hello   (hello [this] (str "Hello " this "!"))) При использовании любой из этих реализаций для объекта класса String мы получим один и тот же ответ:user&gt; (hello "world") "Hello world!" Стоит отметить, что если вы не реализовали протокол для определенного типа данных, то при вызове функции будет сгенерировано исключение.  В том случае, если вам необходима "реализация по умолчанию", то вы можете специализировать протокол для класса Object.Определение типов данныхВ Clojure 1.2 введены два метода определения новых именованных типов данных (deftype и defrecord), которые реализуют абстракции, определенные протоколами и/или интерфейсами (к типам данных относится также reify, который описан ниже).deftype и defrecord динамически создают именованный класс, который имеет набор заданных полей и (необязательно) методов для одного или нескольких протоколов и/или интерфейсов. Поскольку они не требуют явной компиляции, то это дает возможность их использования в интерактивной разработке.  С точки зрения разработчика deftype и defrecord похожи на defstruct, но во многом они отличаются:они создают уникальный класс с соответствующими полями; созданный класс имеет конкретный тип; имеется конструктор; для полей можно указывать типы (это будет использоваться для оптимизации и ограничения типов в конструкторе). deftype является "базовым" инструментом для определения типов данных &mdash; созданный тип имеет только конструктор, и ничего больше &mdash; все остальное должен реализовывать разработчик.  Но при этом, deftype может иметь изменяемые поля, чего не имеет defrecord.В отличии от deftype, defrecord более прост в использовании, поскольку создаваемый тип данных имеет большую функциональность (по большей части за счет реализации интерфейсов IKeywordLookup, IPersistentMap, Serializable и т.д.):автоматически генерируемые функции hashCode и equals; возможность указания мета-информации; доступ к полям с помощью ключевых символов; вы можете добавлять поля, не указанные в определении. deftype и defrecord обычно имеют разные области применения: deftype в основном используется для "системных" вещей &mdash; коллекций, и т.п., тогда как defrecord в основном используется для хранения информации из "проблемной области" &mdash; данных о заказчиках, записях в БД и т.п. &mdash; то, для чего использовались отображения в версиях 1.0 и 1.1.Давайте рассмотрим как использовать конкретные средства для создания типов данных.deftype &amp; defrecordВ общей форме использование макросов deftype и defrecord выглядит следующим образом:(deftype &#1080;&#1084;&#1103; [&amp; &#1087;&#1086;&#1083;&#1103;] &amp; &#1089;&#1087;&#1077;&#1094;&#1080;&#1092;&#1080;&#1082;&#1072;&#1094;&#1080;&#1080;) (defrecord &#1080;&#1084;&#1103; [&amp; &#1087;&#1086;&#1083;&#1103;] &amp; &#1089;&#1087;&#1077;&#1094;&#1080;&#1092;&#1080;&#1082;&#1072;&#1094;&#1080;&#1080;) Для обоих макросов обязательным параметром является лишь имя, которое становится именем класса.  Поля, которые станут членами класса, перечисляются в векторе, следующем за именем, и могут содержать объявления типов.  После этого вектора, можно указать список реализуемых интерфейсов и протоколов, вместе с реализацией (это не обязательно, поскольку для этого вы позже можете использовать extend-protocol &amp; extend-type).Спецификации протоколов/интерфейсов выглядят следующим образом:&#1087;&#1088;&#1086;&#1090;&#1086;&#1082;&#1086;&#1083;/&#1080;&#1085;&#1090;&#1077;&#1088;&#1092;&#1077;&#1081;&#1089; (&#1085;&#1072;&#1079;&#1074;&#1072;&#1085;&#1080;&#1077;-&#1084;&#1077;&#1090;&#1086;&#1076;&#1072; [&#1072;&#1088;&#1075;&#1091;&#1084;&#1077;&#1085;&#1090;&#1099;*] &#1088;&#1077;&#1072;&#1083;&#1080;&#1079;&#1072;&#1094;&#1080;&#1103;)* Вы можете указать любое количество протоколов/интерфейсов, которые будут реализованы данным типом данных.  Давайте посмотрим на простейший тип данных, который реализует протокол Hello:(deftype A []   Hello   (hello [this] (str "Hello A!"))) Мы можем вызвать функцию hello для нашего объекта, и получим следующий вывод:user&gt; (hello (A.)) "Hello A!" Мы можем также создать тип с помощью defrecord:(defrecord B [name]   Hello   (hello [this] (str "Hello " name "!"))) и вызвать метод hello для этого типа:user&gt; (hello (B. "world")) "Hello world!" Как уже отмечалось выше, создаваемые поля по умолчанию являются неизменяемыми, но если вы создаете тип с помощью deftype, то вы можете пометить некоторые поля как изменяемые, используя метаданные (с помощью ключевого символа :volatile-mutable или :unsynchronized-mutable).  Для таких полей вы сможете использовать оператор (set! afield aval) для изменения данных.  Давайте посмотрим как это делается на примере &mdash; если мы создадим следующий протокол и тип данных:(defprotocol Setter   (set-name [this new-name])) (deftype AM [^{:volatile-mutable true} mfield]   Hello   (hello [this] (str "Hello " mfield "!"))   Setter   (set-name [this new-name]       (set! mfield new-name))) то мы сможем изменять значение поля: user&gt; (def am (AM. "world")) #'user/am user&gt; (hello am) "Hello world!" user&gt; (set-name am "peace") "peace" user&gt; (hello am) "Hello peace!" reifyreify используется тогда, когда вам нужно реализовать протокол или интерфейс только в одном месте &mdash; когда вы используете reify вы одновременно объявляете тип, и сразу создаете объект этого типа. Функция reify по своему использованию очень похожа на proxy, но с некоторыми исключениями:можно использовать только для интерфейсов и протоколов; реализуемые методы являются методами результирующего класса, и они вызываются напрямую, без поиска в отображении, но при этом не поддерживается подмена методов в отображении. Эти отличия позволяют получить более высокую производительность по сравнению с proxy, и при создании и при выполнении.Вот небольшой пример реализации протокола Hello для конкретного объекта:(def int-reify (reify Hello                  (hello [this] "Hello integer!"))) И при вызове hello для этого объекта, мы получим соответствующий результат:user&gt; (hello int-reify) "Hello integer!" Дополнительные функции и макросыДля работы с протоколами и типами данных определено некоторое количество вспомогательных функций, которые могут вам понадобиться:extends? возвращает true если данный тип данных (2-й аргумент) реализует интерфейс, заданный первым аргументом; extenders возвращает коллекцию типов, реализующих заданный протокол; satisfies? возвращает true если данный протокол (1-й аргумент) применим к данному объекту (2-й аргумент); Дополнительная информацияКак всегда, основной источник информации &mdash; сайт языка: ознакомьтесь с разделами protocols и datatypes.  Хорошее описание протоколов и типов данных можно найти в 13-й главе недавно вышедшей книги Practical Clojure. The Definitive Guide, а также в Clojure in Action и The Joy of Clojure. Thinking the Clojure Way, которые будут выпущены в ближайшее время.Stuart Halloway создал очень интересный скринкаст в котором он рассказывает о том, зачем были созданы протоколы и data types, и демонстрирует их применение на небольших примерах.Введение новых возможностей в язык не обходится без статей в блогах.  Вот ссылки на некоторые интересные статьи на эту тему:Статья Stuart Sierra на IBM developerWorks; Clojure's Solutions to the Expression Problem &mdash; выступление Chris Houser на конференции Strange Loop 2010; Серия из 3-х статей (1, 2, 3) о протоколах в блоге Object Commando; Краткое введение в протоколы, написанное Baishampayan Ghose; Clojure Protocols and Expression Problem; Два постинга от Sean Devlin &mdash; Protocol Implementation Awesomeness и Partially Implemented Protocols; Пример реализации паттерна "Circuit Breaker" с помощью протоколов; Пример использования протоколов для мемоизации; Еще пример использования протоколов для реализации turtle graphics; Небольшое сравнение Monkey Patching в Ruby с протоколами в Clojure; Пример реализации стека с помощью протоколов (1, 2), написанный Viksit Gaur;                1. Стоит однако отметить, что протоколы не реализуют monkey patching и внедрение методов (injection) в существующие типы данных. 2. Возможность реализации абстракций на Clojure и высокая скорость работы протоколов позволит в будущем написать Clojure на самой Clojure, без использования исходного кода на Java. 3. Люди знакомые с Haskell могут рассматривать протоколы как некоторое подобие типов классов (typeclasses) в этом языке, правда при этом нельзя определять реализации по умолчанию для методов. 4. Но extend может использоваться в тех случаях, когда вы хотите использовать одни и те же реализации для разных типов данных &mdash; в этом случае, вы можете создать отображение с нужными функциями, и использовать его для разных типов, например, как описано в следующем блог-постинге.
22	http://feedproxy.google.com/~r/alexott-ru/~3/X3qVAbPFOgQ/haskell-mode.html	Добавления в haskell-mode	2011-02-02T08:44:12.706+01:00	tag: fp endoftag tag: haskell endoftag tag: emacs endoftag 	На новогодних каникулах сделал давно запланированное добавление к haskell-mode - добавил поддержку для hlint (команда hs-lint) и haskell style scanner (команда hs-scan). Как и в предыдущей реализации, hs-lint поддерживает замену кода на предлагаемый вариант. Патчи отправлены мейнтейнеру, но пока они не закоммиченны в основной репозиторий, эти изменения доступны в моем форке. Замечания и пожелания приветствуются...
23	http://feedproxy.google.com/~r/alexott-ru/~3/iTNQDK8p4X8/blog-post_30.html	Итоги года...	2010-12-31T13:42:41.771+01:00	tag: fp endoftag 	Год получился интересным, было много интересных проектов, как на работе, так и вне ее. Продолжал "развлекаться" с Clojure, что в итоге вылилось в написание большой статьи для журнала "Практика функционального программирования", докладах на MarginCon 2010 и на встрече Munster Java User Group, а также в подкасте у golodnyj (1, 2). Ну и конечно, не обошлось без писания кода для разных проектов (Incanter, leiningen, swank-clojure, clojure-hadoop, и еще паре своих). Правда немного подзабросил Common Lisp и Scheme, но с первым я поработаю во время чтения недавно купленной "Paradigms of Artificial Intelligence Programming: Case Studies in Common Lisp". Очень много читал (соответствующая полка на shelfari, правда список на прочитать еще больше), не в последнюю очередь благодаря покупке iPad, и приобретению электронных книг (много у Manning). Первый раз был в США (по работе) - была очень полезная поездка. Теперь в планах поездки уже не по работе, хочется вживую познакомиться с френдами на обоих побережьях США... На следующий год очень много планов: хочу немного увеличить количество Haskell и Erlang в своих проектах, и может быть посмотреть на Scala, если останется время; продолжить заниматься machine learning, кроме того, есть несколько задумок в части natural language processing;  продолжу занятия с hadoop, и т.п. вещами, связанными с обработкой больших объемов данных; обновить существующие статьи по программированию и Emacs, и может быть написать что-то новое для ПФП; продолжить хакать Emacs, особенно в части CEDET для функциональных языков.  И пользуясь случаем, хочу поздравить всех своих читателей с наступающим новым годом, и пусть у вас будет много интересных вещей в новом году, и вообще все хорошо в жизни :-)  Update: Забыл написать, что в следующем году (марте скорее всего) будет официально издан перевод отличной книжки - Types and Programming Languages. Перевод закончен полностью, и сейчас только ведется работа над версткой
24	http://feedproxy.google.com/~r/alexott-ru/~3/fgv4fBqbZDk/el-get.html	Переехал на el-get	2010-12-21T11:57:38.102+01:00	tag: emacs endoftag 	Я достаточно долгое время таскал с собой все используемые пакеты для Емакса, вместе с конфигурационными файлами - это позволяло мне иметь везде одинаковую рабочую среду. Большая часть используемых пакетов бралась прямо из репозиториев и регулярно обновлялась с помощью набор шельных скриптов. Но некоторое время назад я наткнулся на проект el-get, который берет на себя вопросы скачивания и обновления пакетов, и делает это прямо из емакса. Основное удобство заключается в том, что в составе el-get имеется большое количество готовых конфигурационных файлов (рецептов) для самых разных пакетов, и вы можете сразу использовать их в своей конфигурации. Использование el-get очень просто - вы определяет список пакетов, которые вы хотите использовать, а затем вызываете функцию (el-get), которая выкачивает пакет, компилирует его в соответствии с инструкциями, и загружает нужные части, так что пакет становится доступным для использования.  Подробности использования можно найти в описании проекта. Неделю назад я наконец-то собрался с духом, и перевел свою рабочую конфигурацию на el-get (я пока использую свой форк проекта, хотя многие из рецептов уже внесены в основной проект), пришлось правда добавить рецептов которых еще не было в репозитории, и немного повозиться со сборкой на Mac OS X. Но в остальном - все работает нормально.
25	http://feedproxy.google.com/~r/alexott-ru/~3/f-uG-x-dkLE/blog-post.html	Следующие номера ПФП	2010-12-08T14:59:48.201+01:00	tag: fp endoftag 	Редакция журнала "Практика функционального программирования" ищет авторов статей для следующих выпусков журнала. Если вы хотите написать о применении ФП в своей работе, о новом языке программирования, о конкретном алгоритме, сделать перевод хорошей статьи, или написать еще о чем-то относящемся к ФП, то пришлите письмо на адрес ie@fprog.ru с небольшим описанием того, о чем вы хотите написать
