Clojure 理解效果如何执行的心理框架是什么?

Clojure 理解效果如何执行的心理框架是什么?,clojure,Clojure,理解效果如何执行的心理框架是什么? 例如,我不明白为什么在这种情况下 (take 5 (map prn (range 10))) REPL打印10个数字0123456789&在其他情况下 0 1 2 3 4 5 6 7 8 9 (transduce (comp (take 5) (map prn)) conj [] (range 10)) (传感器(补偿)(取5) (地图(prn)

理解效果如何执行的心理框架是什么? 例如,我不明白为什么在这种情况下

(take 5 (map prn (range 10)))
REPL打印10个数字0123456789&在其他情况下

0 1 2 3 4 5 6 7 8 9 (transduce (comp (take 5) (map prn)) conj [] (range 10)) (传感器(补偿)(取5) (地图(prn)) 康杰 [] (范围10)) 它只打印5 0 1 2 3 4,但我们在两个示例中都有
取5

1)您的第一个代码片段
(取5(映射prn(范围10))
实际上给出了5个结果。

0 1 2 3 4
user=> (def tform (comp (take 5) (map prn)))
#'user/tform

user=> (transduce tform conj [] (range 10))
0
1
2
3
4
[nil nil nil nil nil]
下面是
(map prn[])
的REPL示例,它提供长度为10的
LazySeq
。它包含
nil
,这就是
prn
函数返回的结果

user=> (map prn (range 10))
0
1
2
3
4
5
6
7
8
9
(nil nil nil nil nil nil nil nil nil nil)
然后当你在上面的
LazySeq
上应用
(取5)
,你会得到5
nil
s

user=> (def some-data (map prn (range 10)))
#'user/some-data
user=> (take 5 some-data)
0
1
2
3
4
5
6
7
8
9
(nil nil nil nil nil)
如果你还不相信,打印尺寸

user=> (count (take 5 some-data))
5
您可能也想阅读文档,

user=> (doc take)
-------------------------
clojure.core/take
([n] [n coll])
  Returns a lazy sequence of the first n items in coll, or all items if
  there are fewer than n.  Returns a stateful transducer when
  no collection is provided.
nil
2)在你的第二个代码片段中,你说的是
take 5
,然后应用
prn
,这就是为什么它只打印5个元素的原因。

user=> (def tform (comp (take 5) (map prn)))
#'user/tform

user=> (transduce tform conj [] (range 10))
0
1
2
3
4
[nil nil nil nil nil]
为了更好地理解它,请参见下面的过滤奇数的示例(比修改了一点点)

1)您的第一个代码片段
(取5(映射prn(范围10))
实际上给出了5个结果。

user=> (def tform (comp (take 5) (map prn)))
#'user/tform

user=> (transduce tform conj [] (range 10))
0
1
2
3
4
[nil nil nil nil nil]
下面是
(map prn[])
的REPL示例,它提供长度为10的
LazySeq
。它包含
nil
,这就是
prn
函数返回的结果

user=> (map prn (range 10))
0
1
2
3
4
5
6
7
8
9
(nil nil nil nil nil nil nil nil nil nil)
然后当你在上面的
LazySeq
上应用
(取5)
,你会得到5
nil
s

user=> (def some-data (map prn (range 10)))
#'user/some-data
user=> (take 5 some-data)
0
1
2
3
4
5
6
7
8
9
(nil nil nil nil nil)
如果你还不相信,打印尺寸

user=> (count (take 5 some-data))
5
您可能也想阅读文档,

user=> (doc take)
-------------------------
clojure.core/take
([n] [n coll])
  Returns a lazy sequence of the first n items in coll, or all items if
  there are fewer than n.  Returns a stateful transducer when
  no collection is provided.
nil
2)在你的第二个代码片段中,你说的是
take 5
,然后应用
prn
,这就是为什么它只打印5个元素的原因。

user=> (def tform (comp (take 5) (map prn)))
#'user/tform

user=> (transduce tform conj [] (range 10))
0
1
2
3
4
[nil nil nil nil nil]
为了更好地理解它,请参见下面的过滤奇数的示例(比修改了一点点)


我想你误解了什么。
prn
函数只打印返回值
nil

user=> (prn 42)
42
nil
因此,当将其应用于集合时,您只需打印所有接收序列为
nil
s的项目,结果如下:

user=> (map prn (range 10))
0
1
...
8
9
(nil nil nil nil nil nil nil nil nil nil)
take
函数返回收集下一项的子序列,直到它小于提供的值。由于所有
nil
s小于
5
,因此将返回所有项目

第二个例子也有同样的错误。请仔细阅读文档


还有一些一般注意事项:在处理集合时,不要使用
prn
或任何相关功能(
pr
prn str
和其他功能)。只打印最终结果。你的代码应该没有副作用。使用REPL计算代码的特定片段。在单独的函数上分解线程宏,然后使其增长。但是不要使用印刷品。

我想你误解了什么。
prn
函数只打印返回值
nil

user=> (prn 42)
42
nil
因此,当将其应用于集合时,您只需打印所有接收序列为
nil
s的项目,结果如下:

user=> (map prn (range 10))
0
1
...
8
9
(nil nil nil nil nil nil nil nil nil nil)
take
函数返回收集下一项的子序列,直到它小于提供的值。由于所有
nil
s小于
5
,因此将返回所有项目

第二个例子也有同样的错误。请仔细阅读文档


还有一些一般注意事项:在处理集合时,不要使用
prn
或任何相关功能(
pr
prn str
和其他功能)。只打印最终结果。你的代码应该没有副作用。使用REPL计算代码的特定片段。在单独的函数上分解线程宏,然后使其增长。但不要使用打印。

。。。你明白什么是
取5
吗?试着使用调试器(如果我理解正确的话)。@user202729我想我明白了,基本上
(取5)
是在
(map prn)
之前应用的。。。你明白
取5是什么意思吗?试着使用调试器(如果我理解正确的话)。@user202729我想我明白了,基本上
(取5)
是在
(map prn)
之前应用的