2016-12-01 77 views
2

我的下面的代碼片段會給SB-INT:SIMPLE-READER-PACKAGE-ERROR; 我知道這是因爲包「quicklisp-quickstart」在REPL讀取代碼時尚未定義;但是軟件包IS在「quicklisp.lisp」中定義。如何做普通lisp的動態加載(加載)

如何使下列代碼有效? 或者我該如何告訴普通的lisp reader這個包將在動態加載的文件中定義?

* (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. 
+0

您在安裝quicklisp時遇到問題嗎?如果不是,那麼描述你想要達到的目標以及你採取的步驟會更有意義。如果是,您是否按照https://www.quicklisp.org/beta/分步指南進行操作? – cybevnm

+2

也許'(eval(read-from-string「(quicklisp-quickstart:install)」))'。 – coredump

+0

NB Quicklisp的設置頁面顯示了一個這樣做的例子,它會提供將它添加到您的.sbclrc或等效的啓動文件安裝... – BRFennPocock

回答

6

您可以使用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))) 
+0

就像魅力一樣工作。謝謝。 –