2010-05-18 10 views
11

मैं एक एस-अभिव्यक्ति एक चल कॉमन लिस्प कार्यक्रम में एक फ़ाइल में संग्रहीत में पढ़ने के लिए चाहते हैं, तो मैं निम्नलिखित है:क्लोजर: सामान्य लिस्प पढ़ने समारोह के बराबर?

(defun load-file (filename) 
    "Loads data corresponding to a s-expression in file with name FILENAME." 
    (with-open-file (stream filename) 
    (read stream))) 

, उदाहरण के लिए, मुझे लगता है कि एस शामिल foo.txt नाम की एक फ़ाइल है -expression (1 2 3), ऊपर समारोह है कि एस-अभिव्यक्ति वापस आ जाएगी इस प्रकार कहा जाता है, तो: (load-file "foo.txt")

मैं खोज किया गया है और खोज और Clojure में एक समान रूप से सुरुचिपूर्ण समाधान नहीं मिली है। कोई विचार?

धन्यवाद!

उत्तर

8

आप जैसे क्या कर सकते हैं

(require '[clojure.contrib.io :as io]) 

(io/with-in-reader (io/file "foo.txt") (read)) 
; => (1 2 3) 

ध्यान दें कि आप की संभावना पहले *read-eval*false को rebind चाहता हूँ। यह भी ध्यान रखें कि उपरोक्त काम वर्तमान contrib हेड के साथ (और लगभग निश्चित रूप से 1.2 में काम करेगा जब यह जारी किया जाता है); Clojure 1.1 के लिए, एक ही कार्यक्षमता clojure.contrib.duck-streams और clojure.contrib.java-utils नामस्थान में उपलब्ध है।

+0

हाय, क्या लाभ, यदि कोई हो, (पठन-स्ट्रिंग से अधिक इस दृष्टिकोण का है (slurp "foo.txt")) – jkndrkn

+2

'slurp' /' कब/slurp * ', में फ़ाइल की पूरी सामग्री slurp भी' हालांकि पढ़ने के लिए स्ट्रिंग' केवल एक पूरे फार्म पढ़ सकते हैं और बाकी को छोड़ देगा। 'इन-इन-रीडर' दृष्टिकोण पहले फॉर्म (बफरिंग के कारण) से थोड़ा सा पढ़ेगा। इसके अलावा, आप 'इन-इन-रीडर' के शरीर में अधिक रूप ले सकते हैं; विशेष रूप से, उसी 'इन-इन-रीडर' फॉर्म के भीतर 'रीड' के बाद के आमंत्रण फ़ाइल से आगे के फॉर्म लौटाएंगे। (प्रारंभिक दो रूपों को प्राप्त करने के लिए '[(पढ़ें) (पढ़ें)]' का उपयोग करने का प्रयास करें।) मैंने इसके बारे में आपके उत्तर को पोस्ट किया होगा, हालांकि मैंने इसके बारे में सोचा था। :-) –

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