Clojure stacktraces และ dynamically interned vars

0

คำถาม

ฉันต้อง Clojure รหัสแล้วประเมินผลมันและจากนั้นเด็กฝึกงานมันให้เป็น variance:

(let [x (binding [*ns* my-ns] (eval m-code))]
  (intern my-ns my-sym x)) ; my-sym was declared beforehand. 

แต่ตอนเกิดข้อผิดพลาดเกิดขึ้นภายในอง x,ร่องรอยทำให้ไม่มีการอ้างอิงเพื่อตำแหน่งทางแกน x:

my-ns/eval27298/fn--27299
...

ฉัน duplicated งข้อมูลกำกับภาพของอีก"มาตรฐาน"variance แต่มันไม่เปลี่ยนตั้งร่องรอย:

(alter-meta! my-var #(assoc % :line 1 :column 1 :file "my_ns.clj" :name my-sym :ns my-ns))

ถ้าไม่ใช่ข้อมูลกำกับภาพ,มันคืออะไรเคยวางแผนงานแกะรอยได้หรือยัง?

clojure stack-trace
2021-11-14 03:38:05
1

คำตอบที่ดีที่สุด

0

เว้นแต่ว่าฉันเข้าใจผิดที่นี่เป็นวิธีที่มันทำงาน:

  1. ผู้อ่าอ่านรหัสของคุณและ assigns ทุกตำแหน่งข้อมูลกำกับภาพไป vars
  2. รหัสแล้วประเมินผลดดยใครและข้อมูลกำกับภาพใช้ไม่ได้เดียวที่จะรายงานข้อผิดพลาดระหว่างการโหลดรหัสแต่ก็ยังต้องรายงานข้อผิดพลาดที่เกิดขึ้นตอนที่ประเมินผลดดยใคร functionality คือเคยหลังจากการประเมินผลตัวมันเอง

บนั้น alter-meta! ไม่สามารถทำงานเพราะทั้งหมดตำแหน่งไปแล้วถูกประมวลผลแล้วจำได้ สิ่งที่สามารถทำงานเป็นกำลังกำหนดที่ข้อมูลกำกับภาพระหว่างขั้นตอนที่ 1 และ 2 ด้านบน:

user=> (def code "#(throw (ex-info \"\" {}))")
#'user/code
user=> (def f (eval (-> (read-string code) (with-meta {:line 42, :clojure.core/eval-file "hello.clj"}))))
#'user/f
user=> (f)
Execution error (ExceptionInfo) at user/eval175$fn (hello.clj:42).

โปรดสังเกตว่าฉันกำลังใช้ :clojure.core/eval-file สำหรับกำหนดแฟ้มแทนที่จะเป็นแค่ :file.

2021-11-14 05:37:48

มันแค่ดูเหมือนจะสนใจเรื่อง:eval-แฟ้มและ:เส้น(และ:คอลัมน์). มันดูเหมือน eval มันก็ยากอย่าง-อาการหนักว่าทางใดก็ทางหนึ่ง
Kevin Kostlan

ก็ผมไม่รู้ว่า:eval-แฟ้มมีอีกอย่างที่พิมพ์อย่างที่มันเป็นเคยอยู่ compilier.java.
Kevin Kostlan

ในภาษาอื่นๆ

หน้านี้อยู่ในภาษาอื่นๆ

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................

ดังอยู่ในนี้หมวดหมู่

ดังคำถามอยู่ในนี้หมวดหมู่