كيف أقوم بتوصيل ملف مصدر clojure باستبدال clojure قيد التشغيل على emacs؟

StackOverflow https://stackoverflow.com/questions/3470999

  •  28-09-2019
  •  | 
  •  

سؤال

أنا حاليًا بصدد إضافة وظائف إلى 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.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top