2012-05-11 4 views
4

나는 Debian squeeze에서 cl-swank/slime 1 : 20120420-2 (Debian 버전 번호)와 함께 SBCL 1.0.56을 사용하고 있습니다. 이것들은 모두 불안정한 현재 버전입니다.Debian에서 SLIME을 사용하여 Common Lisp에 외부 패키지로드

제 3 자 CL 패키지를로드하는 데 문제가 있습니다. 데비안에서 CL을 사용하는 데 대한 설명서 (실제로 Linux의 CL 사용 설명서)는 스케치 적이거나 모순되거나 으로 구식이므로 알고있는 내용을 요약 해 보겠습니다. 여기에 내가있는 곳이있다.

Debian은 /usr/share/common-lisp/source에 바이너리 패키지 (예 : cl-split-sequence)를 설치합니다. split-sequence의 경우, 이것은 /usr/share/common-lisp/source/cl-split-sequence입니다. 입력, 점액을 실행할 때 나는 그것을 이해, 버전 및 종속성에 대한 CL 구현 에 지침을 제공,

.ASD 파일 (여기 /usr/share/common-lisp/source/cl-split-sequence/split-sequence.asd), 는, 지금과 같은

;;; -*- Lisp -*- mode 
(defpackage #:split-sequence-system (:use #:cl #:asdf)) 
(in-package :split-sequence-system) 

(defsystem :split-sequence 
    :version "20011114.1" 
    :components ((:file "split-sequence"))) 

보인다 문제없이 REPL 작품에서 다음 두 줄

(require :split-sequence) 
(split-sequence:SPLIT-SEQUENCE #\, "foo,bar") 

(require :split-sequence)를 원용 (내 생각)을 ASDF의 내장 사본 (SBCL 내부)은 아마도 split-sequence.asd입니다. 이 은 아마도 SBCL에만 해당됩니다 (Common Lisp in Debian Manual Chapter 3 -Libraries 참조). 처럼 유용하고 상세한 페이지는 CLC (Common Lisp 컨트롤러)를 자주 참조하지만 데비안이이 문제로부터 멀어지고있는 것 같습니다. 완전히 이해하지 못하는 Redesign of Common Lisp Controller, 을 참조하십시오. 어쨌든, 문서화 된 CLC 사용 명령 중 아무 것도 나에게 적합하지 않습니다. 그러나 CLC는 Debian의 에서 계속 사용할 수 있습니다. 는

~/.cache/common-lisp/sbcl-1.0.56.0.debian-linux-x86/usr/share/common-lisp/source/cl-split-sequence/split-sequence.fasl에 배치 처음 (require :split-sequence) 그것이 , 컴파일하고, 호출 The Clc-users Archives

를 참조하십시오 (내 시스템에, 아마도 데비안 별) 결과 fasl입니다 - 또한, 메일 링리스트가 죽었다는 사용자가

e 파일은 원래 소스의 위치를 미러링하는 파일 시스템의 캐시 아래에 배치됩니다. 분명한 질문은 시스템에서 패키지를 찾을 위치를 어떻게 알 수 있습니까? 이것은 내가 아닌 한 가지입니다. 이 검색 경로는 자위대 데비안 패키지의 일부인 /etc/common-lisp/source-registry.conf.d에 제공해야하지만, 가장 가까운 것은 어쩌면 어딘가에 하드 연결되어 단지

(:directory #p"/usr/share/common-lisp/systems/") 

입니다 01-common-lisp-controller.conf이지만, 모양 나는 알고 싶다.

은 어쨌든,이 ASDF 파일이 캐시에 한 번, 그것은 , 다시 컴파일되지 않고 하나 다시 require을하지 않는 한 점액이 시작 후 REPL은 표시되지 않습니다.내가 선 파일에서

(require :split-sequence) 
(split-sequence:SPLIT-SEQUENCE #\, "foo,bar") 

, seq.lisp 말, 사람 및 참조 Ck를 가진 REPL에로드를 넣으면

지금, 나는 는

The name "SPLIT-SEQUENCE" does not designate any package. 
    [Condition of type SB-KERNEL:SIMPLE-PACKAGE-ERROR] 
로 시작, 오류 및 역 추적을 얻을

그래서 패키지가 올바르게로드되지 않았다고 결론을 내립니다. 나는

(asdf:oos 'asdf:load-op :split-sequence) 

(asdf:load-system :split-sequence) 

하지만 주사위처럼 변화를 시도했다. 이상하게, 우리는 단지 파일의 라인

(require :split-sequence) 

이 있다고 가정 - 명확성이 require.lisp를 호출합니다. 그런 다음 오류를 제공하지 않습니다 require.lisp을로드 한 다음 REPL에서

(split-sequence:SPLIT-SEQUENCE #\, "foo,bar") 

작동 입력! 그러나 require.lisp을로드하지 않고 앞의 행 을 입력하면 REPL에서 작동하지 않습니다.

따라서 결론적으로 스크립트에서 어떻게 패키지를로드 할 수 있습니까? 또한 위에 언급 된 문제에 대해 에 대해 ASDF가 /usr/share/common-lisp/source/ 위치를 찾는 방법에 관심이 있지만 더 많은 문제가있는 에 관심이 있습니다.

답변

4

C-C-C K 소스 파일을 컴파일하고 컴파일 된 파일을로드한다.

Lisp 소스 파일에는 정의와 호출이 들어 있습니다. 파일 컴파일러는 파일을 탐색하여 코드를 작성합니다. 그러나 그것을 실행하지는 않습니다.

파일에 REQUIRE에 대한 호출이 포함되어 있으면 컴파일하는 동안 파일이 실행되지 않습니다. 나중에 컴파일 된 파일을로드하면 실행됩니다. 파일의 다음 Lisp 양식이 REQUIRE에 대한 호출 후에 사용할 수있는 패키지를 사용 중이면 REQUIRE이 아직 실행되지 않았기 때문에 컴파일하는 동안 컴파일되지 않습니다. 따라서 컴파일하는 동안 읽는 동안 오류가 발생합니다.당신이 필요한 기능을 사용하여 특정 파일을 컴파일하기 전에

  • 필요한 모든 REQUIRE 작업을 실행 :

    는 기본적으로 그 두 가지 해결책이 있습니다.

  • 컴파일하는 동안 REQUIRE 문을 실행하십시오. 그 부분은 EVAL-WHEN :COMPILE-TOPLEVEL이 컴파일하는 동안 하위 형식을 실행하도록 컴파일에 지시합니다.

#+:sbcl(foo)는 (푸) :SBCL 목록 CL:*FEATURES* 존재 심볼 인 경우에만 판독된다는 것을 의미한다. SBCL 일 때만 컴파일러가이 코드를 볼 수 있도록 사용됩니다.

  • 하나의 파일을 컴파일하는 동안 리스프 코드를 실행하므로 파일 컴파일러의 동작을 변경할 수 있기 때문에

    커먼 리스프 코드의 컴파일

    는 준비를 더 처리합니다.

  • 소스 코드에서 사용되는 패키지 (기호의 네임 스페이스)는 파일 컴파일러의 독자에게 알려야합니다.

+0

덕분에 Rainer는 매우 명확한 설명입니다. 내가 인용 한 스크립트가 실제로 얼마나 필요합니까? '# + : sbcl'은 무엇을할까요? –

+0

내 자신의 질문에 대답 - 분명히별로. (split-sequence : SPLIT-SEQUENCE # \, "foo, bar"))'(require : split-sequence)) 공장. –

1

그 파일 작품의 상단에있는 코드를 복사 http://common-lisp.net/~loliveira/ediware/ediware.lisp

에 대한 링크를 한 다음 게시, Zach Beane's Blog - Making a small Common Lisp project, 우연히 만났다. 나는이 마법의 주술이 일을 아무 생각은했습니다 그래서이 파일이로드 split-sequence에 점액에 C-C의 C-K를 실행하지 않으며, 그러나 코드 int (split-sequence:SPLIT-SEQUENCE #\, "foo,bar"))

#+:sbcl 
(eval-when (:compile-toplevel :load-toplevel :execute) 
    (require :asdf)) 

(eval-when (:compile-toplevel :load-toplevel :execute) 
    (asdf:oos 'asdf:load-op :split-sequence)) 

(defpackage #:seq 
    (:use #:cl #:split-sequence)) 
(in-package #:seq) 

(print (split-sequence:SPLIT-SEQUENCE #\, "foo,bar")) 

를 실행합니다. 아무도 설명을 신경 쓰지 않겠습니까? 질문에 대한 답변이기 때문에 답변에 넣겠습니다. 그러나 왜 작동하는지 이해할 수 없기 때문에 완전하지 않습니다. 이 스크립트에 대한 설명을 기꺼이 받아 들일 것입니다.