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 具有法律约束力的问题_Clojure - Fatal编程技术网

Clojure 具有法律约束力的问题

Clojure 具有法律约束力的问题,clojure,Clojure,只是想重新考虑一些简单的代码 我有一个函数 (defn foo ([x y] (let [line [x y]] (...)) ([x y z] (let [plane [x y z]] (...)))) 我知道我会写作 (let [[x y :as point] [1 0]]) 对于我可以编写的foo之类的函数,是否有类似的解构 [xy:as-line]或[xy-z:as-plane]在实际定义

只是想重新考虑一些简单的代码

我有一个函数

(defn foo
    ([x y]
        (let [line [x y]]
            (...))
    ([x y z]
        (let [plane [x y z]]
            (...))))
我知道我会写作

(let [[x y :as point] [1 0]])
对于我可以编写的
foo
之类的函数,是否有类似的解构
[xy:as-line]
[xy-z:as-plane]
在实际定义中?(即平面将被指定为[x y z])

您也可以在参数列表中分解结构,但必须使用可变参数,这意味着您不能有多个签名:

(defn foo [& [x y z :as plane]]
  (...))
然后像这样打电话:

(foo 1 2 3)

但正如我上面所说,使用这种方法,两个和三个arg形式变得不明确,因此您必须有单独的命名函数。

您也可以在arg列表中分解结构,但必须使用可变arg,这意味着您不能有多个签名:

(defn foo [& [x y z :as plane]]
  (...))
然后像这样打电话:

(foo 1 2 3)

但正如我上面所说的,使用这种方法,两个和三个arg表单变得不明确,因此您必须有单独的命名函数。

您始终可以使用宏构建
let
s。这将使您能够编写如下内容:

(def foo
  (build-foo-args [[x y] line]
     (...))
  (build-foo-args [[x y z] plane]
     (...)))
但我不确定这种糖到底能买多少钱。。。首先,让我们很清楚

总的来说,我可能会建议重新考虑您的函数签名:

  • 如果你真的需要不同的行为来满足不同的要求,那么 foo可能应该被分解成单独的函数

  • 如果不同算术的行为相同,那么我将使用 Dave Ray建议的可变参数,但称为组合参数 参数是中性的,例如“法向量”,它可以表示多个参数 维度。你可能会发现你根本不需要x,y,z来命名


您始终可以使用宏构建
let
s。这将使您能够编写如下内容:

(def foo
  (build-foo-args [[x y] line]
     (...))
  (build-foo-args [[x y z] plane]
     (...)))
但我不确定这种糖到底能买多少钱。。。首先,让我们很清楚

总的来说,我可能会建议重新考虑您的函数签名:

  • 如果你真的需要不同的行为来满足不同的要求,那么 foo可能应该被分解成单独的函数

  • 如果不同算术的行为相同,那么我将使用 Dave Ray建议的可变参数,但称为组合参数 参数是中性的,例如“法向量”,它可以表示多个参数 维度。你可能会发现你根本不需要x,y,z来命名

这就是问题:)我想要多个arg表单,我想我需要学习编写宏来实现它?这就是问题:)我想要多个arg表单,我想我需要学习编写宏来实现它?