2014-09-12 9 views
6

के साथ फ़ाइल लोड करें मैं एक सापेक्ष पथ का उपयोग कर उसी निर्देशिका में फ़ाइल से लिस्प में फ़ाइल लोड करने का प्रयास कर रहा हूं।एक सापेक्ष पथ

मेरे फ़ाइल संरचना इस तरह दिखता है:

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* फ़ाइल लोड होने का पथ नाम के लिए बाध्य है , और *LOAD-TRUENAME* अपने truename के लिए।

तो, फ़ाइल वर्तमान में लोड किया जा रहा के साथ एक ही निर्देशिका में एक फ़ाइल लोड करने के लिए, आप कह सकते हैं

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

जब एक फ़ाइल में यह केवल काम लोड किए जा रहे होंगे? मैंने आरईपीएल के माध्यम से इसे निष्पादित करने का प्रयास किया, लेकिन '* load-truename *' का मान 'nil' था। हालांकि, जब मैंने '(लोड" पथ-से-test.lisp ") का उपयोग किया तो यह काम करता था। – maxdeviant

+1

हां, '* लोड-ट्रूनेम *' केवल 'लोड' ऑपरेशन के दौरान बाध्य है। इसी तरह, 'compile-file-pathname *' और '* compile-file-truename *' हैं जो केवल 'संकलन-फ़ाइल' के निष्पादन के दौरान बाध्य हैं। – 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"

आमतौर पर ऊपर की तरह कुछ पुन: उपयोग करने, एक यह एक उपयोगिता समारोह में बदल जाते हैं ...

संबंधित मुद्दे