gpt4 book ai didi

clojure - 传递变量和元数据

转载 作者:行者123 更新时间:2023-12-02 16:23:52 24 4
gpt4 key购买 nike

我写了一个简短的调试函数:

(defn printvar
"Print information about given variables in `name : value` pairs"
[& vars]
(dorun (map #(println (name %) ":" (eval %)) vars)))

然后我尝试测试一下:

(defn -main [arg1 arg2]
(def moustache true) (def answer 42) (def ocelots-are "awesome!")
(printvar 'moustache 'answer 'ocelots-are)
(printvar 'arg1 'arg2))

但是遇到了一些非常令人困惑的行为:

$ lein repl
> (-main "one" "two")
# moustache : true
# answer : 42
# ocelots-are : awesome!
# CompilerException java.lang.RuntimeException: Unable to resolve symbol: arg1 in this context, compiling:(/tmp/form-init4449285856851838419.clj:1:1)

$ lein run "one" "two"
# Exception in thread "main" java.lang.RuntimeException: Unable to resolve symbol: moustache in this context, compiling:(/tmp/form-init4557344131005109247.clj:1:113)

经过更多实验,我发现了这一点:

(defn -main [arg1 arg2]
(meta #'arg1))
# Exception in thread "main" java.lang.RuntimeException: Unable to resolve var: arg1 in this context, compiling:(dict_compress/core.clj:9:11)

(defn -main [arg1 arg2]
(def arg1 arg1)
(meta #'arg1))
# {:ns #<Namespace dict-compress.core>, :name arg1, :file dict_compress/core.clj, :column 2, :line 10}

现在我完全困惑了。

当你执行(f 'var)(f var)时,你到底传递了什么?

为什么从 REPL 运行与直接运行时会有不同的行为?

接收的参数与定义的变量有什么区别?

如何修复我的代码?

我是否以错误的方式进行调试?

最佳答案

printvar 内部,定义的变量 moustache answerocelots-are 被正确打印,因为 def 将它们定义为“全局变量”。

这意味着有一个 printvar 函数可以“看到”的 moustache var。

这样想,这可行:

(def moustache 43)
(defn printvar []
(println moustache)
(defn main [arg1]
(printvar))

这不起作用:

(defn printvar []
(println arg1))
(defn main [arg1]
(printvar))

这正是您正在做的,将参数 name 传递给 eval 对参数范围没有任何作用(printvar 将无法看到它)。

您的代码有几个问题:

  • 您不应该在函数内defing,本地绑定(bind)是用let定义的
  • 如果您想要评估,您需要考虑您正在评估的范围。

关于clojure - 传递变量和元数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28408886/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com