سؤال

لذلك لدي حاليا هذا الرمز:

(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. لماذا لا يعمل أوبرجار بالضبط نفس ريبل?
  2. ماذا يمكنني أن أفعل لإصلاح هذه المشكلة?
هل كانت مفيدة؟

المحلول

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))
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top