كيف أقوم بتوصيل ملف مصدر clojure باستبدال clojure قيد التشغيل على emacs؟
سؤال
أنا حاليًا بصدد إضافة وظائف إلى J2EE WebApp موجودة ، في حاوية Tomcat ، وأنا أكتب إضافاتي باستخدام Clojure. الإعداد الخاص بي بسيط: أنا فقط أضيف مكالمات إلى طرق ثابتة تم إنشاؤها بواسطة Clojure ، وأرمز جميع العمل الشاق من جانب Clojure. تتكون عملية الإنشاء في تجميع رمز clojure (lein uberjar
) ثم تجميع كود Java مع تلك الجرة على classpath.
في برنامج الويب init ، لديّ مكالمة إلى فئة تم إنشاؤها تطلق خادم Swank مع a (swank/start-repl)
. أرغب في أن أكون قادرًا على توصيل الوحل الخاص بي بهذا الخادم ، والعمل بشكل تفاعلي من هناك (حتى إلى حد ما ، لن أحاول شيئًا يتطلب إعادة ترجمة من جانب Java). لكن لدي موقف لا أفهمه تمامًا. إذا فعلت \M-x slime-connect
, ، أحصل على مطالبة بالاستبدال (بعد إخطاره بعدم وجود عملية LISP أقل شأناً ، وأعتقد أنها على ما يرام ، لأن عملية LISP السفلية تعمل خارج Control Emacs). يمكنني تقييم النماذج بشكل مثالي ، ويمكنني حتى فحص أشياء مثل my.own.namespace/my-var
. ومع ذلك ، إذا قمت بزيارة ملف مع رمز clojure الذي تم تجميعه بالفعل ، لا يبدو لي أن أجعل الوحل يتعرف عليه كمصدر له. النظر في ملف 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 ، يمكنني تقييم/فحص my.namespace/*secret*
. ولكن إذا حاولت التقييم داخل المخزن المؤقت للكود ، يعتقد Slime أنني على user
مساحة الاسم (والتي يمكن أن تكون منطقية!). لكن الآن تركت خيار عمل واحد - يجب أن أقيّم - واحد تلو الآخر ، كل النماذج في الملف! \C-c \C-l
(تحميل الملف المصدر) لن يفعل شيئًا - على ما يبدو فقط يعيد NIL ولا يخرج أي شيء آخر. يبدو أن تجميع كل شيء يفعل ذلك تمامًا - يجمع ، ويظهر أخطاء إذا وجدها ، ولكن لن يغير مساحة اسمي. والأغرب هو \C-~
(حزمة المزامنة والدليل) ، والتي تستخدم LISP المشتركة يفعل ما أريد فقط ، ولكن هنا يتجمد الاستبدال clojure للخير.
هناك دائمًا خيار التحول إلى الاستبدال ، والكتابة (in-ns 'my.namespace)
, ، ثم كل شيء يعمل بشكل صحيح. لكن هذا ببساطة ليس عمليًا بما فيه الكفاية عندما تنمو عدد ملفات Clojure في العدد (لأن مساحة اسم المخزن المؤقت للشفرة لن تتغير تلقائيًا!)
سؤالي هو ، إذن ، ما إذا كنت أفتقر إلى أمر/تكوين أساسي - أو إذا كان هناك سبب واضح لحدوث هذا السلوك على هذا النحو.
المحلول 3
لقد اكتشفت للتو أن إزالة الجاني لهذه القضية: slime-redirect-inferior-output
, ، من Slime-Repl.el ، تم استدعاؤه من خطاف كان لدي إعداد. اتضح أنه لا يتم تشغيله بشكل جيد بدون عملية انتقالية أقل (اقرأ ، خادم Swank بدأ من داخل EMACs).
لذا فإن الاختراق السريع هو فقط لإزالة error
شكل من هذه الوظيفة ، مثل هذه. الآن يستمر الخطاف ، ويتم حساب مساحات الأسماء تلقائيًا. على النحو المنشود. شكرا لك على الاقتراحات ، ومع ذلك - قادني إلى هذا الحل!
نصائح أخرى
قد أسيء فهم مشكلتك ، لكن لا يمكنك (أثناء زيارة هذا المخزن المؤقت الافتراضي في EMACs) ، ضرب C-c C-k
لتجميع المخزن المؤقت في مثيل clojure الحالي (ما هو الوحل المتصل)؟
ثم ، في المخزن المؤقت للوحل ، قم بالتبديل إلى مساحة الاسم هذه مع (in-ns 'my.namespace)
. ثم يجب أن تتمكن من الوصول إلى ما جمعته في مساحة الاسم.
لم يكن تبديل مساحات الأسماء تلقائيًا على الترجمة الافتراضي لـ Swank-Clojure ، على الرغم من أنها قد تكون ميزة الوحل اختيارية حدثت للعمل مع Clojure. لكن CC MP للتبديل إلى مساحة اسم العازلة الحالية عملت بالنسبة لي دائمًا ، ولم أسمع أبدًا عن أي شخص يواجه مشكلة في ذلك.
هل تعمل على أحدث إصدارات مستقرة من وضع Clojure و Slime-Repl؟ هل لديك swank-clojure.el مثبت؟ (يجب ألا تحتاجه.) يبدو أن هذا قد يكون بسبب إصدارات غير متطابقة من Elisp Libs. إذا لم تكن هذه هي المشكلة ، فقد تكون حشرة أكواماك ؛ تم تصميم Swank-Clojure للعمل مع Gnu Emacs. قد يكون أيضًا خطأ في الوحل إذا كنت تعمل من Trunk بدلاً من أحدث إصدار ELPA.