Литвек - электронная библиотека >> Nikodemus Siivola >> Lisp, Scheme и др. >> Nikodemus' Common Lisp FAQ >> страница 2
«Как настроить окружение?». Начать изучение можно с M-x slime-cheat-sheet, впрочем, это лишь малая часть возможностей Slime.

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

Для практической работы с Lisp редактор как минимум должен:

• правильно расставлять отсупы в коде Lisp;

• понимать парные скобки;

• уметь выполнять команды Edit Definition, Compile Defun, Eval Expression, Describe Symbol, Disassemble Function, Trace Function, Inspect expression и другие команды для взаимодействия с вашим Lisp'ом;

• взаимодействовать с отладчиком;

• взаимодействовать с инспектором.

Slime умеет все перечисленное и ещё много чего.

Если вам нравится Vi(m), обратите внимание на Slimv, который связывает Vim с частью Slime, написанной на Common Lisp:

http://www.vim.org/scripts/script.php?script_id=2531

https://bitbucket.org/kovisoft/slimv/

http://kovisoft.bitbucket.org/tutorial.html

… но я не могу ручаться за это, поскольку не пользуюсь Vim/Slimv.

Как настроить окружение?

Хорошее руководство (на момент написания) по получению SBCL, Slime и настройке Quicklisp расположено здесь:

http://mohiji.nfshost.com/2011/01/modern-common-lisp-on-linux/

http://mohiji.nfshost.com/2011/01/modern-common-lisp-on-osx/

Указания по настройке Clisp на Windows. Впрочем, нельзя объять необъятное:

http://mohiji.nfshost.com/2011/01/modern-common-lisp-on-windows/

А GUI есть?

И да, и нет. Одного GUI, которым пользовались бы все, нет.

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

В лагере отрытого кода тоже есть несколько решений.


CommonQt — это привязка Common Lisp к библиотеке smoke для Qt:

http://common-lisp.net/project/commonqt/


LTK построена поверх Tk:

http://www.peter-herth.de/ltk/


CL-GTK2 и CLG — привязки к GTK+, но я не могу ничего сказать про текущее состояние этих разработок.

Стоит также посмотреть на GTK Server.

http://common-lisp.net/project/cl-gtk2/

http://sourceforge.net/projects/clg/

http://www.gtk-server.org/


CLIM (Common Lisp Interface Manager) — это почти стандартизированная спецификация API для GUI, довольно сильно отличающаяся от GUI, перечисленных выше. Не ожидайте, что все будет знакомо и понятно.

http://random-state.net/files/how-is-clim-different.html

Многие клянутся, что это лучшее, что есть для построения GUI, другие утверждают, что это совсем не так. Как бы то ни было, большинство коммерческих Lisp'ов реализуют CLIM, и еще есть переносимая открытая библиотека, называемая McCLIM, довольно удобная, хотя в последнее время не особо развиваемая.

http://common-lisp.net/project/mcclim/


CLX — это переносимый низкоуровневый Lisp-интерфейс к X11, предоставляющий уровень абстракций, сопоставимый с Xlib.

http://www.cliki.net/CLX

https://github.com/sharplispers/clx


Если не строго ограничиваться вопросами GUI, буду неправ, если не упомяну CL-OPENGL, переносимую привязку к API OpenGL, GLU и GLUT:

http://common-lisp.net/project/cl-opengl/

Какие есть форумы?

Не форум конечно, но есть Planet Lisp — агрегатор блогов по Common Lisp. Много интересной информации, без избытка.

http://planet.lisp.org/


LispForum — просто хороший форум:

http://www.lispforum.com/

но я не ручаюсь, поскольку бываю там нечасто.


Есть ещё группы comp.lang.lisp на Usenet/Google Groups, но они густо населены троллями. Пишущие там авторы довольно грамотны, при этом спекуляции профанов — рядовое явление. Читать эти группы может быть тяжело, но чтобы пользоваться Lisp'ом, читать их не обязательно.

http://groups.google.com/group/comp.lang.lisp


Специализированные списки рассылки имеют намного лучшее отношение сигнал/шум. Все реализации стараются завести собственные пользовательские и справочные списки рассылки, большинство библиотек также создают собственные списки рассылки. Для SBCL есть, например, это:

https://lists.sourceforge.net/lists/listinfo/sbcl-help


Среди open-source разработчиков и пользователей популярен канал #lisp на freenode.org. Имейте, впрочем, ввиду, что на #lisp довольно жестко придерживаются темы, и эта тема Common Lisp, а не «Lisp вообще». Для этого есть канал #lispcafe с гораздо более мягкими правилами.


Довольно активно сообщество разработчиков игр, но я не особо с ним знаком. Гугл вам в помощь.


Профессионалы Common Lisp общаются в списке «pro». Обсуждение других диалектов Lisp'а является офтопиком, вопросы новичков НЕ принимаются.

http://lists.common-lisp.net/mailman/listinfo/pro

Свойства языка

Как скомпилировать файл?

Короткий ответ: запускаете Lisp и печатаете:

(compile-file "/path/to/myfile.lisp")

Затем, скорее всего, вам потребуется загрузить (load…) компилированный файл.


Развернутый ответ: большинство компилируемых языков неинтерактивны — вы компилирует файл из командной строки или IDE, затем запускаете компилированный файл. В Lisp'е все не так.

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

Обычно взаимодействие происходит с запущенным Lisp-процессом, который содержит рабочую сессию, в которую вы интерактивно добавляете код.

Например:

1. открываем Emacs, с помощью M-x slime запускаем Slime и Lisp;

2. с помощью, к примеру, ASDF, загружаем имеющийся код;

3. открываем нужный файл, правим функцию и нажимаем C-c C-c, что приведет её перекомпиляции;

4. переходим в Slime REPL и тестируем изменения;

5. повторяем с шага 3.


Упомянутая выше аббревиатура ASDF расшифровывается как «Another System Definition Facility». Этой система позволяет указать способ сбора нескольких файлов в единую систему для их загрузки или компиляции одной командой. Чем-то походит на Make.

Как сделать исполняемый файл?

Ответ зависит от используемой вами реализации. Смотрите в документации. Если говорить про SBCL:

;; Загружаете приложение в SBCL, затем выполняете команду save-lisp-and-die.

;; Точка входа в приложение — MY-FUNCTION.

(save-lisp-and-die "my.exe":executable t: toplevel 'my-function)

FUNCALL и APPLY — в чем разница, что использовать?

Короткий ответ: везде, где можно используйте FUNCALL, в остальных случаях используйте APPLY.


Развернутый ответ: при вызове FUNCALL должно быть известно количество аргументов. APPLY (и MULTIPLE-VALUE-CALL) не требует информации о количестве аргументов.

(defun map-list-with-1 (function list arg)

     (mapcar (lambda (elt)

                 (funcall function elt arg))

              list))


(defun map-list-with-n (function list &rest args)