gpt4 book ai didi

Clojure - 为什么分组需要 "do"语句?

转载 作者:行者123 更新时间:2023-12-02 00:20:03 24 4
gpt4 key购买 nike

我知道 do block 将按顺序执行语句并返回最后一个语句的值。我认为如果我不需要返回值,则不需要这样做。不考虑返回值,那么,我不明白这两个函数的不同行为:

与“做”:

(defn x [] 
(if true
(do (println "a") (println "b"))))

=> (x)
a
b
nil

没有“do”:

(defn x [] 
(if true
((println "a") (println "b"))))

=> (x)
a
b
NullPointerException user/x (NO_SOURCE_FILE:3)

第二个例子中出现NullPointer的原因是什么?

最佳答案

因为

(function argument)

...是函数调用语法,

((println "a") (println "b"))

...期望 (println "a") 返回一个函数,它可以使用作为第一个传递的 (println "b") 的结果来调用该函数论证。

相反,(println "a") 没有返回值(返回 nil,又名 null),并且尝试将此 null 值作为函数调用会给您带来 NullPointerException。

<小时/>

顺便说一句,这里惯用​​的做法是将 if 替换为 when,它将扩展为隐式包含 do:

(defn x [] 
(when true
(println "a")
(println "b")))

关于Clojure - 为什么分组需要 "do"语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29611397/

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