2016-12-01 1 views
2

다음 코드 단편은 SB-INT를 제공합니다. SIMPLE-READER-PACKAGE-ERROR; REPL이 코드를 읽는 동안 패키지 "quicklisp-quickstart"가 아직 정의되지 않았기 때문에 그 사실을 알고 있습니다. 그러나 패키지는 "quicklisp.lisp"에 정의되어 있습니다.일반적인 lisp로 동적로드 (로드)를 수행하는 방법

어떻게하면 다음 코드를 사용할 수 있습니까? 또는이 패키지가 동적으로로드 된 파일에 정의 될 일반 isp 판독기를 어떻게 알 수 있습니까?

* (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

그냥 매력처럼 작동합니다. 고맙습니다. –