기호가 아니며 논리적 경로 이름입니다.
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"
은 논리적 경로 이름의 이름입니다.
파일 형식 파일 이름
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
의 소스를 찾을 수 있습니다.