2014-05-12 3 views
3

SBCL이 실행될 때마다 실행되도록 Quicklisp을 설정하고 priority-queue library을 사용하려고하는 파일의 맨 위에 다음 행을 추가했습니다 (이전의 답변에 제안 된대로 질문, Priority queue for Common Lisp?). 그러나 그것을 사용하려고하면 SBCL에서 오류가 발생하여 priority-queue의 기능이 정의되지 않았습니다. 내가 뭘 놓치고 있니? 참고로Quicklisp :로드 된 라이브러리 사용

, 나는 이런 식으로 뭔가 쓰려고했습니다 :

(ql:quickload "priority-queue") 

(defparameter *heap* (make-pqueue #'<)) 

을 그리고 오류가 make-pqueue가 정의되어 있지 말하는 얻을.

+2

'(in-package : priority-queue)','(use-package : priority-queue)'또는 어떤 식 으로든'import'를 먼저 사용 했습니까? [패키지] (http://www.gigamonkeys.com/book/programming-in-the-large-packages-and-symbols.html)에서 읽는 것이 좋습니다. – Inaimathi

+0

"SBCL에서 오류가 발생합니다." 나는 질문에서 그것들을 보지 않는다. 그리고 나는 그것이 "우선 순위 큐로부터의 함수가 정의되지 않았다"는 것을 정확하게 기대하지 않는다. 질문에 오류 출력을 포함 시키십시오. –

답변

5

공통적 인 lisp에서는 명명 된 (변수, 함수, 매크로) 모든 것이 심볼에 첨부됩니다. 이 경우 기호 make-pqueue에 부착 된 기능이 있습니다. 기호는 패키지를 사용하여 서로 구분됩니다. 이것은 충돌을 최소한으로 유지하고 패키지가 내 보내지 않은 내부 변수/함수 같은 것을 허용합니다. (priority-queue:make-pqueue #'<) :

  1. 함수 전에 패키지 이름을 사용 :이 세 가지 중 하나를 할 필요가 같은

    는 소리. 소스를 읽는 사람들이 어떤 코드가 실행되고 있는지 정확히 알기를 원하면이 방법이 유용합니다. 그러나 패키지를 여러 번 호출하면 번거로울 수 있습니다. 이것이하는 일은 당신이 (대부분 cl-user)에있어 현재 패키지에 priority-queue 패키지에서 모든 수출 상징 수입이다

    (use-package :priority-queue) 
    (make-pqueue #'<) 
    

    :

  2. 는 당신이있어 현재 패키지의 priority-queue 패키지를 사용합니다. 테스트에 적합하지만 일반적으로 자체 패키지를 만들고 싶습니다. 다음 항목을 참조하십시오.

  3. 이 우선 순위 큐를 사용하는 자신의 패키지를 정의합니다

    (defpackage :queue-test (:use :cl :priority-queue)) 
    (in-package :queue-test) 
    (make-pqueue #'<) 
    

자신의 패키지를 정의하는 것은 처음에는 많은 작업처럼 보이지만, 당신은 당신이 얻을 분리를 좋아하는 시작합니다, 특히 서로 다른 코드 조각을 통합하기 시작하면 더욱 그렇습니다.

+0

이 우수한 설문 조사에 감사드립니다. 그것은 세벨의 책보다 훨씬 간결하며 필요한 부분을 매우 잘 이해합니다. –

관련 문제