2010-08-12 8 views
5

मैं वर्तमान में एक मौजूदा जे 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) टाइप करना, और फिर सभी ठीक से काम करते हैं। लेकिन यह केवल व्यावहारिक नहीं है जब क्लोजर फाइलें संख्या में बढ़ रही हैं (क्योंकि कोड बफर का नामस्थान स्वचालित रूप से नहीं बदलेगा!)

मेरा प्रश्न है, फिर, क्या मुझे मूल आदेश/कॉन्फ़िगरेशन - या यदि इस व्यवहार के लिए ऐसा कोई स्पष्ट कारण है।

+0

प्रश्न का हवाला देते हुए: "सब कुछ संकलित करना ऐसा लगता है" - आपका क्या मतलब है? यही है, क्लोजर कोड लोड करने की कौन सी विधि आप "सबकुछ संकलित" कहने का जिक्र कर रहे हैं (क्लोजर कोड हमेशा संकलित होता है, लेकिन आपके पास शायद कुछ स्लीम फ़ंक्शन दिमाग में है)। इसके अलावा, आप किस नतीजे की उम्मीद करते हैं? –

+0

"सबकुछ संकलित करना" - 'सीसी सीके' मारना emacs पर फ़ाइल के बफर में सभी रूपों को संकलित करेगा, उन रूपों पर त्रुटियों को प्रस्तुत करेगा, और प्रभावी ढंग से फिर से परिभाषित (और नए परिभाषित) रूपों को गतिशील रूप से उपलब्ध कराएगा (उदाहरण के लिए, एक वेबपैप कॉल का उपयोग किया जाएगा यह नया संकलित कोड)। जैसा कि मैं कर सकता था उतना स्पष्ट नहीं होने के लिए खेद है। – Edgar

+0

मैं 'एमएक्स स्वैंक-क्लोजर-प्रोजेक्ट' के साथ एसएलईएमई शुरू करते समय एक गवाह के समान व्यवहार की अपेक्षा कर रहा था: फ़ाइल के बफर पर स्विच करते समय, नामस्थान स्वचालित रूप से बदल जाता है, इसलिए वहां कुछ मूल्यांकन करने से 'उपयोगकर्ता' नामस्थान का उपयोग नहीं किया जाएगा । वैकल्पिक रूप से, जब 'सी-सी सी-के'/'सी-सी सी-एल' का उपयोग करके बफर को संकलित/लोड करना प्रारंभिक' (एनएस ...) 'सहित सभी रूपों का मूल्यांकन करना चाहिए, इस प्रकार एक विशिष्ट नेमस्पेस पर स्विच करना और उसके बाद के सभी चर शामिल हैं। क्या यह मानक सेटअप में अपेक्षित व्यवहार नहीं है? (मैं इसे गलत तरीके से देख रहा था ...) – Edgar

उत्तर

1

मुझे पता चला है कि इस मुद्दे के लिए अपराधी को हटा रहा है: slime-redirect-inferior-output, कीचड़-repl.el से, जिसे मैंने स्थापित किया था, से कहा जा रहा था। यह पता चला है कि यह एक निम्न-लिस्प-प्रक्रिया के बिना अच्छी तरह से नहीं खेलता है (पढ़ें, emacs के भीतर से एक swank सर्वर शुरू किया)।

तो एक त्वरित वर्कअराउंड हैक this जैसे फ़ंक्शन से error फ़ॉर्म को निकालने के लिए है। अब हुक आयता है, और नामस्थान स्वचालित रूप से गणना की जाती है। जैसा सोचा वैसा। सुझावों के लिए धन्यवाद, फिर भी - उन्होंने मुझे इस समाधान के लिए नेतृत्व किया!

5

मैं आपकी समस्या को गलत समझ सकता हूं, लेकिन क्या आप (वर्तमान में emacs में इस hypothetical बफर पर जाकर), C-c C-k को अपने वर्तमान क्लोजर इंस्टेंस में बफर संकलित करने के लिए हिट कर सकते हैं (क्या स्लिम कनेक्ट है)?

फिर, स्लिम बफर में, (in-ns 'my.namespace) के साथ इस नामस्थान पर स्विच करें। तब आपको उस नामस्थान में संकलित किए गए कार्यों तक पहुंच प्राप्त करनी चाहिए।

+0

हम्म, जैसा कि मैंने एक प्रश्न की टिप्पणी में लिखा है, कि संकलन काम करेगा, लेकिन मेरा मुद्दा यह है कि मैं उस '(इन-एनएस' .namespace) 'संकलन/लोड-फ़ाइल के बाद निहित होना चाहिए। इसने एसएलईएमई, आईआईआरसी के साथ उपयोग किए गए हर सामान्य लिस्प कार्यान्वयन में इस तरह से काम किया; साथ ही, 10 या अधिक फ़ाइल प्रोजेक्ट में विशेष रूप से नामस्थानों को स्विच करना पड़ता है (विशेष रूप से अधिक से अधिक वांछनीय क्लोजर रीस्टार्ट के साथ) थकान की ओर जाता है - और पागलपन के बाद कम :) - इसलिए यदि मैं कुछ गलत नहीं कर रहा हूं और बातचीत मुझे इस तरह से माना जाता है, मैं एक कामकाज कोड करेंगे! – Edgar

+0

ओह, भी, '(in-ns' my.namespace) '.clj फ़ाइल बफर पर स्थान पर मूल्यांकन किए जाने पर बिल्कुल काम नहीं करता है - मुझे इसे आरईपीएल पर करना है, फिर उस फ़ाइल का बफर स्विच करता है नाम स्थान। यह मेरे लिए स्पष्ट से भी कम है। – Edgar

+0

आप पूरी तरह से सही हैं-यह गधे में दर्द है। मैंने अभी इसका उपयोग किया है, मुझे लगता है, और क्लोजर से पहले डब्ल्यू/स्लिम/स्वैंक को कोड नहीं किया था। अगर आपको कोई काम मिल जाए तो मुझे बताएं! मैं इसे आपके लिए काम कर रहा हूँ अब? क्या अभी कुछ ऐसा है जो अनुत्तरित है? (ऐसा नहीं है कि मैंने कुछ भी जवाब दिया है, लेकिन मैं जानना चाहता हूं कि मैं अभी भी मदद कर सकता हूं!) – Isaac

2

संकलन पर स्वचालित रूप से नामस्थान स्विच करना कभी भी स्वैंक-क्लोजर के लिए डिफ़ॉल्ट नहीं रहा है, हालांकि यह क्लोजर के साथ काम करने के लिए एक वैकल्पिक कीचड़ सुविधा हो सकती है। लेकिन वर्तमान बफर के नामस्थान में प्रतिलिपि स्विच करने के लिए सी-सी एम-पी हमेशा मेरे लिए काम करता है, और मैंने कभी भी किसी के साथ परेशानी होने के बारे में नहीं सुना है।

क्या आप क्लोजर-मोड और कीचड़-प्रतिलिपि के नवीनतम स्थिर संस्करणों पर चल रहे हैं? क्या आपके पास swank-clojure.el स्थापित है? (आपको इसकी आवश्यकता नहीं होनी चाहिए।) ऐसा लगता है जैसे यह elisp libs के बेमेल संस्करणों के कारण हो सकता है। यदि यह समस्या नहीं है तो यह एक्वामाक्स बग हो सकता है; swank-clojure जीएनयू Emacs के साथ काम करने के लिए डिज़ाइन किया गया है। यदि आप नवीनतम एल्पा रिलीज के बजाए ट्रंक से चल रहे हैं तो यह भीड़ में एक बग हो सकता है।

+1

मुझे कुछ घंटों पहले एहसास हुआ है कि 'सी-सी एम-पी' ने मेरे सेटअप (एक्वामाक्स, क्लोजर-मोड और कीचड़-प्रतिलिपि, क्लोजर-1.2-आरसी 1 की नवीनतम स्थिर रिलीज) पर पूरी तरह से काम किया है।लटकता रहता है 'सी-सी ~' है, लेकिन मुझे लगता है कि एसएलआईएमई कमांड केवल सामान्य लिस्प कार्यान्वयन के लिए काम करता है। जो मैं काम करने की उम्मीद कर रहा था वह एक फाइल पर 'सी-सी सी-एल' (भार) कर रहा है - मुझे उम्मीद है कि नामस्थान बदलना है, लेकिन यह नहीं होगा! बस भावी पाठकों के लाभ के लिए, मैंने जो फ़ंक्शन स्केच किया है, वह http://gist.github.com/522706 भी काम करता है, लेकिन यह नामस्थान के लिए नहीं पूछता है - यह अनुमान लगाता है कि यह पहले '(एनएस ...) से है बफर में फॉर्म। – Edgar

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