вторник, 22 мая 2012 г.

Первые впечатления от IntelliJ IDEA в применении к Haskell

IntelliJ IDEA Community Edition - OpenSource реализация известной IDE. После установки (Preferences -> Plugins -> Browse Repositories...) Haskell Plugin начинает поддерживать Haskell.

Точно есть:
  • подсветка синтаксиса;
  • REPL консоль (Tools -> Haskell REPL).
  • возможность управлять своими задачами и контекстами (Tools -> Task & Contexts).
К удивлению не заработал автокомплит и в окошке Structure не показываются функции, структуры данных, классы. То есть навигации по коду, в общем, нет. Не умеет создавать и управлять cabal-файлами. То есть поддержка Haskell самая базовая.

Особых приемуществ, по сравнению с настроенным Emacs, не обнаружил. Разве что управление задачами интересно реализовано.


понедельник, 21 мая 2012 г.

Сборка Leksah для Mac OS X


Здесь собраны заметки, написанные по ходу сборки Leksah под Mac. Готовая сборка для Mac есть на родном сайте - http://leksah.org/download.html. Есть вероятность, что она у вас запустится.

Устанавливаем leksah-0.12.0.3 и leksah-server-0.12.0.5 под 64-х битную Mac OS X 10.6.

Считаем, что у нас имеется ghc-7.0.4 (сборка будет работать только для ghc-7.0). На момент написания статьи ghc-7.0.4 входил в состав Haskell-Platform-2011.4.

Устанавливаем haddock-2.9.2 с alex-2.3.5

Для сборки haddock-2.9.2 потребуется alex-2.3.5. С другой версией alex пакет haddock может не собраться, так что: cabal install alex-2.3.5 
PATH=~/Library/Haskell/ghc-7.0.4/lib/alex-2.3.5/bin:$PATH cabal install haddock-2.9.2

Устанавливаем порты с поддержкой +no_x11 +quartz

port clean cairo
port install cairo +no_x11 +quartz
port clean pango
port install pango +no_x11 +quartz
port clean gtk2
port install gtk2 +no_x11 +quartz
port install ige-mac-integration 
port install gtksourceview2 +no_x11 +quartz

Кстати, без GTK без X11 работает намного лучше, чем GTK с X11. Советую под Mac всегда ставить GTK с Quartz. Например, у меня в GTK с X11 не работает смена раскладки клавиатуры.

Собираем gtk-mac-integration

Забираем последнюю версию gtk-mac-integration отсюда - http://ftp.acc.umu.se/pub/gnome/sources/gtk-mac-integration/1.0/. Распаковываем архив и стандартным методом "configure-make-make install" ставим gtk-mac-integration в /opt/local.

Устанавливаем haskell-пакет для gtk-mac-integration:

cabal install gtk-mac-integration

Устанавливаем GTK для Haskell

cabal install gtk2hs-buildtools
cabal install cairo glib pango

Патчим gtk-0.12.3

Скачиваем исходник gtk-0.12.3 с Hackage. Заходим в файл Graphics/UI/Gtk/General/hsgthread.c и удаляем строчку, в которой инклудится gthread.h.

Если этого не сделате, то словите ошибку:

[207 of 207] Compiling Graphics.UI.Gtk ( dist/build/Graphics/UI/Gtk.hs, dist/build/Graphics/UI/Gtk.p_o )
In file included from Graphics/UI/Gtk/General/hsgthread.c:29:0:
/opt/local/include/glib-2.0/glib/gthread.h:28:2:
error: #error "Only can be included directly."

Собираем gtk-0.12.3

cabal configure --flags="have-quartz-gtk"
На всякий случай нужно проверить файл dist/setup-config на наличие там строчки: (FlagName "have-quartz-gtk",True)
cabal build
cabal install

Устанавливаем gtksourceview2-0.12.3

Если устанавливать gtksourceview2 из Hackage, то он не установится:

Preprocessing library gtksourceview2-0.12.3...
dist/build/Graphics/UI/Gtk/SourceView/Types.h:1:28: error: gtksourceview2.h: No such file or directory
gtk2hsC2hs: Error during preprocessing custom header file

Поэтому скачиваем исходник, добавляем в находящийся там файл gtksrouceview2.h строчку

#include <gtksourceview/gtksourceview.h>


и копируем gtksourceview2.h в /opt/local/include/gtksourceview-2.0.

Теперь собираем gtksourceview2 из исходников:

cabal configure --extra-include-dirs=/opt/local/include/gtksourceview-2.0
cabal build
cabal install

Подготовительные действия закончены

cabal install --extra-lib-dirs=/usr/lib leksah-server
cabal install --extra-lib-dirs=/usr/lib leksah


Здесь --extra-lib-dirs=/usr/lib указывает путь до libiconv.

или
cabal install leksah --constraint="haddock < 2.9.4" 
если у вас уже стоят другие haddock'и.

Напоследок

  • Если собирать gtk-mac-integration с +universe, то Leksah не поставится.
  • Видите такое сообщение про сборке?

Undefined symbols:
  "_gdk_x11_drawable_get_xid", referenced from:
      _s2YlN_info in libHSgtk-0.12.3.a(Structs.o)
ld: symbol(s) not found
collect2: ld returned 1 exit status

Диагноз - пакет gtk-0.12.3 собран без поддержки quartz. Нужно пересобрать GTK.
  • При запуске программа может шуметь:
objc[84915]: Class GtkApplicationDelegate is implemented in both /opt/local/lib/libigemacintegration.0.dylib and /opt/local/lib/libgtkmacintegration.0.dylib. One of the two will be used. Which one is undefined.
objc[84915]: Class GtkApplicationNotificationObject is implemented in both /opt/local/lib/libigemacintegration.0.dylib and /opt/local/lib/libgtkmacintegration.0.dylib. One of the two will be used. Which one is undefined.
objc[84915]: Class GNSMenuBar is implemented in both /opt/local/lib/libigemacintegration.0.dylib and /opt/local/lib/libgtkmacintegration.0.dylib. One of the two will be used. Which one is undefined.
objc[84915]: Class GNSMenuItem is implemented in both /opt/local/lib/libigemacintegration.0.dylib and /opt/local/lib/libgtkmacintegration.0.dylib. One of the two will be used. Which one is undefined.
Using default Yi configuration


Это из-за того, что в системе установлен и ige-gtk-integration и gtk-mac-integration.

Заметки об IDE для Haskell

Побродил по интернету и посмотрел, какие бывают IDE для разработки на Haskell. Оказалось, что рабочих решений мало. Кажется, что Emacs'у и VIM'у в этой области альтернатив нет.

Что умеет Emacs?

Emacs (с установленным haskell-mode) умеет:
  • Emacs подсвечивает синтаксис;
  • Emacs умеет запускать интерпретатор в отдельном буфере (С-с С-l);
Буфер с запущенным процессом GHCI

  • Emacs умеет работать с тегами (etags). Таблицу тегов (TAGS) можно построить при помощи hasktags. Теги позволяют релизовать кое-какой автокомплит.
Автодополнение по таблице тегов
  • Emacs умеет выдавать справку по символам (C-c C-i).
Просмотр сигнатуры символа fst
Для удобства Emacs был немного допилен:
  • таблица тегов перестраивается при помощи правила в Makefile'
  • tags::
        hasktags -e `find . -type f -name "*.hs"`
  • для удобного использования hlint написана функция:
(defun hlint-recursive ()
  "Run hlint."

  (interactive)
  (let* ((file (buffer-file-name (current-buffer)))
(command (concat "~/Library/Haskell/bin/hlint $(find . -name \"*.hs\")")))
(save-some-buffers (not compilation-ask-about-save) nil) ; save  files.
(compile-internal command "No more errors or warnings" "hlint-recursive"
  nil hlint-regexp-alist)))


hlint-recursive бегает по файлам проекта и ищет известные ей баги. Результат выдается в отдельном буфере с возможностью прыгнуть прямо к строчке с багом.

А если не Emacs?

EclipseFP - поддержка Haskell в Eclipse. Проект довольно большой, у меня установился, но работать отказался.

Есть также IDE, написанная на Haskell. Называется Leksah. По-моему, для разработки применять Leksah нельзя. В Leksah есть навигация по символам, так что программу можно использовать, если нужно разбораться в чужом проекте. Общий вердикт - очень сырая и весьма неудобная.