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)
,你会得到5nil
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)
,你会得到5nil
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)
之前应用的