Clojure的范围函数包含start和中的独占功能end(如果提供)。核心库中是否有某个函数可以提供完全包含的范围(开始和结束)?
我发现在某些情况下必须调整最终值的代码-例如,范围是向下而不是向上(例如列表理解),其可读性要差得多。例如:
(range n -1 -1)
Run Code Online (Sandbox Code Playgroud)
我只是在文档中丢失了它吗,还是有一种更干净的方法来做到这一点?
没有标准inclusive-range函数——遵循Kevin Ingle的术语。
您可以在以下基础上构建一个range:
(defn inclusive-range
([] (range))
([end] (range (inc end)))
([start end] (range start (inc end)))
([start end step] (range start (+ end step) step)))
Run Code Online (Sandbox Code Playgroud)
但你会因为末端参差不齐而遇到麻烦。例如,
(inclusive-range 10 11.5)
;(10 11 12)
Run Code Online (Sandbox Code Playgroud)
我想这不是你想要的。
AFAIK 没有核心功能,但您可以定义自己的功能供您使用:
(defn inclusive-range [start end] (range start (inc end)))
Run Code Online (Sandbox Code Playgroud)
或者也许更一般——定义一个只添加结尾的函数:
(defn inclusive-range [start end step] (flatten (list (range start end step) end)))
Run Code Online (Sandbox Code Playgroud)
正如评论中指出的,上述解决方案可能并不理想。您提到您已经习惯了番石榴的 Range,因此您也可以导入并使用它:
(import 'com.google.common.collect.Range)
(-> (Range/closed 1 10)
(.contains 10)) ; returns true
Run Code Online (Sandbox Code Playgroud)