2012-01-06 12 views
5
* (make-pathname :name "cgi-bin/") 
#P"cgi-bin/" 
* (merge-pathnames "nav.py" #P"cgi-bin/") 
#P"cgi-bin/nav.py" ; **it is ok** 
* (merge-pathnames "nav.py" (make-pathname :name "cgi-bin/")) 
#P"nav.py"   ; why ? 

*(defvar bp #P"/media/E/myapp/cgi-bin/") 
* bp 
#P"/media/E/myapp/cgi-bin/") 
* (merge-pathnames "nav.py" bp) 
#P"nav.py"   ; why ? 
* (merge-pathnames "nav.py" #P"/media/E/myapp/cgi-bin/") 
#P"/media/E/myapp/cgi-bin/nav.py" ; **it is ok** 

मैं एसबीसीएल-1.0.54 का उपयोग कर रहा हूं।अजीब पथनाम?

किसी भी सुझाव की सराहना की जाती है!

उत्तर

4

एक pathname एक संरचना है कि एक पथ का प्रतिनिधित्व करता है अधिक जानकारी के लिए here देखें ड्राइव, मेजबान, निर्देशिका, नाम, आदि जैसे, घटकों का उपयोग है।

आप का निर्माण एक pathname:directory, :name और अन्य कीवर्ड के साथ make-pathname समारोह का उपयोग कर, और समारोह प्रकार pathname की एक वस्तु देता है:

CL-USER> (defvar p (make-pathname :directory '(:absolute "home" "test" "docs"))) 
CL-USER> #P"/home/test/docs/" 

प्रलेखित here के रूप में कार्य merge-pathnames, की याद आ रही घटक पूरा करता है पथनामडिफ़ॉल्ट-पथनाम:

CL-USER> (merge-pathnames p "tada.txt") 
CL-USER> #P"/home/test/docs/tada.txt" 
01 से निर्दिष्ट लोगों के साथ निर्दिष्ट

संपादित करें: यह आपके लिए काम नहीं करता है क्योंकि आप :name के साथ पथनाम बना रहे हैं और यह फ़ाइल का नाम निर्दिष्ट करता है (विस्तार के बिना या :type)। तो जब आप merge-pathnames पर कॉल करते हैं तो उसे इसके पथनाम में एक अनुपलब्ध घटक नहीं मिलता है, क्योंकि "cgi-bin /" को :name (फ़ाइल नाम) के रूप में निर्दिष्ट किया गया है, और आपके पास पहले से ही "nav.py" में एक फ़ाइल नाम है।

+0

[फाइल और फ़ाइल I/O] (http://www.gigamonkeys.com/book/files-and-file-io.html) पर पीसीएल के अध्याय का अंत भी देखें। – Daimrod