خطأ تقييم رمز كلوجور
-
28-10-2019 - |
سؤال
لذلك لدي حاليا هذا الرمز:
(ns contact-form.core
(:gen-class))
(def foo "Hello World!")
(defn some-func [a-symbol]
(println (str a-symbol "'s value is: " (eval a-symbol))))
(defn -main [& args]
(some-func 'foo))
بعد أن أفعل C-c C-k
في إيماكس ، أحصل على الإخراج التالي:
contact-form.core> (-main)
foo's value is: Hello World!
nil
ولكن عندما أفعل lein uberjar
وتشغيل ملف جرة الناتجة ، أحصل على خطأ:
Exception in thread "main" java.lang.RuntimeException: Unable to resolve symbol: foo in this context, compiling:(NO_SOURCE_PATH:0)
at clojure.lang.Compiler.analyze(Compiler.java:6235)
at clojure.lang.Compiler.analyze(Compiler.java:6177)
at clojure.lang.Compiler.eval(Compiler.java:6469)
at clojure.lang.Compiler.eval(Compiler.java:6431)
at clojure.core$eval.invoke(core.clj:2795)
at contact_form.core$some_func.invoke(core.clj:7)
at contact_form.core$_main.doInvoke(core.clj:10)
at clojure.lang.RestFn.invoke(RestFn.java:397)
at clojure.lang.AFn.applyToHelper(AFn.java:159)
at clojure.lang.RestFn.applyTo(RestFn.java:132)
at contact_form.core.main(Unknown Source)
Caused by: java.lang.RuntimeException: Unable to resolve symbol: foo in this context
at clojure.lang.Util.runtimeException(Util.java:156)
at clojure.lang.Compiler.resolveIn(Compiler.java:6720)
at clojure.lang.Compiler.resolve(Compiler.java:6664)
at clojure.lang.Compiler.analyzeSymbol(Compiler.java:6625)
at clojure.lang.Compiler.analyze(Compiler.java:6198)
... 10 more
لذلك لدي سؤالان:
- لماذا لا يعمل أوبرجار بالضبط نفس ريبل?
- ماذا يمكنني أن أفعل لإصلاح هذه المشكلة?
المحلول
1.لماذا يعمل أوبرجار بشكل مختلف عن ريبل?
سبب الخطأ "نو-سورسي-باث" هو أنك لست حاليا في مساحة الاسم التي حددت 'فو.
لتوضيح:إذا قمت بتقييم التعليمات البرمجية الخاصة بك في بلدي ريبل وتنفيذها ، فإنه يضعني في contact-form.core
مساحة الاسم كما تتوقع لأن (ns contact-form.core)
يتم تقييمها من قبل ريبل ، ولكن إذا قمت بالتبديل إلى user
مساحة الاسم والدعوة -main
أنا يمكن أن تنتج نفس الخطأ:
contact-form.core=> (-main)
foo's value is: Hello World!
nil
contact-form.core=> (ns user)
nil
user=> (contact-form.core/-main)
CompilerException java.lang.RuntimeException: Unable to resolve symbol: foo in this context, compiling:(NO_SOURCE_PATH:120)
user=>
لذلك ، من خلال تحديد نقطة الدخول الخاصة بك إلى main
لتنفيذ أوبرجار مستقل (خارج ريبل) ، وهو ما يعادل الدعوة (contact-form.core/-main)
من مساحة الاسم الافتراضية في جرة الخاص بك وهو clojure.core
, ، لأن (ns contact-form.core
) لم يتم تقييمها.النتيجة: main
يمكن تنفيذها مع مسار مؤهل بالكامل (نامسباسد) إلى وظيفة ، ولكن أيا من الرموز من contact-form.core
متوفرة في مساحة الاسم الافتراضية الحالية.
2.الإصلاح
سيكون الحل هو التبديل صراحة إلى مساحة الاسم أولا.:
(defn -main [& args]
(use 'contact-form.core)
(some-func 'foo))