Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
删除clojure中向量的第n个元素_Clojure - Fatal编程技术网

删除clojure中向量的第n个元素

删除clojure中向量的第n个元素,clojure,Clojure,我试图在clojure中解决一个非常基本的问题,但在理解向量/列表的工作方式时遇到了一些困难 首先,当我定义一个以向量为参数的函数的参数时,如何将其表示为参数 你会把它作为一个变量吗 (defn example [avector] (This is where the function goes) ) 或者你必须事先列出向量或列表的每个元素吗 (defn example [vectorpart1 vectorpart2 vectorpart3 vectorpart4 ] (This is wh

我试图在clojure中解决一个非常基本的问题,但在理解向量/列表的工作方式时遇到了一些困难

首先,当我定义一个以向量为参数的函数的参数时,如何将其表示为参数

你会把它作为一个变量吗

(defn example [avector] (This is where the function goes) )
或者你必须事先列出向量或列表的每个元素吗

(defn example [vectorpart1 vectorpart2 vectorpart3 vectorpart4 ] (This is where the function goes) )

另外,就向量和列表而言,有人知道允许您计算向量长度或获取第一个/最后一个/或第n个元素的命令吗?

简短的回答是您的第一个示例是正确的。您不希望必须命名向量的每一部分,因为您通常使用长度不确定的向量。如果您想对需要分配其部分的向量执行某些操作,可以通过

稍微长一点的答案是,发送到任何clojure defn的参数列表已经是一个向量。请注意,参数列表使用
[]
包装其参数列表。这是因为在Clojure中,代码和数据是相同的。从

Lisp是同音符号,这意味着用该语言编写的代码被编码为数据结构,该语言有工具可以操作

这可能比你想要的更多,但这是一个重要的相关概念

这里有一个快速的例子,让你去。。。将向量(在本例中为字符串)传递给函数,它将返回向量。但是,如果在其上映射,它会将向量的内容依次传递给函数

user=> (def params ["bar" "baz"])
#'user/params
user=> (defn foo [params] (println params))
#'user/foo
user=> (foo params)
[bar baz]
nil
user=> (map foo params)
bar
baz
(nil nil)

此外,请查看以了解有关向量(以及Clojure中的所有其他内容)的更多信息。

简短的回答是,您的第一个示例是正确的。您不希望必须命名向量的每一部分,因为您通常使用长度不确定的向量。如果您想对需要分配其部分的向量执行某些操作,可以通过

稍微长一点的答案是,发送到任何clojure defn的参数列表已经是一个向量。请注意,参数列表使用
[]
包装其参数列表。这是因为在Clojure中,代码和数据是相同的。从

Lisp是同音符号,这意味着用该语言编写的代码被编码为数据结构,该语言有工具可以操作

这可能比你想要的更多,但这是一个重要的相关概念

这里有一个快速的例子,让你去。。。将向量(在本例中为字符串)传递给函数,它将返回向量。但是,如果在其上映射,它会将向量的内容依次传递给函数

user=> (def params ["bar" "baz"])
#'user/params
user=> (defn foo [params] (println params))
#'user/foo
user=> (foo params)
[bar baz]
nil
user=> (map foo params)
bar
baz
(nil nil)

此外,请查看以了解有关向量(以及Clojure中的所有其他内容)的更多信息。

您的第一个示例定义了一个函数,该函数采用单个参数,而不考虑类型。如果传递一个向量,那么该参数将设置为向量

(example [1 2 3 4]) ;; (= avector [1 2 3 4])
第二个示例定义了一个包含四个参数的函数。您需要传递四个单独的值,才能使对此函数的调用有效

(example [1] [2] [3] [4])
;; (= vectorpart1 [1])
;; (= vectorpart2 [2])
;; (= vectorpart3 [3])
;; (= vectorpart4 [4])
听起来您可能在考虑解构语法,它允许您直接从参数向量解构值

(defn example [[a b c d]]
  ())
参数定义中的文字向量语法描述了第一个参数中的项目与函数范围中可用的符号之间的映射

(example [1 2 3 4])
;; (= a 1)
;; (= b 2)
;; (= c 3)
;; (= d 4)
此空间中的另一个功能是
apply
。Apply获取参数列表或向量,并使用它们调用函数

(defn example [a b c]
  (assert (= a 1))
  (assert (= b 2))
  (assert (= c 3)))
如果我们用一个向量调用这个函数,就会得到一个arity异常

(example [1 2 3])
;; ArityException Wrong number of args (1) passed ...
相反,我们可以使用
apply
将向量作为参数传递

(apply example [1 2 3])
;; no errors!
您将在Clojure文档中找到处理向量所需的所有方法

如果要删除特定元素,只需将其前面的元素和后面的元素合并在一起即可

(def v [1 2 3])
(concat (subvec v 0 1) (subvec v 2))

第一个示例定义了一个函数,该函数接受单个参数,而不考虑类型。如果传递一个向量,那么该参数将设置为向量

(example [1 2 3 4]) ;; (= avector [1 2 3 4])
第二个示例定义了一个包含四个参数的函数。您需要传递四个单独的值,才能使对此函数的调用有效

(example [1] [2] [3] [4])
;; (= vectorpart1 [1])
;; (= vectorpart2 [2])
;; (= vectorpart3 [3])
;; (= vectorpart4 [4])
听起来您可能在考虑解构语法,它允许您直接从参数向量解构值

(defn example [[a b c d]]
  ())
参数定义中的文字向量语法描述了第一个参数中的项目与函数范围中可用的符号之间的映射

(example [1 2 3 4])
;; (= a 1)
;; (= b 2)
;; (= c 3)
;; (= d 4)
此空间中的另一个功能是
apply
。Apply获取参数列表或向量,并使用它们调用函数

(defn example [a b c]
  (assert (= a 1))
  (assert (= b 2))
  (assert (= c 3)))
如果我们用一个向量调用这个函数,就会得到一个arity异常

(example [1 2 3])
;; ArityException Wrong number of args (1) passed ...
相反,我们可以使用
apply
将向量作为参数传递

(apply example [1 2 3])
;; no errors!
您将在Clojure文档中找到处理向量所需的所有方法

如果要删除特定元素,只需将其前面的元素和后面的元素合并在一起即可

(def v [1 2 3])
(concat (subvec v 0 1) (subvec v 2))

要从矢量
v
中删除索引
n
处的元素:

(defn remove-indexed [v n]
  (into (subvec v 0 n) (subvec v (inc n))))
比如说,

(remove-indexed (vec (range 10)) 5)
;[0 1 2 3 4 6 7 8 9]
很多事情都可能出错:

  • v
    可能不是向量
  • n
    可能不是整数
  • n
    可能超出
    v
    的范围(我们需要
    (包含?v n)

  • Clojure在运行时检测所有这些错误。静态类型语言将在编译时检测1和2,但不会检测3。

    要从vector
    v
    中删除索引
    n
    处的元素:

    (defn remove-indexed [v n]
      (into (subvec v 0 n) (subvec v (inc n))))
    
    比如说,

    (remove-indexed (vec (range 10)) 5)
    ;[0 1 2 3 4 6 7 8 9]
    
    很多事情都可能出错:

  • v
    可能不是向量
  • n
    可能不是整数
  • n
    可能超出
    v