Иногда хочется сделать из своего кода на lisp бинарный файл, который можно было бы запустить в другой системе. Довольно краткий обзор по этой проблеме представлен ниже. Ознакомившись с ним, читатель поймёт куда дальше копать.
Эта заметка стара и датируется 12 годом, возможно сейчас технологии ушли далеко вперёд или наоборот умерли за ненадобностью. Я просто решил перенести её со своего прошлого блога, для того, чтобы объединить все свои знания по lisp на этом портале. К тому же, надеюсь, что кому-то даже такие знания окажутся полезными.
Создание бинарных файлов. Для этого нужен ECL. В репозиториях ubuntu есть, в репозиториях simply не нашёл. В любом случае я качал с git, который указан на официальном сайте. Там версия новей (12.7 на текущий момент).
git clone git://git.code.sf.net/p/ecls/ecl ecl # ECL source code
Скачиваем из git исходные файлы. Затем конфигурируем, компилируем, и устанавливаем:
cd ./ecl ./configure --prefix=/usr/local make make install
В ubuntu теперь доступно по псевдониму ecl в simply путь: /usr/local/bin/ecl
Да, компилироваться будет долго. Теперь несколько команд внутри самого ecl для компиляции:
(compile-file "hello.lisp" :system-p t) (c:build-program "myecl" :lisp-files '("hello.o")) (quit)
вводить либо по очереди, либо все вместе и потом ещё enter.
Вообще ecl не обязателен. Можно компилировать и в sbcl, только файлы получаются размером в 44 МБ. Потому что там кроме файла ещё и сам sbcl весь лежит 😀
(sb-ext:save-lisp-and-die "my-program.exe" :executable t :toplevel #'main)
И напоследок функция, для получения argv в lisp:
(defun my-command-line () (or #+SBCL *posix-argv* #+LISPWORKS system:*line-arguments-list* #+CMU extensions:*command-line-words* #+ECL ext:*command-args* nil))
P.S: Проблема в simply-linux решилась простым обновлением. Я взял sbcl 1.0.0.58, скомпилировал у себя и установил, кроме того я взял новый slime. Вот и всё. И мне кажется, что проблема больше в slime. Вот текст конфигурационного файла для simply, старые версии компилятора и slime я не удалял.
(setq inferior-lisp-program "/usr/local/bin/sbcl") (add-to-list 'load-path "~/slime/") (require 'slime) (slime-setup)
Почему мой файл весит 50 мб?!
Возможно это по причине того, что создавался он с помощью sbcl. В этом случае, как и было описано в статье внутри файла лежит сам sbcl. С этим уже ничего не поделать.
sbcl поддерживает сжатие образа (см. в мануале, раздел «Saving a core image»).
Так же можно попробовать еще провернуть фокус, описанный в https://gist.github.com/burtonsamograd/f08f561264ff94391300
Но этот метод еще нужно дорабатывать, плюс он может потребовать некоторой доработки. Clozure CL, если я правильно помню, генерирует образы поменьше
Спасибо за информацию 🙂
Спасибо автору за блог. Это хорошее, нужное дело, так как лисп определённо заслуживает больше любви)
Приятно слышать, что блог пригодился кому-то ещё 🙂
у меня тоже самое
У меня не собирается ecl, пишет
no such file or directory: ./configure
Возможно ты забыл перейти в каталог с ecl:
cd ./ecl
Спасибо огромное! у меня получилось!