मैं वर्तमान में एक मौजूदा जे 2 ईई वेबपैप में कार्यक्षमता जोड़ने की प्रक्रिया में हूं, टॉमकैट कंटेनर में, और मैं क्लोजर का उपयोग करके अपने जोड़ों को लिख रहा हूं। मेरा सेटअप सरल है: मैं क्लोजर द्वारा उत्पन्न स्थिर तरीकों पर कॉल जोड़ता हूं, और क्लोजर पक्ष से सभी कड़ी मेहनत करता हूं। निर्माण प्रक्रिया में क्लोजर कोड (lein uberjar
) संकलित करने और फिर क्लासपाथ पर उस जार के साथ जावा कोड संकलित करने में शामिल है।मैं एक क्लोजर स्रोत फ़ाइल को Emacs पर चल रहे क्लोजर प्रतिलिपि से कैसे कनेक्ट करूं?
वेबएप init में, मेरे पास एक जेनरेट क्लास के लिए एक कॉल है जो (swank/start-repl)
के साथ एक swank सर्वर को फायर करता है। मैं अपने एक्वामाक्स की उस सर्वर पर कीचड़ को जोड़ने में सक्षम होना चाहता हूं, और वहां से इंटरैक्टिव रूप से काम करना चाहता हूं (एक बिंदु तक, मैं कुछ भी नहीं कोशिश करूंगा जिसके लिए जावा-साइड रीकंपिलेशन की आवश्यकता है)। लेकिन मेरे पास एक ऐसी स्थिति है जिसे मैं समझ में नहीं आता। अगर मैं \M-x slime-connect
करता हूं, तो मुझे एक आरईपीएल प्रॉम्प्ट मिलता है (अधिसूचित होने के बाद कि कोई निम्न लिस्प प्रक्रिया नहीं है, जो मुझे लगता है कि यह ठीक है, क्योंकि निम्नतम लिस्प प्रक्रिया emacs नियंत्रण के बाहर चल रही है)। मैं पूरी तरह से फॉर्म का मूल्यांकन कर सकता हूं, और मैं my.own.namespace/my-var
जैसी चीजों का भी निरीक्षण कर सकता हूं। हालांकि, अगर मैं पहले से संकलित क्लोजर कोड वाली फ़ाइल पर जाता हूं, तो मुझे लगता है कि कीचड़ इसे इसके स्रोत के रूप में पहचान नहीं सकती है। एक सरल clojure फ़ाइल पर विचार करें:
(ns my.namespace
(:gen-class
:name my.namespace
:methods [#^{:static true} [testFunc [] void]]))
(def *secret* "shhhh")
(defn -testFunc []
(println (str "our secret is: " secret)))
यह मानते हुए कि इस संकलित और uberjar webapp द्वारा लोड में शामिल किया गया था, मैं eval/निरीक्षण कर सकते हैं my.namespace/*secret*
। लेकिन अगर मैं कोड बफर के अंदर eval करने की कोशिश करता हूं, तो स्लिम सोचता है कि मैं user
नेमस्पेस पर हूं (जो भी समझ में आता है!)। लेकिन अब मुझे एक कामकाजी विकल्प के साथ छोड़ दिया गया है - मुझे मूल्यांकन करना होगा - एक-एक करके, फ़ाइल में सभी रूपों! \C-c \C-l
(स्रोत फ़ाइल लोड करना) कुछ भी नहीं करेगा - स्पष्ट रूप से केवल शून्य लौटाता है और कुछ भी आउटपुट नहीं करता है। सब कुछ संकलित करना ऐसा लगता है - यह संकलित करता है, अगर उन्हें पाता है तो त्रुटियों को दिखाता है, लेकिन मेरा नामस्थान नहीं बदलेगा। और अजीब \C-~
(सिंक पैकेज और निर्देशिका) है, जो सामान्य लिस्प का उपयोग करता है, यह वही करता है जो मैं चाहता हूं, लेकिन यहां यह अच्छा के लिए क्लोजर आरईपीएल को फ्रीज करता है।
हमेशा आरपीएल में स्विच करने का विकल्प है, (in-ns 'my.namespace)
टाइप करना, और फिर सभी ठीक से काम करते हैं। लेकिन यह केवल व्यावहारिक नहीं है जब क्लोजर फाइलें संख्या में बढ़ रही हैं (क्योंकि कोड बफर का नामस्थान स्वचालित रूप से नहीं बदलेगा!)
मेरा प्रश्न है, फिर, क्या मुझे मूल आदेश/कॉन्फ़िगरेशन - या यदि इस व्यवहार के लिए ऐसा कोई स्पष्ट कारण है।
प्रश्न का हवाला देते हुए: "सब कुछ संकलित करना ऐसा लगता है" - आपका क्या मतलब है? यही है, क्लोजर कोड लोड करने की कौन सी विधि आप "सबकुछ संकलित" कहने का जिक्र कर रहे हैं (क्लोजर कोड हमेशा संकलित होता है, लेकिन आपके पास शायद कुछ स्लीम फ़ंक्शन दिमाग में है)। इसके अलावा, आप किस नतीजे की उम्मीद करते हैं? –
"सबकुछ संकलित करना" - 'सीसी सीके' मारना emacs पर फ़ाइल के बफर में सभी रूपों को संकलित करेगा, उन रूपों पर त्रुटियों को प्रस्तुत करेगा, और प्रभावी ढंग से फिर से परिभाषित (और नए परिभाषित) रूपों को गतिशील रूप से उपलब्ध कराएगा (उदाहरण के लिए, एक वेबपैप कॉल का उपयोग किया जाएगा यह नया संकलित कोड)। जैसा कि मैं कर सकता था उतना स्पष्ट नहीं होने के लिए खेद है। – Edgar
मैं 'एमएक्स स्वैंक-क्लोजर-प्रोजेक्ट' के साथ एसएलईएमई शुरू करते समय एक गवाह के समान व्यवहार की अपेक्षा कर रहा था: फ़ाइल के बफर पर स्विच करते समय, नामस्थान स्वचालित रूप से बदल जाता है, इसलिए वहां कुछ मूल्यांकन करने से 'उपयोगकर्ता' नामस्थान का उपयोग नहीं किया जाएगा । वैकल्पिक रूप से, जब 'सी-सी सी-के'/'सी-सी सी-एल' का उपयोग करके बफर को संकलित/लोड करना प्रारंभिक' (एनएस ...) 'सहित सभी रूपों का मूल्यांकन करना चाहिए, इस प्रकार एक विशिष्ट नेमस्पेस पर स्विच करना और उसके बाद के सभी चर शामिल हैं। क्या यह मानक सेटअप में अपेक्षित व्यवहार नहीं है? (मैं इसे गलत तरीके से देख रहा था ...) – Edgar