«Как настроить окружение?». Начать изучение можно с 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.
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/
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
Развернутый ответ: большинство компилируемых языков неинтерактивны — вы компилирует файл из командной строки или 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.
Развернутый ответ: при вызове 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)
Как настроить окружение?
Хорошее руководство (на момент написания) по получению 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)