1

我的问题是 Clojure 程序源代码元数据是否存在,是否易于访问?

我正在考虑编写一个函数包装器,它可以接受一个要调用的函数、一个调试标志和任意文本(例如,源代码中的调用位置)以在设置调试标志时打印。清除后,只会调用该函数。

我想知道是否可以从当前运行的函数中收集到,而不是硬编码一个位置。我不知道这样的信息是否可用。否则,我当然可以在调用该函数的任何位置提供任意位置信息。

以下是此类函数的示例:

(defn test-fn
    []
    (println "This is a test function."))

(defn fn-call-loc
    [fn dbg-flag & locate-info]
    (if (= 1 dbg-flag)
        (println locate-info))
    (fn))

repl-test.core=> (fn-call-loc test-fn 1 "Called from main.")
(Called from main.)
This is a test function.
nil
repl-test.core=> 

我的问题不是我的硬编码“从主调用。”,是否有关于调用 fn-call-loc 位置位置的可用元数据?

谢谢。

4

1 回答 1

1

有讨论元数据的元数据 clojure.org 文档页面。为了做你想做的事,我会像这样改变 fn-call-loc :

(defn fn-call-loc
  [fv dbg-flag]
  (if dbg-flag
    (let [n (-> (:ns (meta fv)) (.getName))
          f (:name (meta fv))
          l (:line (meta fv))]
      (println (str "Called from " n "/" f " which is defined on line " l))))
  (fv))

你这样称呼它:

(fn-call-loc #'test-fn true)

或这个:

(fn-call-loc (var test-fn) true)

不过也有一些陷阱。

  • 在 fn-call-loc 中将所有“fv”实例更改为“fn”,您的结果可能来自 clojure.core,而不是您的命名空间。
  • 如果你直接传递一个符号,你会得到一个异常。需要 Var 对象,请参阅(var 符号)clojure.org 文档和阅读器文档页面中的 Var-quote 。
  • 可能还有一些我现在想不出来的。

This might be a good place for a macro but I think that's another question.

于 2015-02-19T03:24:10.320 回答