Пакеты Python: distutils или setuptools
Недавно в обсуждении одного бага funcparserlib всплыла тема установки пакетов Python. Раньше я пользовался модулем setuptools и частично связанной с ним утилитой easy_install. Однако из-за проблем с ним я решил попробовать использовать модуль distutils, идущий в поставке Python и являющийся официальным способом установки пакетов Python.
Есть разные претензии к setuptools (см. посты в блогах Brett Cannon и James Bennett), Здесь я кратко скажу о моих собственных. Во-первых, setuptools не создаёт промежуточные каталоги при setup.py install. Во-вторых, интерпретатор Python при старте сканирует слишком много файлов и каталогов. Возможно, это связано с форматом пакетов eggs модуля setuptools, хотя может и нет. Наконец, setuptools привносит дополнительную сложность по сравнению с distutils, а пользы от него — только в более простой установке скриптов, команде setup.py develop и описании зависимостей.
Все эти вещи можно сделать и без setuptools. Скрипты можно ставить обычным копированием с помощью distutils. Команду develop можно заменить созданием символьной ссылки из каталога в PYTHONPATH на каталог разработки. В плане зависимостей интересна утилита pip, но пока что easy_install кажется удобнее.
Непрерывная сборка с inotify-tools
Из этого поста узнал о программе inotify-tools. Теперь порой использую утилиту inotifywait для постоянной сборки моего проекта при изменении каких-нибудь его файлов. Например, вот небольшой скрипт, позволяющий видеть отрендеренную версию статьи всё время при её редактировании:
#!/bin/sh
while true; do
inotifywait -e MOVE_SELF,MODIFY,CLOSE_WRITE ../wiki/*.md img/*
sleep 1
make --quiet
done
Очень удобная штука!
Вопрос: насколько правильно при каждом сохранении выполнять анализ корректности программы/статьи? Можно смотреть на это так. Либо это заставляет больше стараться, чтобы при каждом сохранении иметь синтаксически корректную программу, либо добавляет ответственности при написании кода и упорядочивает мысли.
Курс по языкам программирования осенью 2009
В осеннем семестре 2009 я читаю лекции по языкам программирования на кафедре АиВТ в Политехе. На странице курса я буду выкладывать слайды и другие материалы по курсу. За обновлениями можно следить через блог курса.
Функциональные комбинаторы парсеров в Python
С некоторого времени я стал делать на Python часть моих повседневных задач по анализу языков, трансляторам и пр. Вначале для вспомогательных целей, а потом и для парсинга небольших языков, прототипирования грамматик, деревьев AST, трансформаций кода. Многие при этом подумают про OCaml, но в Unix-среде (привет spb-archlinux!) от Python с его библиотеками пользы больше.
Для задач парсинга я написал библиотеку funcparserlib. Эта библиотека предназначена для создания парсеров по методу рекурсивного спуска на основе функциональных комбинаторов. Также я написал вводное руководство по funcparserlib (на английском), которое будет интересно всем, увлекающимся функциональным программированием (FP) и/или языком Python. Рекомендую его почитать!
Вот, например, такие картинки деревьев можно легко получать с помощью funcparserlib:
>>> print dotparser.pretty_parse_tree(tree)
Graph [id=g1, strict=False, type=digraph]
`-- stmts
|-- Edge
| |-- nodes
| | |-- n1
| | |-- n2
| | `-- SubGraph [id=n3]
| | `-- stmts
| | |-- Edge
| | | |-- nodes
| | | | |-- nn1
| | | | |-- nn2
| | | | `-- nn3
| | | `-- attrs
| | `-- Edge
| | |-- nodes
| | | |-- nn3
| | | `-- nn1
| | `-- attrs
| `-- attrs
`-- Edge
|-- nodes
| |-- SubGraph [id=n3]
| | `-- stmts
| `-- n1
`-- attrs
Итак, предлагаю взглянуть на руководство, а питонистам — попробовать funcparserlib, посмотреть другие доки и примеры на сайте библиотеки.
Дальше идут особенности funcparserlib, сравнение с pyparsing и LEPL, история библиотеки…
Монады в OCaml
В блогах уже есть, конечно, рассказы о монадах в OCaml, например, A Monad Tutorial for OCaml и Syntax Extension for Monads in OCaml. Однако меня интересовало воссоздание соответствующих классов типов Haskell при помощи параметрических модулей (вот пост про соответствие между ними).
Вот «иерархия» модулей, расширяющих функтор до монады. Полезные комментарии к соответствующим классам Haskell есть в статье The Typeclassopedia из The Monad.Reader.
module type FunctorType =
sig
type 'a t
val map : ('a -> 'b) -> 'a t -> 'b t
end
module type PointedType =
sig
include FunctorType
val pure : 'a -> 'a t
end
module type ApplicativeType =
sig
include PointedType
val (<*>) : ('a -> 'b) t -> 'a t -> 'b t
end
module type MonadType =
sig
include ApplicativeType
val join : 'a t t -> 'a t
val (>>=) : 'a t -> ('a -> 'b t) -> 'b t
val (>>) : 'a t -> 'b t -> 'b t
end
Здесь уже видно, что не всё получается как в Haskell. Сигнатуры модулей не позволяют привести значение терма по умолчанию.
Upd: Выложил полный исходник с примерами в pastebin.
Команда spb-archlinux на ICFPC 2009
Никак не возьму в привычку чаще писать в блог. Но на этот раз повод действительно есть. Наша команда spb-archlinux принимала участие в программерском конкурсе ICFP Contest 2009 :)
Ниже рассказ об этом. Если вкратце, было весело! :)
Upd: В финальной таблице результатов мы заняли 95 место с 1826 очками.
Курс по языкам программирования
Закончилась зимняя сессия, время рассказать о прочитанном курсе и подвести небольшие итоги.
В осеннем семестре 2008 читал в Политехе курс лекций «Языки программирования» студентам 5-ого курса кафедры АиВТ. Идеей было дать общий подход к рассмотрению языков, познакомить с функциональным программированием, рассмотреть некоторые компромиссы при проектировании языков. Курс наполовину основан на SICP и языке Scheme, а вторая половина посвящена сравнительному обзору языков C, C++, Python и Java.
Поделюсь впечатлениями о курсе. Во-первых, наши студенты имеют весьма туманные навыки программирования, немного грустно :( Думаю, такое характерно для большинства вузов, хотя наверняка есть и исключения. Они написали к 5-ому курсу слишком мало программ (к тому же весьма простых), и не в состоянии нормально чувствовать и рассуждать о проблемах борьбы со сложностью в программировании. Во-вторых, в курсе получился большой перекос в сторону основ ФП и Scheme в противовес передаче сообщений, параллельности, малым языкам и т. д. Наконец, чтение курса помогает заострить внимание на моментах, которые иначе не были бы замечены и систематизированы.
Теперь есть мысли о нескольких лекциях или семинарах по сетевому и распределённому программированию. Кажется, уже достаточно много важных и интересных вещей могу сказать по этому поводу.
Студентов поздравляю с Татьяниным днём :)




