2014-09-12 2 views
6

상대 경로를 사용하여 같은 디렉토리에있는 파일에서 Lisp 파일을로드하려고합니다.상대 경로로 파일로드

내 파일 구조는 다음과 같습니다

repo/ 
    subdir/ 
     main.lisp 
     test.lisp 

main.lisp에서 나는 함수 정의의 번호를 가지고 있고, test.lisp에 나는 기능을 테스트하려는.

내가 (load "main.lisp")test.lisp(load "main")뿐만 아니라 경로에 변화의 번호를 사용하여 시도했다 (즉, 파일 이름 앞에 ./ 포함)하지만 <filename>가 전달 된 파일 이름입니다 나는 다음과 같은 오류가 두 번 (로드 기능)

File-error in function LISP::INTERNAL-LOAD: "<filename>" does not exist.

는 상대 경로를 사용 main.lisp를로드 할 수 있는가?

그것은 내가 CMUCL을 실행하고 파일이로드되는 숭고한 텍스트 3.

답변

8

의 내부 SublimeREPL를 사용하여 코드를 실행하고 협조 할 수 있으며, 변수 *LOAD-PATHNAME*는 파일이로드되는 경로 이름에 바인딩 , 그리고 그 truname에 *LOAD-TRUENAME*.

그래서, 현재로드중인 파일과 같은 디렉토리에 파일을로드하려면

(load (merge-pathnames "main.lisp" *load-truename*)) 
+0

로드되는 파일에 포함 된 경우에만 작동합니까? 나는 이것을 REPL을 통해 실행하려고 시도했지만'* load-truename * '의 값은'nil'이었다. 그러나,'(load "path-to-test.lisp")'를 사용했을 때 작동했습니다. – maxdeviant

+1

예,'* load-truename *'은'load' 연산 중에 만 바인드됩니다. 비슷하게,'compile-file-pathname *'과'* compile-file-truename *'도'compile-file'의 실행 중에 만 바인드됩니다. – jlahd

4

jlahd의 대답은 우수하다 말할 수 있습니다. 서로 다른 경로 계산을해야 할 경우

, 당신은이 내장 된 기능을 수행 할 수 있습니다

(let* ((p1 (pathname "test.lisp")) ; not fully specified 
     (name1 (pathname-name p1))  ; the name "test" 
     (type1 (pathname-type p1))  ; the type "lisp" 
     (p2 #p"/Users/joswig/Documents/bar.text") ; a complete pathname 
     (dir2 (pathname-directory p2))) ; (:ABSOLUTE "Users" "joswig" "Documents") 

    ; now let's construct a new pathname 

    (make-pathname :name name1 
       :type type1 
       :directory (append dir2 (list "Lisp")) ; we append a dir 
       :defaults p2))   ; all the defaults 
             ; relevant when the filesystem supports 
             ; host, device or version 

결과 : #P"/Users/joswig/Documents/Lisp/test.lisp"합니다.

일반적으로 위와 같은 것을 재사용하려면 유틸리티 기능으로 전환하십시오.

관련 문제