gpt4 book ai didi

clojure - 为什么 (nil) 的评估不同于 ((println "foo"))

转载 作者:行者123 更新时间:2023-12-02 07:04:21 25 4
gpt4 key购买 nike

为什么下面最后两行不一致?评估异常是从 REPL 粘贴的。我正在使用 Clojure 1.4

(println "foo") ;; evals to nil

(nil) ;; CompilerException java.lang.IllegalArgumentException: Can't call nil
((println "foo")) ;; NullPointerException

最佳答案

一个是编译时异常;另一个是运行时异常。

(nil) 的情况下,编译器发现您正在尝试对 nil 进行函数调用,并给您一个编译错误。

((println "foo")) 的情况下,编译器不会尝试推断内部形式 (println "foo") 将返回什么。因为它知道它可以返回一个函数,所以检查不会在编译时发生。当 println 返回 nil 并且您尝试调用它时,异常发生在运行时。

作为一种动态语言意味着您通常不会尝试在编译时检测变量的类型错误。

观察:

(.setDynamic #'println)

(binding [println
(fn [x]
(when (pos? (rand-int 2))
(fn [] (print "bar\n"))))]
((println "foo")))

这将随机打印“bar”并返回 nil 而没有运行时异常,或者不打印任何内容并抛出运行时 NullPointerException。很明显,这个人为设计的 println 没有供编译器检测的静态返回类型。

但编译器仍然可以检测到仅涉及值的类型错误。

关于clojure - 为什么 (nil) 的评估不同于 ((println "foo")),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14904487/

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