当前位置: 首页 > 编程笔记 >

clojure 向量

岳正阳
2023-03-14
本文向大家介绍clojure 向量,包括了clojure 向量的使用技巧和注意事项,需要的朋友参考一下

示例

向量用方括号表示:

[]
;;=> []

[: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返回一