Russian Lambda Planet

16 мая 2012

Haskell@Habrahabr

Решение арифметических задач — вероятностный подход против регулярных выражений

Как всегда в начале месяца состоялся конкурс по функциональному программированию, который проводится на ежемесячной основе под эгидой Фонда Поддержки Функционального Программирования. В мае на суд конкурсантов была предложена задача, которая планировалась в качестве задачи для Большого Ежегодного Конкурса по ФП, который пока так и не состоялся. Изначальная концепция задачи была переосмыслена, в результате чего появилась такая формулировка:

В файле, находящемся по известному адресу, записано 100 тысяч условий арифметических задач на четыре действия: сложение, вычитание, умножение и деление. Условия записаны на естественном языке. В качестве результата необходимо представить файл с ответами на задачи — по одному ответу в виде натурального числа на каждой строке (итого 100 тысяч строк).

Читать дальше →

написал Darkus 16 мая 2012, 10:44

Erlanger.ru

Flymake + Rebar

Eric B. Merritt нашел способ связать Flymake и rebar. Как известно, стандартно установленный Flymake не работает с rebar'ом по той про стой причине, что он просто не знает, где находится код и пути к зависимостям.

Решение простое (детальное описание того, что делает этот код, можно посмотреть в блоге Эрика):

(defun ebm-find-rebar-top-recr (dirname)
      (let* ((project-dir (locate-dominating-file dirname "rebar.config")))
        (if project-dir
            (let* ((parent-dir (file-name-directory (directory-file-name project-dir)))
                   (top-project-dir (if (and parent-dir (not (string= parent-dir "/")))
                                       (ebm-find-rebar-top-recr parent-dir)
                                      nil)))
              (if top-project-dir
                  top-project-dir
                project-dir))
              project-dir)))

    (defun ebm-find-rebar-top ()
      (interactive)
      (let* ((dirname (file-name-directory (buffer-file-name)))
             (project-dir (ebm-find-rebar-top-recr dirname)))
        (if project-dir
            project-dir
          (erlang-flymake-get-app-dir))))

     (defun ebm-directory-dirs (dir name)
        "Find all directories in DIR."
        (unless (file-directory-p dir)
          (error "Not a directory `%s'" dir))
        (let ((dir (directory-file-name dir))
              (dirs '())
              (files (directory-files dir nil nil t)))
            (dolist (file files)
              (unless (member file '("." ".."))
                (let ((absolute-path (expand-file-name (concat dir "/" file))))
                  (when (file-directory-p absolute-path)
                    (if (string= file name)
                        (setq dirs (append (cons absolute-path
                                                 (ebm-directory-dirs absolute-path name))
                                           dirs))
                        (setq dirs (append
                                    (ebm-directory-dirs absolute-path name)
                                    dirs)))))))
              dirs))

    (defun ebm-get-deps-code-path-dirs ()
        (ebm-directory-dirs (ebm-find-rebar-top) "ebin"))

    (defun ebm-get-deps-include-dirs ()
       (ebm-directory-dirs (ebm-find-rebar-top) "include"))

    (fset 'erlang-flymake-get-code-path-dirs 'ebm-get-deps-code-path-dirs)
    (fset 'erlang-flymake-get-include-dirs-function 'ebm-get-deps-include-dirs)

написал Eric B. Merritt 16 мая 2012, 06:40

darkus

Третий урок программирования для старшего сына

Продолжаю заниматься со старшим сыном программированием (первые занятия: 1, 2). Изучаем самые-самые основы пока ещё в теории. На третий раз я задумал что-то совершенно иное. Вот результаты:

52.97 КБ

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

Лирическое отступление: сын сразу же заявил: «Давай подключим её к Интернету, накачаем оттуда игр и поиграем».

Черепашка умеет ходить влево и вправо вдоль ленты, на которой может рисовать зачернённый кружок или стирать его. Конечно, она может читать, что там на ленте напротив неё нарисовано. И у черепашки есть флаги, как у древнего воина — прямо на спине. В любой момент времени у черепашки один и только один флаг на спине какого-либо цвета. Цветов может быть столько, сколько необходимо для определения поведения черепашки. В начале работы черепашка несёт на спине флаг белого цвета.

Сын сразу же понял формализм, после пары моих примеров написал программу сам. Я, конечно, помогал — мы обсуждали, что и как надо определять при помощи флагов различных цветов. Но самое главное, что понял сын, так это то, что мы не записываем последовательность шагов, которые должна выполнять черепашка, как мы это делали в случае с луноходом. Его поразило то, что мы описываем поведение при помощи условий, а черепашка сама смотрит, что и как необходимо делать в текущих условиях. И он вот сам мне объяснял, что мы можем записать какое-либо число в любом месте ленты, а черепашка сама до него дойдёт.

Сразу же рассказал про проблему останова. Объяснял самыми простейшими словами, даже доказал в стиле: «Пусть черепашка останавливается, когда исследуемая ею программа не останавливается, и не останавливается, если останавливается. Тогда дадим ей на вход ею саму же. Парадокс же». Сын кивал, делал умное лицо. А потом заявил, перевернув листок: «Погоди, давай я прямо сейчас напишу программу, которая определяет, останавливается ли черепашка или нет». Я его отговорил, хотя вот теперь думаю, что, может быть, зря?

16 мая 2012, 05:31

Erlanger.ru

Монады для Erlang'а. Еще один подход к снаряду.

К сожалению, описание этого подхода существует только на китайском. Код можно взять на GutHub'е: https://github.com/edwardbadboy/Erlang_Monad.

С виду, эта библиотека позволяет достаточно многое и интересное. Примеры кода:

трансформируется в 

Еще трансформации:

Библиотека реализует следующие монады: Maybe, State, List, Flex

написал Dmitrii 'Mamut' Dimandt 16 мая 2012, 05:04

15 мая 2012

Scala@Habrahabr

Scala-конференция в Петербурге через 4 дня

Уже в субботу 19 мая пройдет вторая конференция для Scala-разработчиков в Санкт-Петербурге — ScalaDev.



В программе конференции гостей ждет доклады о новых возможностях Scala 2.10, байткоде, создании эффективной и асинхронной системы, используя модель актеров и Akka2.0, а также новом языке Kotlin.

Регистрация и подробная информация о конференции по адресу: scaladev.ru.

написал e_Legion 15 мая 2012, 11:58

thesz

В продолжение про встречу.

Столик заказан на меня, Зефирова Сергея.

На всякий случай, мой телефон +7(916)605-97-88

15 мая 2012, 10:42

blog : ∀a → ∀b → (a → b) → a → b

Agda2

Ковыряю Agda2
module if where

open import proof
open import bool

open import list

if_then_else_ : ∀ {l} {a : Set l} → (p : bool) → ((p ≡ true) → a) → a → a
if true then t else f = t refl
if false then t else f = f

head₀ : ∀ {l} {a : Set l} → (ls : list a) → (not (empty ls) ≡ true) → a
head₀ {_} {_} null ()
head₀ {_} {_} (cons x xs) p = x

test₁ : ∀ {l} {a : Set l} → list a → a → a
test₁ ls v = if (not (empty ls)) then head₀ ls else v

test₂ : ∀ {l} {a : Set l} → a → a
test₂ v = head₀ (singleton v) refl

15 мая 2012, 09:04

darkus

ФП(ФП) обрастает материальными артефактами

Не могу не показать радостное:


Это распечатанный в виде брошюры Альманах-2011 по конкурсам, а также мои визитные карточки от ФП(ФП). Как видите, ФП(ФП) начинает обрастать материальными артефактами.

На визитках, кстати, QR-код и оформление контактной информации в виде листинга на понятно каком языке программирования. Правда, не компилируется :).

Если хотите себе такие же (как брошюру, так и визитки), то обращайтесь.

15 мая 2012, 03:23

14 мая 2012

Scala@livejournal.com

Вакансия Scala-developer'a (Москва)

Здравствуйте, коллеги.
Компания Иннова ищет Scala-программиста для разработки высоконагруженного серверного приложения (application server). Приложение обслуживает миллионы пользователей в России и Европе и является сердцем игровой платформы 4game.com.

Нужен человек, который понимает как создавать ПО, которое может работать без остановки круглые сутки, которому нравятся функциональные языки и возможность совмещать функциональный подход с ООП.
Описание вакансии - http://hh.ru/vacancy/5911270
Ждем резюме на vacancy@inn.ru

написал Владимир Купцов 14 мая 2012, 19:22

Вторая Scala-конференция в Петербурге

19 мая в офисе JetBrains состоится вторая встреча Scala-разработчиков в Санкт-Петербурге. Первая встреча прошла 1 октября, отчет с видео можно посмотреть по ссылке.

image

Подробнее о докладах на странице мероприятия или под катом. 

Мероприятие бесплатное, для посещения необходимо зарегистрироваться.

В этот раз с докладами выступят:

  • Евгений Бурмако (EPFL) — «scala.reflect»
  • Василий Ременюк (Viaden) — «Курс молодого подрывника, или как с помощью Akka2.0 и одного сервера положить кластер онлайн игры»
  • Александр Подхалюзин (JetBrains) — «Магия Scala изнутри»
  • Светлана Исакова (JetBrains) — «Язык Kotlin»

написал d_drake 14 мая 2012, 12:43

thesz

Встреча.

Итак, завтра в в 19:00, Квартира 44 на Якиманке.

До завтра!

14 мая 2012, 11:09

Mike Potanin

Бесточетное программирование.

Выглядит оно примерно так: ( . (( . ) . ( . ) . ( . ))) . ( . ) . ( . ) . ( . ) . ( . )
Надеюсь вам бросилось в глаза полное отсутствие точек?
Обсудить этот замечательный стиль кодирование можно здесь.

Меня эта статья заставила еще раз задуматься об избыточности библиотеки.
fmap имеет в специализированной форме дригие названия. Наиболее известное из них - map. Но и (.) им может быть! С точки зрения ТК это понятно, но я не додумался в стандартной библиотеке поискать инстанс.
Зачем так много имен для одной сущности? Не достаточно ли одного - из класса типов Functor? И для удобства назвать его там (.) - уж больно часто их приходится использовать.

14 мая 2012, 03:42

darkus

Вопрос ко всем читателям относительно конкурсов

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

1. Интересна ли вам тема с конкурсами по ФП?

2.1. Если да, то участвуете ли вы в них?
2.2. Если нет, то насколько вас раздражает эта тема в моём журнале?

3. Если тема вам интересна, но вы не участвуете в конкурсах, то в чём выражается ваш интерес?

4. Любые комментарии и замечания всегда приветствуются.

Заранее благодарю всех откликнувшихся.

14 мая 2012, 03:31

13 мая 2012

thesz

Встреча.

Поскольку [info]awson благополучно прибыл в Москву, намечается встреча.

Место: Квартира 44 на Якиманке.

Время: 15-го числа в 19:00.

Точно буду я, [info]awson, [info]user сотоварищи. Весьма вероятно появление [info]vshabanov. Есть ещё желающие.

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

13 мая 2012, 16:25

12 мая 2012

Erlanger.ru

Народный перевод книги Джо Армстронга на GitHub'е

Народный перевод книги Джо Армстронга "Programming Erlang" переехал на GitHub. Перевод, производимый силами сообщшества Russian Armstrong Erlang обрел новый адрес: https://github.com/dyp2000/Russian-Armstrong-Erlang

Для тех, кто не любит .docx, перевод также доступен тут: https://github.com/dieu/Russian-Armstrong-Erlang

написал Dmitrii 'Mamut' Dimandt 12 мая 2012, 19:01

blog : ∀a → ∀b → (a → b) → a → b

Agda2

Наткнулся случайно на такие дела.
Это же замечательно:
record Monad {o ℓ e} (C : Category o ℓ e) : Set (o ⊔ ℓ ⊔ e) where
  field
    F : Endofunctor C
    η : NaturalTransformation id F
    μ : NaturalTransformation (F ∘ F) F

  open Functor F

  field
    .assoc : μ ∘₁ (F ∘ˡ μ) ≡ μ ∘₁ (μ ∘ʳ F)
    .identityˡ : μ ∘₁ (F ∘ˡ η) ≡ idN
    .identityʳ : μ ∘₁ (η ∘ʳ F) ≡ idN

12 мая 2012, 12:12

nponeccop

Алгебраические методы в программировании - лит-ра

http://www.springerlink.com/content/978-3-540-43613-3/

Algebraic and Coalgebraic Methods in the Mathematics of Program Construction

Не знаю даже, с чего начать - столько сладкого. Вот содержание, смотрите:

http://www.cs.ox.ac.uk/people/jeremy.gibbons/publications/acmmpc-toc.pdf

Ещё интересно, что это учебник.

12 мая 2012, 09:50

11 мая 2012

Erlanger.ru

Ф. Чезарини, С. Томпсон. «Программирование в Erlang»

Издательство «ДМК Пресс» выпустило перевод книги Ф. Чезарини и С. Томпсона «Программирование в Erlang».

Книга доступна, например, на «Озоне»: http://www.ozon.ru/context/detail/id/9552287/ или на сайте самого издательства: http://www.dmk-press.ru/catalog/computer/programming/functional/978-5-94074-617-1/ (тут дешевле).

Программирование в Erlang
Erlang Programming

  • Автор: Ф. Чезарини, С. Томпсон
  • Переводчик: А. Холомьев
  • Языки: Русский
  • Издательство: ДМК Пресс
  • Серия: Функциональное программирование
  • ISBN 978-5-94074-617-1, 978-0-596-51818-9; 2012 г.

Дополнительные характеристики

  • Страниц: 488 стр.
  • Формат: 60x90/16 (145х217 мм)
  • Тираж: 300 экз.
  • Переплет: Мягкая обложка

написал Dmitrii 'Mamut' Dimandt 11 мая 2012, 09:56

darkus

Продолжаем обучаться программированию: ФВП

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


Здесь я попросил сына провести луноход по шахматной доске этаким замысловатым маршрутом. Перед написанием программы мы долго сидели и обсуждали, как можно сокращать количество кода, как можно объединять в одну «подпрограмму» повторяющиеся куски. Пока, как видно, мы не изучали понятие параметра функции, поскольку это ещё сложновато. Да и «язык программирования» пока позволяет делать это без параметров. Так что смотрите. Заодно, подспудно, показал, что есть такое понятие, как функция высшего порядка (в данном примере — ПОВТОР). И, к тому же, изучили (пока не называя) способ разработки сверху вниз.

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

Ну и, кстати, ваши комментарии его очень мотивируют. Он внимательно следит за тем, кто что пишет. Очень радуется тому, что вы оставляете комментарии с очень умными словами, которые он пока не понимает :).

11 мая 2012, 04:34

Lisp@Habrahabr

[Перевод] Nikodemus' Common Lisp FAQ

Nikodemus' Common Lisp FAQ


Последнее обновление: 2012-04-13

Это очень неофициальное ЧаВО по языку Common Lisp, отражающее субъективное мнение Nikodemus Siivola. Этот текст частично основан на других ЧаВО, встречавшихся на просторах интернета и comp.lang.lisp.
Если вы думаете, что я воспользовался вашим текстом, буду рад признаться в этом, поэтому пишите на nikodemus@random-state.net.
Текущая версия этого ЧаВО доступна по следующим адресам:
http://random-state.net/files/nikodemus-cl-faq.txt
http://random-state.net/files/nikodemus-cl-faq.html
ЧаВО также периодически публикуется в comp.lang.lisp.
Читать дальше →

написал DmitrySolomennikov 11 мая 2012, 04:02

10 мая 2012

Scala@Habrahabr

Пишем простейший REST web-сервис на Scala

У меня есть сайт, написанный на Node.js, и иногда там требуется сделать что-то, для чего Node.js не предназначен: например, произвести какие-нибудь математические вычисления.

В этом примере мы будем вычислять «хеш» пароля.
Читать дальше →

написал kuchumovn 10 мая 2012, 18:25

Lisp@Habrahabr

[Перевод] Преимущества Common Lisp

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

Далее следует попытка выделить набор особенностей стандартного Common Lisp, кратко и с примерами.

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

Текст по большому счёту основан на списке особенностей CL и обзоре CL Роберта Стренда (Robert Strandh). Читать дальше →

написал iley 10 мая 2012, 15:15

darkus

Приз зрительских симпатий за майский конкурс по ФП

Разыгрываем приз зрительских симпатий, любезно предоставленный нам издательством ДМК Пресс. Из-за ограничений движка ЖЖ вы можете проголосовать за двоих человек (я попытался распределить всех претендентов по двум вопросам поровну), но прошу сделать это только один раз. Вы также можете привлечь к опросу всех своих друзей и знакомых, приглашая их поучаствовать. Публикация ссылки на опрос у себя в бложике не возбраняется.


Опрос продлится ровно неделю до 12:00 17.05.2012. С исходными кодами участников можно ознакомиться здесь.

10 мая 2012, 10:29

Майский конкурс по ФП: арифметические задачи

Даём старт майскому конкурсу по функциональному программированию. Сегодня, воодушевившись прослушанным курсом по обработке естественного языка от Стэнфордского университета, я хочу дать уважаемым конкурсантам и любителям функционального программирования немного странную, но в то же время необычную задачу. Впрочем, я давно запланировал её в качестве задачи для Большого Ежегодного Конкурса, однако коллеги меня отговорили, сказав, что интереса она не вызовет. В итоге я решил переформулировать концепцию и выдать задачу в качестве традиционного ежемесячного конкурса.

Итак, вот здесь вы можете скачать заархивированный файл. В этом файле на каждой строке находится условие арифметической задачи для первого класса. Например: «Велосипедистка проезжала ежедневно по 5 километров в течение 90 дней. Сколько километров проехано всего?». Всего задач 100 тысяч (изначально хотел было сделать 1 миллион, но потом подумал, что и сто тысяч вручную за четыре дня не прорешать). Конкурсант должен прислать мне файл с ответами, на каждой строке этого файла должно быть ровно одно число — ответ на соответствующую задачу. То есть конкурсант должен прислать мне файл, состоящий из 100 тысяч строк, на каждой строке находится одно натуральное число.

Я сам реализовал решатель арифметических задач на основе сложнейшего алгоритма (там объём составляет более миллиона LOC, я писал его ещё с прошлого года, к тому же привлёк к работе с десяток мексиканских программистов), находящегося на грани State-of-the-Art в области искусственного интеллекта. Этот алгоритм выдаёт 55 % правильных решений. Но я верю, что мои уважаемые читатели смогут сделать лучше. Так что призы будут выданы тем, кто сделает решатель, выдающий более 55 % правильных решений. Кто менее — уж извиняйте. Тех отправим в первый класс начальной школы :). Ну а места распределятся просто — чей решатель даст большее количество правильных ответов, тот выиграет и получит первый приз. Второй по точности решатель получит второй приз. Ну а приз зрительских симпатий отдадим по результатам голосования.

Свои ответы выкладывайте на какой-нибудь сервис для хранения исходных кодов, типа hpaste.org, в комментариях к этой записи помещайте ссылки как на исходные коды своих решателей, так и на файлы с ответами. Но файлы с ответами лучше присылать мне по электронной почте (адрес, кто ещё не знает, — darkus.14@gmail.com), чтобы не перегружать хорошие сервисы мириадами чисел. Ну и от каждого конкурсанта я приму ровно один файл с ответами. Тут уж не обессудьте.

Ответы принимаю до 10.05.2012. Дерзайте!

Дополнение 1: 10.05.2012 08:00 — Комментарии раскрыты, прекращаю принимать результаты, начинаю подводить итоги конкурса. Те, кто прислал мне результаты по почте, но ещё не отметился в комментариях, прошу это сделать — опубликуйте ссылку на свой код, чтобы всякий добрый человек мог воочию видеть.

Дополнение 2: 10.05.2012 11:00 — Итоги опубликованы.

Дополнение 3: 10.05.2012 12:00 — Опрос по поводу приза зрительских симпатий запущен. Прошу участвовать.

Предыдущие конкурсы:
1. Август 2011. Задача о возрастах детей математика: условие, результаты.
2. Сентябрь 2011. Кто на ком женат: условие, результаты.
3. Октябрь 2011. Задачи о переправах: условие, результаты.
4. Ноябрь 2011. Задача о надёжности кода: условие, результаты.
5. Декабрь 2011. Задача о конструировании чисел из чисел: условие, результаты.
6. Январь 2012. Расшифровка кода на языке Haskell: условие, результаты.
7. Февраль 2012. Мат в один ход: условие, результаты.
8. Март 2012. Переливание жидкости из сосуда в сосуд: условие, результаты.
9. Апрель 2012. Кельтская алхимия — трансмутация слов: условие, результаты.

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

Если вы хотите дополнительно отблагодарить организатора (то есть меня), но не знаете как, то вам сюда. Собранные благодарности пойдут прямиком в ФП(ФП).

10 мая 2012, 08:02

Итоги майского конкурса по ФП

Закрываем майский конкурс по функциональному программированию, который на этот раз был посвящён обработке естественного языка. Как я уже писал, я хотел организовать на основе этой задачи Большой Конкурс по ФП, но коллеги-друзья меня отговорили. Говорили, что она не будет никому интересна, дескать всяк напишет пару регулярных выражений, которые дадут стопроцентный результат. Отчасти они оказались правы, и в результатах этого конкурса лидируют те, кто очень тщательно подошёл к разработке паттернов, по которым строилась генерация текстов задач. Однако надо сказать, что и я подошёл к организации этого конкурса совсем не так, как это было бы для Большого Конкурса — малое количество разнообразия, типовые задачи и недоработанный генератор ЕЯ-текста, основанный на контекстно-свободных грамматиках и скрытых марковских моделях.

В общем, генератор выдавал иногда такие перлы, что участники конкурса забросали меня сообщениями с ними. Кроме того, в него закралась позорная ошибка, которая не позволила участникам, кто очень хотел, выдать 100 000 правильных ответов. В итоге, максимальной цифрой стала 98 444, и это надо полагать стопроцентным результатом. Пересчитывать проценты не буду, просто в графе «Результат» в нижеследующей таблице укажу количество правильных ответов. Ну а эталонный файл каждый может взять здесь, чтобы проверить меня.

А вот и таблица с результатами. Поскольку тех, кто прислал максимальный результат, оказалось 8 человек, они распределяются по местам в соответствии с тем, кто первый прислал мне результаты на почту (а не опубликовал в комментариях ссылку).

Место ID Язык Результат Призы
I [info]_pacak_ Haskell 98 444 Книга с автографом
Скидка 2 %
II Alexey Kishkin Perl 98 444 Персональный электронный экземпляр
Скидка 10 %
III Матвей Котов Shell 98 444 Персональный электронный экземпляр
Скидка 2 %
IV [info]dimonster_1983 Perl 98 444 Персональный электронный экземпляр
Скидка 8 %
V [info]_adept_ Perl 98 444 Персональный электронный экземпляр
Скидка 2 %
VI Afiskon Perl 98 444
VII [info]stdray Nemerle 98 444 Персональный электронный экземпляр
Скидка 10 %
VIII SR0MAN0V Perl 98 444 Персональный электронный экземпляр
Скидка 4 %
IX Константин Лихоманов Haskell 98 310 Персональный электронный экземпляр
Скидка 10 %
X [info]pankdm Python 98 278 Персональный электронный экземпляр
Скидка 6 %
XI reclosedev Python 98 081 Персональный электронный экземпляр
Скидка 2 %
XII [info]svetopolk Shell 97 513 Персональный электронный экземпляр
Скидка 2 %
XIII [info]mishadoff Clojure 97 215 Персональный электронный экземпляр
Скидка 2 %
XIV Сергей Глазунов C++ 96 907 Персональный электронный экземпляр
Скидка 2 %
XV sash-kan Bash 96 893 Персональный электронный экземпляр
Скидка 4 %
XVI Dmitri Rostchin F# 96 888 Персональный электронный экземпляр
Скидка 2 %
XVII Павел Платто Haskell 95 882 Персональный электронный экземпляр
Скидка 8 %
XVIII [info]maks_komar_mtw Perl 95 771 Персональный электронный экземпляр
Скидка 6 %
XIX [info]hls_1141 Python 95 184 Персональный электронный экземпляр
Скидка 2 %
XX Valentin Budaev Racket 94 402 Персональный электронный экземпляр
Скидка 2 %
XXI dmitry_vk Python 90 768 Персональный электронный экземпляр
Скидка 2 %
XXII [info]migorec Haskell 87 931 Персональный электронный экземпляр
Скидка 8 %
XXIII Aleksey Andrushko C# 67 406 Журнал с автографом
Скидка 2 %

Здесь надо сделать несколько замечаний:

0. Первое место заняло решение, написанное на прекраснейшем из всех прекрасных языков программирования Haskell, и это действительно так. Но вам придётся поверить мне на слово, поскольку проверить вы это не сможете.

1. По результатам обсуждения и взаимному согласию с Алексеем Кишкиным, который и так получил все имеющиеся у меня на текущий момент материальные призы, приз за второе место отдаётся Алексею Андрюшко, который занял последнее место, показав наихудший результат. Это поощрительный приз за старание и рвение.

2. Коллега Afiskon уже получил скидку на печать моих книг в издательстве Самиздал в размере 10 %, а также все имеющиеся у меня на текущий момент нематериальные призы (и даже один материальный), так что ему на этот раз ничего не полагается. Кстати, не забывайте, что в указанном издательстве вы можете напечатать себе бумажные экземпляры моих книг с указанной скидкой. Для этого надо просто оплатить товар по цене уже со скидкой, а не указанной на сайте, а в заказе пояснить, откуда скидка, дать ссылку на соответствующую страницу у меня. К тому же, вы можете указать, чтобы отпечатанные книги они отправили мне, в таком случае я сделаю на них автограф и уже отправлю вам.

3. Этот конкурс является первым, в котором первое место по количеству использования занял язык Perl, а не Хаскель-Цацкель, как это было во всех прошлых конкурсах. Что это за язык такой Perl, чем он так интересен?

4. В этом конкурсе впервые участвует мой прекраснейший товарищ [info]_adept_, который за неделю до организации конкурса писал мне гневные письма о том, что я зря устраиваю конкурс в прошедшие выходные — дескать имеется какая-то коллизия с конкурсами от Корпорации Добра. Но мне всё ни по чём.

В общем, вот так вот. Конкурс удался, это было прекрасно. В ближайшее время оформлю всем призы, разошлю. Те, кто получает материальные призы, прошу связаться со мной по почте, соорганизуемся насчёт отправки и получения. Ну а через некоторое время я запущу опрос на тему приза зрительских симпатий. Для этого пока ознакомьтесь с присланными конкурсантами исходными кодами.

Предыдущие конкурсы:
1. Август 2011. Задача о возрастах детей математика: условие, результаты.
2. Сентябрь 2011. Кто на ком женат: условие, результаты.
3. Октябрь 2011. Задачи о переправах: условие, результаты.
4. Ноябрь 2011. Задача о надёжности кода: условие, результаты.
5. Декабрь 2011. Задача о конструировании чисел из чисел: условие, результаты.
6. Январь 2012. Расшифровка кода на языке Haskell: условие, результаты.
7. Февраль 2012. Мат в один ход: условие, результаты.
8. Март 2012. Переливание жидкости из сосуда в сосуд: условие, результаты.
9. Апрель 2012. Кельтская алхимия — трансмутация слов: условие, результаты.

Нельзя не напомнить, что у ФП(ФП) есть официальный форум, где вы найдёте ответы на все вопросы по функциональному программированию, которые вас мучили до сих пор.

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

10 мая 2012, 07:59

nponeccop

Даёшь контравариантные функторы в typeclassopedia!

Тут вот подбросили отличную ссылку по применению Data.Functor.Contravariant, хорошо бы это оформить в typeclassopedia. Ну и конечно алгебра частичных изоморфизмов рулит, интересно, связано ли это с Data.Lens.Partial

Invertible Syntax Descriptions: Unifying Parsing and Pretty Printing
http://lambda-the-ultimate.org/node/4191

10 мая 2012, 07:55

Yan Tayga

Haskell для микроконтроллеров

А можно как-то скомпилировать программу на Хаскеле на другие, отличные от широкораспространенных, процессоры? На i8051, например или PIC?
Насколько я понимаю, можно просто скомпилировать с помощью GHC в С и потом уже в ассемблер нужного процессора. А как имитировать, например, работу с выводами портов побитово в i8051? Как вообще тут принято все делать и какие привычные грабли есть и распознаны?

10 мая 2012, 05:13

"Записки программиста"

Задача о роботе-пылесосе без датчиков

Тем временем я продолжаю почитывать книги по искусственному интеллекту и нахожу в них массу интересных вещей. В этой заметке я предлагаю вашему вниманию задачу о роботе-пылесосе, которая формулируется примерно следующим образом. Есть робот-пылесос и прямоугольная комната размером M на N полей. Робот умеет передвигаться вперед, назад, влево и вправо на одно поле, а также всасывать [...]

написал Eax 10 мая 2012, 04:59

09 мая 2012

08 мая 2012

Tarantoga

Гусеничный Lisp-трактор

Просматривая записи Казимира Майорника, нашел у него очень любопытную статью. Это всего лишь забавный эксперимент, показывающий, как при помощи лисповой парадигмы "код-как-данные" можно реализовать циклическое выполнение кода без циклов и рекурсий. Никакой практической ценности в этом нет, просто красиво смотрится. Я написал что-то похожее на Clojure, но несколько усовершенствованное. В моей версии алгоритм выглядит так.

1) Список f содержит всего одну функцию. Её и запускаем первой.
2) Первая функция передает свой код в update.
3) Update "препарирует" код, находит номер текущей итерации, инкрементирует его и собирает такую же функцию, как ей передали, но с новым значением итерации.
4) Первая функция получает вторую функцию и добавляет её в конец списка f. Если список f содержит более трех элементов, то первый элемент списка f удаляется. Таким образом, в списке f содержится не более четырех элементов.
5) Первая функция запускает вторую функцию и завершается.

Выглядит и впрямь, как гусеничный трак :-)

(defn update [func]
(let [p (nth func 2) ;; Получить список (println (str "Hi for the " 1 " time!"))
n (nth (second p) 2) ;; Получить 1 из списка
;; Создать список (println (str "Hi for the " 2 " time!"))
new-p (cons 'println (list (map #(if (= n %) (inc n) (identity %)) (second p))))]
;; Заменить в теле функции (println (str "Hi for the " 1 " time!"))
;; на (println (str "Hi for the " 2 " time!"))
(map #(if (and (seq? %) (= (first %) 'println)) new-p (identity %)) func)))

(def f (ref ['(fn []
(println (str "Hi for the " 1 " time!"))
(let [func (last @f)
;; Обновить список функций f
;; Удалить первую функцию, если список f содержит больше трех элементов
new-f (if (> (count @f) 3)
;; Добавить обновленную функцию в конец списка
(conj (vec (drop 1 @f)) (update func))
(conj @f (update func)))]
(dosync (ref-set f new-f))
;; Выполнить последнюю функцию списка
((eval (last @f)))))]))

((eval (last @f)))

написал Dmitry (noreply@blogger.com) 08 мая 2012, 17:04

"Turtle//BAZON Group"

enhanced-thread-pool

Недавно тут понадобилась библиотека для пула потоков. Тогда нашёл было thread-pool. Но оказалось, что если положить в его очередь задания пока заняты работающие нити, то он не начнёт обрабатывать её как какой-нибудь поток освободится. Поэтому набросал свою библиотеку для пула потоков. В принципе, возможно, как я потом изучил, для моих задач бы хватило pcall или eager-future, но к этому времени основную функциональность я уже дописал. Дополнительно библиотека позволяет создавать временные дополнительные нити и использовать их при повышающихся нагрузках и освобождать их при понижении нагрузок. В общем, просьба знающих людей посмотреть и высказать своё мнение. В том числе и то, что можно и лучше использовать вместо этого.

написал turtle (noreply@blogger.com) 08 мая 2012, 14:11

Erlanger.ru

Sinan 4.0.0

Sinan, система автоматической сборки приложений под Erlang/OTP, обновилась до версии 4.0.0. Несмотря на то, что проект все еще дивет и развивается, о новых версиях информация появлялась редко. Tristan Sloughter, одиин из авторов Sinan'а, решил объявить о выходе версии 4.0.0 после того, как рассказал о проекте во время Lightning Talks на Erlang Factory 2012.

Подробнее о том, что такое Sinan, зачем он нужен, и как его использовать, можно на сайте проекта: http://erlware.github.com/sinan/

написал Tristan Sloughter 08 мая 2012, 08:33

07 мая 2012

Tarantoga

CEDET 1.1, Emacs и Java


Недавно вышедший Cedet 1.1 добавляет долгожданную поддержку импорта символов из jar-ок. Теперь Emacs предоставляет поддержку автодополнения кода java примерно на том же уровне, что и современные IDE.
Например, у нас есть класс My1:


Он используется в My2:


Обратите внимание, как flymake параллельно скомпилировал файл и подсветил ошибки. Если набрать “my.” и выполнить функцию semantic-ia-complete-symbol-menu (у меня она замаплена на Ctrl-Space), то Emacs выдаст такую подсказку:



Аналогично можно запрашивать подсказку по членам системных классов. Например, для StringBuilder:


Правда надо учитывать, что, во-первых, импорты “звёздочкой” не срабатывают, системных классов semanticdb-javap тоже не знает. Поэтому, если необходимы подсказки, то импорт классов из неймспейса java.lang нужно делать явно, как в моем примере.

Для того, чтобы заработали показанные выше механизмы, необходимо следующее:
  1. установленный пакет flymake;
  2. установленный пакет auto-complete;
  3. скачанный CEDET 1.1;
  4. Ну и конечно же, последний Emacs и java.

Конфигурация CEDET в .emacs :
(load-file "~/cedet/common/cedet.el")             ;; Подгрузить cedet
(global-semanticdb-minor-mode 1)                  ;; Инициализировать semanticdb
;; Загрузить поддержку авто-дополнения
(semantic-load-enable-gaudy-code-helpers)

(custom-set-variables             ;; Инициализация переменных, указывающих, где 
                                                      ;; установлена java
. . .
'(cedet-java-jdk-root "/opt/jdk")

 ;; Сюда нужно добавить все jar-ки, из
 ;; которых необходимо импортировать символы
'(semanticdb-javap-classpath '("/opt/jdk/jre/lib/rt.jar"))
. . .
)

Конфигурация flymake:
(require 'flymake)
(add-hook 'java-mode-hook 'flymake-mode-on)

(defun my-java-flymake-init ()
(list "javac" (list (flymake-init-create-temp-buffer-copy
'flymake-create-temp-with-folder-structure))))

(add-to-list 'flymake-allowed-file-name-masks '("\\.java$" my-java-flymake-init flymake-simple-cleanup))

Конфигурация auto-complete:
(require 'auto-complete-config)
(add-to-list 'ac-dictionary-directories "~/.emacs.d/ac-dict")
(ac-config-default)



написал Dmitry (noreply@blogger.com) 07 мая 2012, 15:11

Scala@Habrahabr

Вторая Scala-конференция в Петербурге

19 мая в офисе JetBrains состоится вторая встреча Scala-разработчиков в Санкт-Петербурге. Первая встреча прошла 1 октября, отчет с видео можно посмотреть по ссылке.

image

Подробнее о докладах на странице мероприятия или под катом.

Мероприятие бесплатное, для посещения необходимо зарегистрироваться.

Читать дальше →

написал CrazyMacho 07 мая 2012, 10:47

Erlanger.ru

Spawnfest 2012

Spawnfest – это 48-часовой марафон по программированию на Erlang'е, по принципу Rails Rumble and Node Knockout.

В этом году Spawnfest пройдет 9-10 июля. Идея таких соревнований - создать наилучшее приложение на выбранной технологии (в данном случае - на Erlang'е) в сжатые сроки.

Правила соревнования доступны тут: http://spawnfest.com/rules/ Вкратце: Команды от 1 до 4 участников старше 13 лет, используя в основном Erlang (доп. технологии типа Javascript допустимы), должны с нуля написать самое шикарное приложение из всех возможных.

Зарегистрироваться на конкурс можно тут: http://spawnfest.com/take-part/

написал Dmitrii 'Mamut' Dimandt 07 мая 2012, 05:07

06 мая 2012

Макс Лапшин

Про erlang и скорость

Немного заметок про то, что в эрланге быстро, а что нет.

Всё быстро. Кроме строк.

Пример: обрабатываем 300 000 строк из CSV файла. Сначала я провозился с их быстрым парсингом, даже сделал https://github.com/maxlapshin/csv_reader но, как оказалось, и этого мало. Поэтому обработку данных пришлось переделать в предпарсинг с сохранением:



file:write_file(Cache, erlang:term_to_binary(Rows, [compressed,{minor_version,1}])).


Чтение такой штуки гораздо быстрее, чем парсинг CSV.

Дальше больше. Данные надо обработать и обработанные строчки вылить наружу с некоторыми добавками. Обработка происходит примерно 1,5 секунд. Ещё 6-8 секунд занимает io_lib:format("~s,~.2f,~B,~.2f...."). 8 секунд!

Вот такая грязная штука: https://gist.github.com/2623569 позволяет сократить это время примерно до полусекунды.

Мораль: обработка строк одна из самых дорогих штук в эрланге, причем скорее всего из-за листов. Тот же io_lib:format надо будет попробовать запилить в виде NIF-а.

06 мая 2012, 18:07

Russian-speaking Scala Enthusiasts

scalaby#9. Материалы

Встречу, состоявшуюся 28 апреля, открывал традиционно сильным докладом Евгений Бурмако. Евгений рассказал о появившихся в Scala 2.10 возможностях метапрограммирования, новом Reflection API, и макросах в Scala:

unwantedtext

Сяржук Медведев познакомил публику с популярным фреймворком Play2.0, продемонстрировав, почему разработка с его помощью такая простая и стремительная:

unwantedtext

написал scala-enthusiasts-belarus@googlegroups.com (Scala Enthusiasts Belarus) 06 мая 2012, 07:00

04 мая 2012

Scala@Habrahabr

[Из песочницы] (Перевод) Перегрузка операторов в Scala

image

Можно долго спорить, является ли возможность перегружать операторы сильной или слабой стороной конкретного языка. Но факт остается фактом — в Scala такая возможность есть. Так почему бы её не использовать?

Материал статьи рассчитан в основном на начинающих Scala-разработчиков.
Читать дальше →

написал madfriend 04 мая 2012, 16:06

03 мая 2012

nponeccop

Линзы для Maybe

Я тут изобрел шнягу, целый день с ней играюсь (cabal install data-lens-fd).

type MaybeLens v = Lens (Maybe v) v

withDefault :: v -> MaybeLens v
withDefault v = iso (fromMaybe v) Just

withNoop :: MaybeLens v
withNoop = lens (error "It's impossible to read with noop") (fmap . const)

withFailure :: MaybeLens v
withFailure = lens fromJust (\x (Just y) -> Just x)
Юскейс у withDefault такой:

type Modifier a = a -> a

counter x = mapLens x >>> withDefault 0

countItem :: String -> Modifier (M.Map String Int)
countItem x = counter x ^+= 1

item x y = mapLens x >>> withDefault M.empty >>> counter y

countItem2 :: String -> String -> Modifier (M.Map String (M.Map String Int))
countItem2 x y = item x y ^+= 1

itemCount x y countMap = item x y ^$ countMap
Вопрос ли залу:
а) дает ли полиморфность MaybeLens какие-то полезные свойства (например, является ли MaybeLens функтором)?
б) линзы кажутся хорошим базисом для построения абстрактных версий Data.Map и Data.Set. в HOOPL, помнится, были мапы на классах типов (Map k v =>). Известны ли вам другие попытки дизайна абстрактного интерфейса ко множеству и отображению?
в) линзы ввиду двунаправленности кажутся хорошим базисом для построения хитрых двунаправленных соответствий. Можно ли как-то изловчиться и сделать на линзах соответствие между программным текстом и AST (ака парсер+преттипринтер без копипасты)?

03 мая 2012, 19:20

darkus

Публикация нового перевода: «Язык Haskell для детей»

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

Кстати, в связи с последними веяниями в Google прошу проверить, доступна ли папка?

03 мая 2012, 05:40

02 мая 2012

linkfly

Проект LISP-DEV-TOOLS. Новая версия - 0.0.3.

    Можно смело утверждать что новая версия проекта lisp-dev-tools стала гораздо более зрелой чем предыдущая. Особенно хочется отметить появление двух серьёзных возможностей: это появление обобщённого интерфейса использования (параметров командной строки --common-load --common-eval и --common-quit) и появление автоматических тестов (запукаются скриптом tests/run-tests.sh). Если в дистрибутиве, не входящим в число поддерживаемых, все тесты успешно пройдены - проект вполне можно рекомендовать к использованию в этом дистрибутиве! Если же тесты провалились, но вам нужно использовать проект в конкретном дистрибутиве - просто опишите программно-аппаратную среду (процессор, память, архитектуру, версию ядра, название/тип/версию дистрибутива ...) и вышлите мне результаты тестов из папки tests/tests-results/

Новое в версии 0.0.3 (по сравнению с версией 0.0.2):
-----------------------------------------------------
1. Добавлено автоматическое тестирование, запускается скриптом tests/run-tests.sh (рекомендуется запускать перед промышленной эксплуатацией).
2. Сделан общий интерфейс запуска для всех (за исключением XCL и WCL - они не поддерживают параметры
   запуска) лисп-систем. Он представлен тремя ключами:
     --common-load <файл_с_лисп_кодом>
     --common-eval <заключенный_в_кавычки_лисп-код>
     --common-quit
3. Осуществлено разделение на современные (modern), слишком сырые/молодые (young) лисп-системы и
    устаревшие (obsolete). Это отображено в параметрах запуска скриптов ./get-all-lisps и ./provide-all-lisps
4. Налажена работа с символическими ссылками (для управления поддерживающис софтом) теперь изменение в поддерживающих инструментах не влиют на git.
5. Удалены некоторые уже не нужные файлы.
6. Обновлён и изменён TODO: скорректировано состояние выполненных и назначенных задач, а также изменён и скорректирован план развития проекта.
7. Начаты работы по отладке работы проекта в дистрибутиве Arch Linux.
8. Скорректированы некоторые сообщения системы.
9. Удалён баг проявляющийся при постройке XCL на Ubuntu 11.04 x86_64.
10. Исправлена загрузка JRE среды для системы ABCL.
11. Устранен баг в загрузке архивов с лисп-системами.
12. Изменена версия gawk - для устранение ошибки в обеспечении лисп-системы GCL.
13. Сглаживание различий в выводе программы "file", сейчас в проверке на символическую ссылку с помощью "readlink"
14. Устранены также другие ошибки.
------------------------------------------------------------------------------

02 мая 2012, 12:43

darkus

Майский конкурс по ФП состоится в конце этой недели

Как обычно в начале месяца телеграфирую, что в конце этой недели состоится долгожданный многими конкурс по Функциональному Программированию, который традиционно проводится под эгидой ФП(ФП). На этот раз я подготовил очень нестандартную задачу. И, несмотря на то, что обещанный Большой Ежегодный Национальный Конкурс по Функциональному Программированию пока откладывается (пока на неопределённое время, по крайней мере за грядущий ICFP), подготовленная задача будет очень интересна тем, кто подвизался на поприще искусственного интеллекта.

Старт будет дан утром примерно в 07:00 по московскому времени 05.05.2012. На решение будут даны все так называемые празднично-выходные дни, так что можно будет развернуться хорошо. Ну и оценка на этот раз будет более объективной, нежели просто «выиграл тот, кто первый успел». К тому же, у нас два новых приза: айн и цвай. Второй приз будет распределяться на основе «зрительских симпатий».

Дерзайте!

Предыдущие конкурсы:
1. Август 2011. Задача о возрастах детей математика: условие, результаты.
2. Сентябрь 2011. Кто на ком женат: условие, результаты.
3. Октябрь 2011. Задачи о переправах: условие, результаты.
4. Ноябрь 2011. Задача о надёжности кода: условие, результаты.
5. Декабрь 2011. Задача о конструировании чисел из чисел: условие, результаты.
6. Январь 2012. Расшифровка кода на языке Haskell: условие, результаты.
7. Февраль 2012. Мат в один ход: условие, результаты.
8. Март 2012. Переливание жидкости из сосуда в сосуд: условие, результаты.
9. Апрель 2012. Кельтская алхимия — трансмутация слов: условие, результаты.

Также напоминаю, что у ФП(ФП) теперь есть официальный форум, где вы сможете не только задать вопросы по ФП и получить на них квалифицированные ответы, но и просто поболтать на программистские темы. Заходите, регистрируйтесь, общайтесь.

Если вы хотите дополнительно отблагодарить организатора (то есть меня), но не знаете как, то вам сюда. Собранные благодарности пойдут прямиком в ФП(ФП).

02 мая 2012, 03:41

01 мая 2012

Codedot

Мой второй Node.js-пакет

А вот этого я уже в других языках программирования как-то не видал. Эдакая «лиспо-лямбда» получается:

alexo@codedot:~$ wscat -c ws://localhost:8080/

connected (press CTRL+C to quit)

< (function () {
			socket.say = function(data) {
				data = JSON.stringify(data);
				this.send(data);
			};
		})(undefined)

< (function () {
			socket.say("Hello World!");
		})(undefined)
> "Hello World!"

< (function (data) {
			window.alert(data);
		})("Hello World!")

disconnected

alexo@codedot:~$

Кстати, wscat вчера починили.

01 мая 2012, 19:01

Alexander Kuklev

SIP: Dependent type syntax for Scala

The key feature of dependent type systems is that we can write type-valued functions. Recently I encountered a case I could use such one in Scala for improving code readibility. I want to be able to write Reads(res1, res2) to get (ReadsAbstract {val reads = Set(res1, res2)}. Well, there are no type-valued methods in Scala, but I'm still able to get really close to it:

def ReadsGenerator(res: Resource*) = {

  new {type X = ReadsAbstract {val reads = Set(res:_*)}}

}


Now we can write Reads(res1, res2).X for the purpose I originaly wanted to use Reads(res1, res2) for.

It's worth to define some syntactic sugar for it! First, down with that nasty X. Second, let's add some sugar for generators:

type Reads(res: Resource*) = ReadsAbstract {val reads = Set(res:_*)}

Features:

– Such syntax can be easily extended for support of macro types in exactly parallel fashion to current syntax for macro methods. Like type DbTable(jdbcPath: String, creds: DbCredentials) = macro impl

– With this syntax we also obtain nice syntax for dependent tuples and dependent function types.

I would like to thank Nada Amin (ندى أمين) from EPFL for a very insightful discussion on DOT, the future of the Scala type system.

01 мая 2012, 02:08

30 апреля 2012

thesz

Тут эта...

...[info]awson в Москву собрался приехать, в районе 9-го числа.

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

Про что я расскажу, ещё не знаю, но наверняка будет интересно. ;)

Место встречи ещё не обозначено, как и точное время и дата, к сожалению.

30 апреля 2012, 21:49