19 января 2011

Common Lisp. Начало

Не очень хочеться делать контрольные касающиеся экономики, бухгалтерии и прочей управленческой деятельности. Видимо будут хвосты. Но зато у меня есть линукс (пусть даже в виде ubuntu), и теперь у меня есть желание дотронуться до самых святых, common lisp'a.

Инсталляция
sudo apt-get install -y emacs slime sbcl cl-asdf
Настраиваем emacs. Для этого необходимо самим emacs'ом открыть файл настроек по умолчанию:
emacs $HOME/.emacs
Все, что следует после знака ; "точка с запятой" считается комментарием. Вы чувствуете где бы вы могли обойтись без двух наклонных черт. Нет не в url.
В конец файла добавьте следующие строки:
;; Set up the Common Lisp environment
;; Настройка Common Lisp окружения
(add-to-list 'load-path "/usr/share/common-lisp/source/slime/")
(setq inferior-lisp-program "/usr/bin/sbcl")
(require 'slime)
(slime-setup)
Поздравляю это первый hello world. Только он звучит по-другому. Вы с помощью emacs диалекта lisp рассказали, что нужно делать текстовому редактору когда он запускается. Первое слово за открывающей скобой интерпретируется как команда/функция, остальные элементы разделенные пробелом - параметры. Первые две строки - установка переменных. Третья строка загрузка пакета. Четвертая строка вызов функции из загруженного пакета. Я могу быть немного неточным, зато объяснение не сложное.
Вам необходим sbcl. Однако Вы его уже установили с помощью "коровьей суперсилы".

Дополнительная настройка текстового редактора
Многое написано о текстовом редакторе emacs. Прочитайте о нем поподробнее.... и через, хм... две недели возвращайтесь к данной заметке. Или пока не задумывайтесь.
;; Text and the such
;; Use colors to highlight commands, etc.
(global-font-lock-mode t) 
;; Disable the welcome message
(setq inhibit-startup-message t)
;; Format the title-bar to always include the buffer name
(setq frame-title-format "emacs - %b")
;; Display time
(display-time)
;; Make the mouse wheel scroll Emacs
(mouse-wheel-mode t)
;; Always end a file with a newline
(setq require-final-newline t)
;; Stop emacs from arbitrarily adding lines to the end of a file when the
;; cursor is moved past the end of it:
(setq next-line-add-newlines nil)
;; Flash instead of that annoying bell
(setq visible-bell t)
;; Remove icons toolbar
(if (> emacs-major-version 20)
(tool-bar-mode -1))
;; Use y or n instead of yes or not
(fset 'yes-or-no-p 'y-or-n-p) 

Теперь нажмите ctrl-x-s. Файл сохранится. Закройте emacs.

Запуск
Запустите emacs. Нажмите alt-x, напишите slime в появившемся мини-буфере. Нажмите enter.
Вы получите строку-приглашение для ввода команд
CL-USER>
В действительности был запущен процесс sbcl и потоки ввода/вывода перенаправлены прямо в буфер emacs.

Первые шаги
Введите 10, нажмите ввод.
CL-USER>10
10
CL-USER>

Ну вот первое программирование в стиле REPL (чтение, вычисление, вывод, и снова). Интерпретатор прочел 10. Вычислил 10. Получил 10, вывел его. И снова ждет вашей команды. Кто-бы мог подумать три поколения назад, что будет устройство целиком и полностью преданное Вам.
Давайте что-нибудь посложнее.

CL-USER> (+ 5 8)
13
CL-USER>

Ну вот опять. Здесь правда немного сложнее. Вы ввели список. lisp список обработал, т.е. вычислил. Вычисление происходит по правилу: первой элемент списка - команда, остальные разделенные пробелами - параметры. Хм, кажется это уже где-то было. Ах да, emacs конфигурируется подобным образом. В данном случае команда + "плюс". Параметров два: 5 и 8. Результат команды число 13. Попробуйте сложить большее количество чисел.
- А теперь,- спросите Вы,- где же мой любимый char[]/std::string/QString/gstring/что-то_там_из_winapi,
CL-USER> "Здраствуй, мир"
"Здраствуй, мир"
CL-USER>

Ничего у Вас не должно получиться, потому что slime ничего не знает о русском языке. Для того, чтобы исправить ситуацию, откройте файл настроек .emacs. Нажмите ctrl-x-f, затем введите .emacs и нажмите ввод. В конец файла добавьте две строки:
(set-language-environment 'utf-8)
(setq slime-net-coding-system 'utf-8-unix)

Перезапустите emacs. Опять введите строку "Здравствуй, мир". Как и с числом произошло вычисление объекта. Все просто: строка вычисляется в строку.
Теперь давайте вызовем какую-нибудь функцию. Какая там в си самая популярная? Наверно, printf. Итак пробуем:
CL-USER>(format t "Здраствуй, мир")
"Здраствуй, мир"
NIL
CL-USER>
Произошла буква E из REPL. Функция format вывела строку в stdout. А далее вернула объект NIL. И буква P из REPL вывела нам результат выполнение format, т.е. NIL.

На этом пока все.

Список использованных источников
How to set up Emacs + SLIME + SBCL under GNU/Linux
Русский перевод Practical Common Lisp

Комментариев нет:

Отправить комментарий