2016-12-01 2 views
2

私の次のコードスニペットはSB-INTを与えます:単純なリーダーパッケージェラー; REPLがコードを読み込んでいる間に "quicklisp-quickstart"パッケージがまだ定義されていないためです。しかし、パッケージは "quicklisp.lisp"で定義されています。一般的な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. 
+0

quicklispのインストールに問題がありますか?そうでない場合は、達成しようとしていることと取り組んだことを説明することがより有益です。はいの場合は、https://www.quicklisp.org/beta/のステップバイステップガイドに従っていますか? – cybevnm

+2

おそらく '(eval(read-from-string"(quicklisp-quickstart:install) "))'です。 – coredump

+0

NB Quicklispのセットアップページには、これを正確に行う例があり、インストール時に.sbclrcまたはこれと同等のスタートアップファイルに追加することを提案します。 – BRFennPocock

答えて

6

あなたは試してみて、機能を見つけ、そしてFUNCALLでそれを呼び出すためにFIND-SYMBOLを使用することができます。何かのように

(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

ちょうど魅力のように動作します。ありがとうございました。 –

関連する問題