2014-09-12 44 views
6

Lisp'de bir dosyayı aynı dizindeki bir dosyadan göreli bir yol kullanarak yüklemeye çalışıyorum.Dosyayı göreli bir yolla yükle

Dosyam yapısı aşağıdaki gibidir:

repo/ 
    subdir/ 
     main.lisp 
     test.lisp 

main.lisp ben fonksiyon tanımları bir dizi var ve test.lisp I fonksiyonlarını test etmek istiyorum.

I (load "main.lisp") ve test.lisp içinde (load "main") yanı sıra, yol adı varyasyonları bir dizi kullanarak denedi (yani, dosya önce ./ dahil) yer <filename> iletilen dosya adı aşağıdaki hatayı elde iki kere (yük fonksiyonu):

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

bir göreli yol kullanılarak main.lisp yüklemek mümkün mü?

Ben CMUCL çalıştıran ve bir dosya yükleniyor Sublime Text 3.

cevap

8

SublimeREPL kullanarak kod yürütme olduğumu dikkati olabilir, değişken *LOAD-PATHNAME* dosya yüklü olma yol adı bağlıdır ve onun adına *LOAD-TRUENAME*.

Yani, şu anda yüklenen dosya ile aynı dizinde bir dosya yüklemek için, size

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

bir dosyada yer alan bu tek iş yüklenen Will ... fayda fonksiyonu çevirmek? Bunu REPL ile çalıştırmayı denedim, ancak 'load-truename *' değeri 'nil' idi. Ancak, (load "path-to-test.lisp") 'yi kullandığımda işe yaradı. – maxdeviant

+1

Evet, '* load-truename *' sadece 'load' işlemi sırasında bağlanır. Benzer şekilde, "derleme dosyası" yürütme sırasında sadece bağlı olan * derleme dosyası-yolu adı * 've' * derleme dosyası-gerçek-isim * vardır. – jlahd

4

jlahd cevabı mükemmel söyleyebiliriz. Farklı yol adı hesaplamaları yapmanız gerekirse

, bunun yerleşik işlevleri ile yapabilirsiniz:

(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 

sonucu: #P"/Users/joswig/Documents/Lisp/test.lisp".

Genellikle yukarıdaki gibi bir şey yeniden, tek