вторник, 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 есть навигация по символам, так что программу можно использовать, если нужно разбораться в чужом проекте. Общий вердикт - очень сырая и весьма неудобная.

понедельник, 14 февраля 2011 г.

Gtk2 и Haskell

Будем считать, что вы уже скачали Gtk2-Bundle и распаковали его в c:\gtk. Также вы прописал в переменной окружения PATH пути: c:\gtk\bin;c:\gtk\lib. Теперь необходимо установить gtk2hs-buildtools, который в свою очередь потребует установит пакет alex:
cabal install alex
Пакет alex собирается в %APPDATA%\cabal\bin, и поэтому этот путь также нужно включить в список PATH.
Теперь можно поставить gtk2hs-buildtools:
cabal install gtk2hs-buildtools
А теперь можно поставить и gtk:
cabal install gtk
Подождите несколько минут... и скомпилируйте вот этот код, чтобы удостовериться, что всё прошло нормально (x.hs назовем этот файл):
module Main where
import Graphics.UI.Gtk
main::IO()
main = do
        initGUI
        window <- windowNew
        l <- labelNew (Just "GTK2")
        containerAdd window l
        onDestroy window mainQuit
        widgetShowAll window
        mainGUI
Проверьте этот код в режиме интерпретации и в режиме компиляции:
ghci x.hs 
ghc --make x.hs -o test
test
Заметка: при запуске программы в режиме интерпретации может вылетать ошибка unknown symbol `_cairo_surface_destroy'. Дискуссия по этой проблеме ведется здесь и тут.
Отмечу, что у меня при установленной ghc-6.12.3+gtk-2.22 вылетала эта ошибка. Однако, при использовании Haskell Platform 2010 + gtk-2.18 накладок не возникло (связку Haskell Platform 2010 + gtk-2.22 проверю позже).

четверг, 10 февраля 2011 г.

Отвлекаемся - проверка орфографии в Eclipse

Самый простой способ - использовать словари ASpell:

mkdir d:\eclipse\dict
cd d:\eclipse\dict
aspell dump master en | iconv -f koi8-r -t utf-8 > en.dict
aspell dump master ru | awk -F/ '{print $1}' | iconv -f koi8-r -t utf-8 > ru.dict
cat en.dict ru.dict > en-ru.dict



Созданный словарь можно установить так: идем в Window -> Preferences... и выбираем раздел General -> Editors -> Text Editors -> Spelling. После этого добавляем словарь (поле User defined dictionary).

Готовый файлик словаря можно взять здесь. В этом файле по одному слову на строку. Словарик хоть неполный, но достаточный.  Дополнить его несложно - нужно дописать недостающие слова в конец файла (ну или в середину, а можно и в начало).

По мотивам:http://www.simplecoding.org/proverka-orfografii-v-eclipse.html

среда, 9 февраля 2011 г.

Eclipse и Haskell

Внимание! Статья старая и уже неактуальная! Если вы ищете IDE для Haskell, то прочитайте Заметки об IDEшках для Haskell.

Что вы получите, прочитав этот текст: элементарно, вы получите Eclipse, способный работать с языком Haskell.



Моя конфигурация:
  • Eclipse Helios: 3.6.1
  • GHC: 6.12.3
  • msys, msysDTK;
  • MinGW (попробуйте последнюю версию). Желательно заполучить именно MinGW, под Cygwin не соберется необходимый пакет - network.
  • Windows Vista Home Premium SP2 32bit
Ставим на загрузку Eclipse Helios (если у вас его ещё нет) и в это время выполняем следующие команды:

git clone git://github.com/JPMoresmau/scion.git
cd scion
cabal update
cabal install cabal-install (может не сработать! - не беда)
cabal install happy
cabal install HUnit
cabal install QuickCheck
cabal install network


cabal install -fcabal_1_8


На этом этапе могут возникнуть следующие проблемы:

  • ошибка линковки, при которой сборщик будет ругаться на библиотеку network. Решение: попробуйте переустановить ghc и пересобрать все пакеты с использованием MinGW + msys.
  • при установке scion cabal.exe ругается фразой permission denied. На эту ошибку можно не обращать внимания. Возможно, cabal.exe просто бесправная программа. Возьмите собранный сервер в папке dist/build.

git clone git://github.com/JPMoresmau/eclipsefp.git

Запустим Eclipse и установим модуль Multi Project Import/Export для чего добавим адрес
http://eclipse-tools.sourceforge.net/updates/ в список адресов, по которым Eclipse будет искать модули (меню Help->Install Software...->Add.). После того, как Eclipse скачает список модулей, доступных по этому адресу, найдем в этом списке модуль с нужным именем и установим его.


Экспортируем все проекты из ранее созданной командой git директории eclipsefp, воспользовавшись File->Import->Other->Multiple projects.


Собираем все, что экспортировали (если не соберется выделите все проекты и нажмите Refresh, после чего продолжите сборку. Если это не поможет, попробуйте вот этот патч).


Заходим Run->Run Configurations...->Eclipse Application. Создаем новую конфигурацию (называем её Haskell, например). Оставляем настройки по умолчанию и жмем на кнопку Run. После этого откроется новое окно. Подождите... Может быть потребуется вручную указать расположение Scion-сервера (Windows->Preferences->Haskell->Scion and Cabal):





Хочу заметить, этот мануал не исключение и второй раз не проверялся :)

По мотивам:
http://www.haskell.org/pipermail/beginners/2010-April/004028.html
http://eclipsefp.sourceforge.net/build.html
http://trac.haskell.org/network/ticket/20
http://neilmitchell.blogspot.com/2010/12/installing-haskell-network-library-on.html

Может пригодиться: