匿名功能与需要的时间不起作用?

Bad*_*ild 0 clojure anonymous-function

一个简单的例子应该证明我的问题:

First I define a simple variable:
(def a '(["one" 1] ["two" 2] ["nine" 9]))

;; CASE 1: (This works correctly)
(take-while #(< (second %) 5) a)
Returns: (["one" 1] ["two" 2])

;; CASE 2: (This does not seem to work correctly)
;; The only difference is the '>' instead of '<'
(take-while #(> (second %) 5) a)
Returns: ()
Run Code Online (Sandbox Code Playgroud)

在我看来CASE 2应该返回(["9"9])?

有没有办法调试这个,看看我错过了什么?

谢谢!

Chu*_*uck 5

take-while在第一次测试失败后停止.由于第一个元素未通过测试(不超过五个),因此它永远不会到达最后一个元素.如果您希望所有通过测试的元素无论它们出现在序列中的哪个位置,请filter改用.

  • take-while不是递归编码的......它只是*看起来像它一样.如果你仔细观察,你会发现`take-while`的整个身体被包裹在一个'lazy-seq`中.`lazy-seq`是一个用于构造惰性序列的宏.基本上,'lazy-seq`的主体被推迟到需要它的值.所以它在机器级别上并不是真正的递归,但是通过宏进行的懒惰评估允许以递归方式对其进行描述. (3认同)