Загрузка пакетов в Progn в Common Lisp - PullRequest
0 голосов
/ 20 февраля 2019

Я пытаюсь создать простую форму, которая автоматизирует загрузку Slynk на изображение.

Пока у меня есть это:

(progn 
    (load "/home/user/asdf.lisp")
    (format t "~% Loaded ASDF")
    (push "/home/user/.emacs.d/elpa/sly-20180708.712/slynk/" asdf:*central-registry*)
    (format t "~% Added SLYNK path to ASDF:*CENTRAL-REGISTRY*")
    (asdf:load-system :slynk)
    (format t "~% Loaded ASDF system")
    (slynk:create-server :port 4007  :dont-close t)
    (format t "~% Created SLYNK server on port 4007")
    (setf slynk:*use-dedicated-output-stream* nil)
    (format t "~% Set *USE-DEDICATED-OUTPUT-STREAM* to NIL"))

Проблема в том, что всякий раз, когда яПопробуйте оценить эту форму в REPL, я получаю следующую ошибку:

Error: "ASDF" is not a known package.

Restart actions (select using :continue):
 0: Return NIL
 1: Return to Top Level (an "abort" restart).
 2: Abort entirely from this (lisp) process.
[1] CL-USER(4): 

До этого момента отпечатки еще не появлялись.То есть, похоже на ошибку в первой push строке.Насколько я понимаю, он еще не загрузил пакет и пытается сослаться на его символ.

Как изменить форму, чтобы она работала?Ниже приведены аналогичные ситуации в форме.

PS Когда каждая строка выполняется сама в указанном порядке, все работает отлично.

1 Ответ

0 голосов
/ 20 февраля 2019

Ошибка происходит от read, когда он пытается проанализировать всю форму progn, и видит asdf: префикс пакета .

. Вы должныload asdf перед читатель видит код с префиксом пакета asdf: и load slynk перед вы используете префикс :slynk, вДругими словами, передавайте ваши progn формы в Lisp один за другим (как вы говорите в своем PS).

Другой способ - поместить все внутри вашего progn в Отдельный файл и загрузите его.Вы также хотели бы сделать переменные "20180708.712" и 4007, например,

(defvar *sly-version* "20180708.712")
(defvar *slynk-port* 4007)
(load "load-and-start-slynk.lisp")

и load-and-start-slynk.lisp:

(load "/home/user/asdf.lisp")
(format t "~% Loaded ASDF")
(push (concatenate 'string "/home/user/.emacs.d/elpa/sly-"
                   *sly-version* "/slynk/")
      asdf:*central-registry*)
(format t "~% Added SLYNK path to ASDF:*CENTRAL-REGISTRY*")
(asdf:load-system :slynk)
(format t "~% Loaded ASDF system")
(slynk:create-server :port *slynk-port* :dont-close t)
(format t "~% Created SLYNK server on port ~D" *slynk-port*)
(setq slynk:*use-dedicated-output-stream* nil)
(format t "~% Set *USE-DEDICATED-OUTPUT-STREAM* to NIL")

PS.Просто чтобы показать, как злоупотреблять силой Лиспа, вот как сделать то, что вы пытаетесь сделать:

(defun load-and-start-slynk (port version)
  (load "/home/user/asdf.lisp")
  (format t "~% Loaded ASDF")
  (push (concatenate 'string "/home/user/.emacs.d/elpa/sly-" version "/slynk/")
        (symbol-value (find-symbol "*CENTRAL-REGISTRY*" '#:asdf)))
  (format t "~% Added SLYNK path to ASDF:*CENTRAL-REGISTRY*")
  (funcall (find-symbol "LOAD-SYSTEM" '#:asdf) :slynk)
  (format t "~% Loaded ASDF system")
  (funcall (find-symbol "CREATE-SERVER" '#:slynk) :port port :dont-close t)
  (format t "~% Created SLYNK server on port ~D" port)
  (setf (symbol-value (find-symbol "*USE-DEDICATED-OUTPUT-STREAM*" '#:slynk)) nil)
  (format t "~% Set *USE-DEDICATED-OUTPUT-STREAM* to NIL"))

Делать не сделай это.

...