Как сделать динамическую загрузку (Load) в Common Lisp

Мои следующие фрагменты кода дадут SB-INT:SIMPLE-READER-PACKAGE-ERROR; Я знаю, что это потому, что пакет "quicklisp-quickstart" еще не определен, пока REPL читает код; Но пакет определен в "quicklisp.lisp".

Как я могу заставить следующий код работать? Или как я могу сказать обычному читателю lisp, что этот пакет будет определен в динамически загружаемом файле?

* (let ((quicklisp-init (merge-pathnames "quicklisp/setup.lisp"
                                       (user-homedir-pathname))))
  (if (probe-file quicklisp-init)
    (load quicklisp-init)
    (progn
      (load "quicklisp.lisp")
      (quicklisp-quickstart:install))))

debugger invoked on a SB-INT:SIMPLE-READER-PACKAGE-ERROR in thread
#<THREAD "main thread" RUNNING {100299C6A3}>:
  Package QUICKLISP-QUICKSTART does not exist.

    Stream: #<SYNONYM-STREAM :SYMBOL SB-SYS:*STDIN* {100017F893}>

Type HELP for debugger help, or (SB-EXT:EXIT) to exit from SBCL.

restarts (invokable by number or by possibly-abbreviated name):
  0: [ABORT] Exit debugger, returning to top level.

person ll l    schedule 01.12.2016    source источник
comment
У вас возникли проблемы с установкой quicklisp? Если нет, было бы более информативно описать, чего вы пытаетесь достичь и какие шаги вы предприняли. Если да, следовали ли вы пошаговому руководству quicklisp.org/beta?   -  person cybevnm    schedule 01.12.2016
comment
Возможно (eval (read-from-string "(quicklisp-quickstart:install)")).   -  person coredump    schedule 01.12.2016
comment
На странице установки NB Quicklisp показан пример именно этого, и он предложит добавить его в ваш .sbclrc или эквивалентный файл запуска при установке…   -  person BRPocock    schedule 01.12.2016
comment
У меня нет проблем с установкой quicklisp. Я просто хочу загрузить его, установить, если нет, во время процесса загрузки моего приложения.   -  person ll l    schedule 02.12.2016


Ответы (1)


Вы можете использовать FIND-SYMBOL, чтобы попытаться найти функцию и вызвать ее. с FUNCALL. Что-то типа

(let* ((package (find-package :quicklisp-quickstart))
       (function (unless (null package)
                   (find-symbol (string '#:install)
                                package))))
  (if (null function)
      (error "Can't install...")
      (funcall function)))
person jkiiski    schedule 01.12.2016