2012-12-01 3 views
3

처음에는 Allegro Common Lisp로 작성된 큰 프로젝트에 익숙해 지려고합니다. 이 코드 조각을 보았습니다 :로드를 호출 할 때 filespec의 이상한 심볼

(load "epilog:lib;compile.lisp") 

누군가가 설명하는 것이 무엇을 의미할까요? 아마, 그게 도움이된다면, "epolig"는 "lib; compile.lisp"파일이 "lib/compile.lisp"파일이거나 이해할 수있는 패키지의 이름입니다.

이 작업을 수행하는 일반적인 방법입니까? 그렇다면이 코드의 의도는 무엇입니까? SBCL은 콜론을 파일 이름의 특수 문자로 인식하지 않습니다. 즉,보고합니다. Couldn't load "epilog:lib;compile.lisp": file does not exist.

답변

13

기호가 아니며 논리적 경로 이름입니다.

Common Lisp에는 휴대용 logical pathname 기능이 있습니다. 목적은 /usr/local/lisp/src/epilog/lib/compile.lisp 또는 lispm:>sources>epilog>lib>compile.lisp.432 또는 다른 유형의 경로 이름 (Unix, Mac OS X, Windows 등의 차이점을 생각해보십시오)과 같은 물리적 경로 이름에서 추상화하는 것입니다.

목적은 단일 경로 이름 체계와 하나의 단일 논리 파일 조직을 소프트웨어에 사용하는 것입니다. 머신의 종류와 파일 위치에 관계없이 실제 파일 조직에서 논리적 Lisp 조직으로의 매핑 만 있으면됩니다.

이 기능은 다른 운영 체제와 많은 다른 파일 (DEC VMS, IBM MVS, Multics, Unix, Lisp Machines, MS DOS, Macs ...)이 많았던 당시의 것입니다. Lisp 기계는 네트워크로 연결되어 모든 종류의 컴퓨터와 대화 할 수있어 모든 사람들을위한 원시 파일 구문을 배웠습니다. 다른 실험실 (MIT, Xerox, SRI 등)에는 네트워크에 다른 컴퓨터와 다른 파일 서버가있었습니다. 그러나 Lisp 사용자는 "epilog : src; load.lisp"을로드하고 실제 컴퓨터의 위치를 ​​기억하지 않으려합니다. 로컬 시스템에서? 하지만 어디? 파일 서버에서? 그러나 어디에서? 그래서 각 네트워크에는 실제 파일 위치에서 논리적 경로 이름으로의 변환을위한 레지스트리가있었습니다.

이렇게하면 초기 URIs 파일 인 Uniform Resource Identifiers와 같습니다.

"epilog:lib;compile.lisp"논리적 경로 이름의 이름입니다.

  • epilog

    는 당신이 필요로하는 번역은

파일 형식 파일 이름

  • lisp 디렉토리 경로
  • compile 논리 호스트
  • lib;의 이름입니다입니다 논리 경로 이름과 실제 경로 이름 사이 :

    번역 규칙이 하나 뿐인 논리 호스트 EPILOG가 있다고 가정 해 봅시다. 모든 파일은이 Lisp의 /usr/local/sources/epilog/ 아래에이 컴퓨터에 있습니다. 그래서 우리는 몇몇 유닉스 협약을 사용한다.

    CL-USER 40 > (setf (logical-pathname-translations "EPILOG") 
            `(("**;*.*" "/usr/local/sources/epilog/**/*.*"))) 
    (("**;*.*" "/usr/local/sources/epilog/**/*.*")) 
    

    이제 우리는 논리적 경로 이름을 구문 분석 할 수 있습니다 :
    CL-USER 41 > (pathname "epilog:lib;compile.lisp") 
    #P"EPILOG:LIB;COMPILE.LISP" 
    

    이 현실을 설명하자, 부품은 우리의 문자열에서
    CL-USER 42 > (describe *) 
    
    #P"EPILOG:LIB;COMPILE.LISP" is a LOGICAL-PATHNAME 
    HOST   "EPILOG" 
    DEVICE   :UNSPECIFIC 
    DIRECTORY  (:ABSOLUTE "LIB") 
    NAME   "COMPILE" 
    TYPE   "LISP" 
    VERSION  NIL 
    

    위에서 보듯이

    을 분석하고있다.

    이제 우리는 또한 논리적 경로는 실제 경로로 변환하는 방법을 볼 수 있습니다

    CL-USER 43 > (translate-logical-pathname "epilog:code;ui;demo.lisp") 
    #P"/usr/local/sources/epilog/code/ui/demo.lisp" 
    

    을 그래서, 당신은 (load "epilog:lib;compile.lisp")는 논리적 경로 이름을 번역하고 정말 번역 실제 경로에서 파일을로드 할 때 지금. 우리가 정말로 원했던 것은 Lisp가 모든 목적을 위해 논리적 경로 이름을 기억한다는 것입니다. 예를 들어, 파일의 이름이 FOO이라면 Lisp은 함수의 소스 위치를 기록하고 논리적 경로 이름을 사용하기를 원합니다. 이렇게하면 컴파일 된 파일, 컴파일 된 응용 프로그램 또는 Lisp 이미지를 다른 컴퓨터로 옮기고 번역을 업데이트 할 수 있으며 해당 컴퓨터에서 사용할 수있는 경우 즉시 FOO의 소스를 찾을 수 있습니다.

  • 관련 문제