向量用方括号表示:
[] ;;=> [] [:foo] ;;=> [:foo] [:foo :bar] ;;=> [:foo :bar] [1 (+ 1 1) 3] ;;=> [1 2 3]
除了使用文字语法之外,您还可以使用该vector函数来构造向量:
(vector) ;;=> [] (vector :foo) ;;=> [:foo] (vector :foo :bar) ;;=> [:foo :bar] (vector 1 (+ 1 1) 3) ;;=> [1 2 3]
您可以使用vector?谓词测试某物是否为向量:
(vector? []) ;;=> true (vector? [:foo :bar]) ;;=> true (vector? nil) ;;=> false (vector? 42) ;;=> false (vector? :foo) ;;=> false
conj 在向量的末尾添加元素:
(conj [] :foo) ;;=> [:foo] (conj (conj [] :foo) :bar) ;;=> [:foo :bar] (conj [] :foo :bar) ;;=> [:foo :bar]
count 以固定时间返回项目数:
(count []) ;;=> 0 (count (conj [] :foo)) ;;=> 1 (count [:foo :bar]) ;;=> 2
您可以使用来获得向量的最后一个元素peek:
(peek []) ;;=> nil (peek [:foo]) ;;=> :foo (peek [:foo :bar]) ;;=> :bar
您可以使用来获得没有最后一个元素的新向量pop:
(pop [:foo]) ;;=> [] (pop [:foo :bar]) ;;=> [:foo]
请注意,如果您尝试弹出一个空矢量,则会得到IllegalStateException:
(pop []) ;; java.lang.IllegalStateException: Can't pop empty vector
与列表不同,对向量进行索引。您可以使用“恒定”时间通过索引获取向量的元素get:
(get [:foo :bar] 0) ;;=> :foo (get [:foo :bar] 1) ;;=> :bar (get [:foo :bar] -1) ;;=> nil (get [:foo :bar] 2) ;;=> nil
另外,向量本身是具有索引并返回该索引处的元素的函数:
([:foo :bar] 0) ;;=> :foo ([:foo :bar] 1) ;;=> :bar
但是,如果调用带有无效索引的向量,则会得到IndexOutOfBoundsException而不是nil:
([:foo :bar] -1) ;; java.lang.IndexOutOfBoundsException: ([:foo :bar] 2) ;; java.lang.IndexOutOfBoundsException:
您可以使用assoc以下命令在特定索引处获得具有不同值的新向量:
(assoc [:foo :bar] 0 42) ;;=> [42 :bar] (assoc [:foo :bar] 1 42) ;;=> [:foo 42]
如果传递的索引等于count向量的索引,则Clojure会像使用一样添加元素conj。但是,如果传递的索引为负数或大于count,则会得到IndexOutOfBoundsException:
(assoc [:foo :bar] 2 42) ;;=> [:foo :bar 42] (assoc [:foo :bar] -1 42) ;; java.lang.IndexOutOfBoundsException: (assoc [:foo :bar] 3 42) ;; java.lang.IndexOutOfBoundsException:
您可以使用来获取向量中的项目序列seq:
(seq []) ;;=> nil (seq [:foo]) ;;=> (:foo) (seq [:foo :bar]) ;;=> (:foo :bar)
由于对向量进行了索引,因此您还可以使用来获得向量项的反向序列rseq:
(rseq []) ;;=> nil (rseq [:foo]) ;;=> (:foo) (rseq [:foo :bar]) ;;=> (:bar :foo)
请注意,尽管所有列表都是序列,并且序列以与列表相同的方式显示,但并非所有序列都是列表!
'(:foo :bar) ;;=> (:foo :bar) (seq [:foo :bar]) ;;=> (:foo :bar) (list? '(:foo :bar)) ;;=> true (list? (seq [:foo :bar])) ;;=> false (list? (rseq [:foo :bar])) ;;=> false
本文向大家介绍clojure 解构向量,包括了clojure 解构向量的使用技巧和注意事项,需要的朋友参考一下 示例 这是如何解构向量的方法: 然后,例如在一个let块内,您可以非常简洁地从向量中提取值,如下所示:
本文向大家介绍clojure 解构嵌套向量,包括了clojure 解构嵌套向量的使用技巧和注意事项,需要的朋友参考一下 示例 您可以解构嵌套向量:
我正在对大小为50,000个元素的两个向量执行基于元素的操作,并且有不满意的性能问题(几秒钟)。是否存在明显的性能问题,例如使用不同的数据结构?
引导任务boot cljs repl提供了一种连接到ClojureScript repl的方法,ClojureScript repl与正在运行的浏览器实例交互。 如果正确地添加到build.boot依赖项中,可以从Clojure repl中调用函数,以便启动ClojureScript REPL。 我正在使用Emacs通过苹果酒软件包连接clojure REPL,该软件包具有以下功能: 我试图弄清楚
Clojure是一种LISP风格的语言,运行在JVM上。Clojure的一大特色就是其并发机制,它支持不可变的数据结构(Clojure是来自于可持久化的数据结构)。Clojure还有一个特色是软件事务存储(Software Transactional Memory,STM),其支持用事务代替锁和互斥器来更新共享内存。STM还是一个有争议的技术,还需要更好的证明自己,一个简单的办法就是访问一个JVM上的实现。
从Clojoure调用Java非常简单明了,但反过来已被证明是不可预测的。 它们似乎有两种方式: 1)以下类别 2) 将clojure编译成uberjar,然后将其导入java代码。 我选择了第二个选项,因为它更直接。 这是clojure代码 这是Java代码。 当我做出“service.returned(4);”时,系统永远不会返回。我不太明白为什么对我来说,它会像函数没有从Clojure返回一