06 декабря 2011

Restas и Windows

Updated 07.12.12

Появилась у меня задача: вывести простенький отчет на печать. Покалебавшись между Qt (textedit, webkit), cl-gtk2 и cl-pdf/cl-closure-template, restas и cl-closure-template, я выбрал последнее.

Qt удобен и быстр в разработке, но неудобен в размещении на нескольких клиентских компьютерах, быстрой кастомизации приложения. И даже использование QtScript не решает проблем.

cl-gtk2 и cl-pdf - интересно, но также не решают проблем распространения, статическая объектная модель gtk создает препятствия к наследованию в cl, необходимо писать обертку для pdf/html рендера вручную, или через gir.

Самая интересность заключалась в том, что все должно было работать из-под windows.

Подробно о том, как установить cl в windows: http://habrahabr.ru/blogs/lisp/131418/.

Вкратце:

  • Скачать sbcl https://github.com/akovalenko/sbcl-win32-threads/wiki и установить
  • Скачать quicklisp.lisp.
  • sbcl
    (load "quicklisp.lisp")
    (quickstart:install)
    (quit)
    sbcl
    (ql:add-to-init-file)
    (ql:quickload :swank)
    (ql:quickload :quicklisp-slime-helper)
    
  • Скачать и установить emacs: http://ftp.gnu.org/pub/gnu/emacs/windows/
  • Добавить в $HOME/.emacs
      (load (expand-file-name "~/quicklisp/slime-helper.el"))
      ;; Replace "sbcl" with the path to your implementation
      (setq inferior-lisp-program "sbcl")
  • Если вы используете utf-8 кодировку в файлах, в $HOME/.sbclrc добавить
    (setf sb-impl::*default-external-format* :utf-8)

restas-directory-publisher использует iolib, однако данная библиотека не работает под windows. Для решения небольшой части проблем есть неофициальный форк для windows: http://src.knowledgetools.de/tomas/winapi/index.html.

Определите переменную среды CL_SOURCE_REGISTRY, и задайте ей следующее значение:

(:source-registry (:tree "your/path/to/lisp/libraries") :inherit-configuration)

Перейдите в директорию с библиотеками и скачайте нужную версию iolib

cd "your/path/to/lisp/libraries"
git clone --depth 1 http://src.knowledgetools.de/tomas/winapi/iolib.git

Осталось проверить минимальную работоспособность restas.

sbcl
(ql:quickload :restas)
(restas:define-module #:restas.hello-world
  (:use :cl))
(in-package #:restas.hello-world)
(restas:define-route main ("")
  "<h1>Hello windows world!</h1>")
(restas:start '#:restas.hello-world :port 8080)

Теперь в windows xp i386, windows 7 x86_64 можно совершать разбойные нападения с целью завладения чужим имуществом, в частности, на караваны.

P.S. Есть проблемка с restas-directory-publisher при попытке доступа к директории. iolib.syscall:stat не реализован.

P.S. Листинг директории в restas-direcory-publisher сейчас не содержит дат и размеров файлов.

5 комментариев:

  1. А можно для нубов - что есть "$HOME/.emacs" и "$HOME/.sbclrc"?
    У мня вообще запустить не получается это всё... *паника* :(

    ОтветитьУдалить
    Ответы
    1. HOME, CL_SOURCE_REGISTRY - это переменные среды (Панель управления/Система/Последняя вкладка/Переменные среды)

      HOME указывает на домашнюю директорию пользователя.
      $HOME - это получение значения из этой переменной.

      У себя я сделал директории
      HOME=d:/home/michael

      В этой директории многие программы, в частности emacs и sbcl, хранят пользовательские настройки.

      $HOME/.emacs - настройки emacs.
      $HOME/.sbclrc - настройки sbcl.

      Вот этот путь "your/path/to/lisp/libraries" у меня например такой:
      d:/home/michael/libraries

      Удалить
    2. Спасибо. Я совсем новичок, куча глупых вопросов... :(
      У меня задача заставить работать Максима+Лисп под Windows, что есть Restas пока не в курсе, но думаю доберусь в своё время. :)

      Но пока спотыкаюсь на ровных местах, хоть вроде всё по гайдам делаю. :(
      Например пишу это:
      (:source-registry (:tree "C:/SBCL/Lisp/libraries/") :inherit-configuration)
      Говорит мол "Undefined function :source-registry" и "Undefined function :tree".
      (:output-translations (T ("C:/SBCL/Lisp/fasl-cache/" :implementation)) :inherit-configuration)
      Говорит "illegal function call" и "Undefined function :output-translations".
      А ещё quicklisp сперва не хотел грузиться, еле догадался что в ярлыке SBCL не написана рабочая папка. %)

      Кстати скачать sbcl-1.0.55.7 тут https://github.com/akovalenko/sbcl-win32-threads/wiki не удалось, говорит "Not Found" на все файлы.
      Но нашёл вот тут https://sites.google.com/site/dmitryvksite/sbcl-distr/ некий "sbcl-1.0.45-threads.msi" может поэтому не работает?
      У вас случайно не осталось тех более новых?

      Удалить
    3. У меня только x86_64 версия. Можно скачать здесь:
      https://github.com/downloads/filonenko-mikhail/cltl2-doc-ru/sbcl-1.0.55.3.mswinmt.1182-d7a1816-x86-64.msi


      Максиму под windows запустить проще простого. Для этого нужно:

      установить sbcl (сделано);

      установить quicklisp (сделано), описание здесь
      http://lisper.ru/wiki/libraries:quicklisp

      скачать максиму (я предлагаю свой форк, он полностью совпадает с оригиналом, но проще загружается в sbcl: https://github.com/filonenko-mikhail/embeddable-maxima/zipball/quicklisp)

      распаковать в некоторую директорию;

      в sbcl выполнить следующий код:

      sbcl
      (pushnew "/путь/к/распакованной/максиме" asdf:*central-registry*)
      (ql:quickload :embeddable-maxima)

      Теперь для запуска командной оболочки максимы нужно запустить функцию:
      (cl-user::run)

      Удалить
    4. Работает! Спасибо огромное! =)

      Удалить