2012-06-01 6 views
3

소켓과 함께 사용하기 위해 SBCL 비표준 내장 함수에서 일부 함수를 가져 오려고합니다. 맨손으로 대화 형 셸 + SBCL을 사용하여이 점액질을 할 때 작동하지만 틈새에서는 작동하지 않습니다.패키지를 SLIME REPL에 가져 오기

내가 무슨 짓을 :

(import 'sb-bsd-sockets:host-ent-address) 
(import 'sb-bsd-sockets:get-host-by-name) 

또는

(use-package :sb-bsd-sockets) 

을 중 하나를 수행 한 후, 점액 내가 CL-사용자 패키지에 이미 뭔가를 가져올려고한다는 오류로 날 맞이 . 이것은 수정 가능한 오류이므로 sb-bsd-sockets 패키지에있는 기호를 선택하여 해결할 수 있습니다. 더 이상의 오류는 없습니다. 그런 다음

, 내가 기능을 컴파일하려고 : 그것은 작동

(defun nslookup (hostname) 
    (if hostname 
     (sb-bsd-sockets:host-ent-address (sb-bsd-sockets:get-host-by-name hostname)) 
     nil)) 

합니다. 나는 이것을 컴파일하려고한다면 : 나는 nslookup-1를 호출 할 때

(defun nslookup-1 (hostname) 
    (if hostname 
     (host-ent-address (get-host-by-name hostname)) 
     nil)) 

은 그 때 나는 정의되지 않은 기능에 대한 경고 및 오류가 발생합니다. 놀랍게도

, 내가 REPL에서이 일을하려고하는 경우 :

CL-USER> #'host-ent-address 
#<STANDARD-GENERIC-FUNCTION HOST-ENT-ADDRESS (1)> 
CL-USER> 

그것은 "작품". 나는. 함수를 알고 있지만 그것을 사용하지 않기로 결정했습니다.

패키지를 SLIME의 REPL 또는 적어도 패키지에서 가져 오는 방법이 있어야합니다. 그렇지 않으면 긴 코드를 사용하는 것이 매우 불편합니다. 테스트를위한 이름을 입력하고 실제 프로그램을 대체 할 이름을 입력하십시오.

답변

2

"수정 가능한 오류"가있는 경우 "이름 충돌"을 의미하는 경우 자체 패키지를 정의하고 :shadow:shadowing-import-from을 사용하여 처리 할 수있는 문제입니다 조항. 자세한 내용은 Chapter 21 of PCL을 확인하십시오.

짧은 답변 : 이미 현재 패키지에 정의되어 새 심볼을 가져 오려고하는 경우, 당신은 전화보다는 표준 import (당신이 정말로 해당 절을 사용해야하지만 defpackage에 대신 shadowing-import을 할 필요가 그들 자신).

2 부 : "함수 컴파일"이란 무엇입니까? 두 번째 정의 shadowing-import:sb-bsd-sockets에서 보내고 나서 nslookup-1의 두 번째 정의를 평가하면 올바르게 작동합니다. 이미 적절한 기능을 가져온 패키지에서 평가하려고하십니까? 점액의 REPL에

0

수입 패키지는

당신은 점액의 REPL로 패키지를 가져올 수 없습니다, 이러한 개념은 존재하지 않기 때문에. 'REPL'은 패키지를 가져올 수 없습니다.

기호는 일부 패키지에 속할 수 있습니다. 심볼을 패키지로 가져올 수 있습니다. 하나의 패키지에서 내 보낸 심볼을 다른 패키지로 가져올 수도 있습니다.

독자에게는 현재 패키지가 있으며 기호 cl:*package*이 있습니다.Lisp과 상호 작용할 때이 패키지는 기본 패키지로 사용됩니다. 파일을 컴파일하거나 REPL 같은 것을 입력 할 때마다이 기본 패키지가 사용됩니다.

사용중인 패키지 종류를 제어해야합니다. 예를 들어 (in-package "FOO")을 파일의 시작 부분에 넣는 이유입니다. REPL에 (in-package "FOO")을 입력 한 다음 *package*FOO이라는 패키지입니다.

bar:foo 대신에 패키지 한정자 (foo)가없는 기호를 사용하려면 *package*을이 패키지 또는이 기호를 가져 오는 패키지로 설정해야합니다.

그래서해야 할 일은 cl : 패키지이 올바른 패키지를 가리키고 심볼을 가져 오는 경우 해당 패키지를 올바른 패키지로 가져 오는 것입니다.

예 :

CL-USER 191 > (defpackage "FOO" (:use "CL")) 
#<The FOO package, 0/16 internal, 0/16 external> 

CL-USER 192 > *package* 
#<The COMMON-LISP-USER package, 155/256 internal, 0/4 external> 

CL-USER 193 > (defpackage "FOO" (:use "CL")) 
#<The FOO package, 0/16 internal, 0/16 external> 

CL-USER 194 > cl:*package* 
#<The COMMON-LISP-USER package, 155/256 internal, 0/4 external> 

CL-USER 195 > (in-package "FOO") 
#<The FOO package, 0/16 internal, 0/16 external> 

FOO 196 > cl:*package* 
#<The FOO package, 0/16 internal, 0/16 external>