function - 为什么 clojure 函数最多有 20 个参数的限制

标签 function clojure limits

clojure 函数可以采用的参数数量似乎是有限的。

在定义具有 20 多个参数的函数时,我收到以下信息:
#<CompilerException java.lang.RuntimeException: java.lang.RuntimeException: java.lang.Exception: Can't specify more than 20 params (NO_SOURCE_FILE:0) (NO_SOURCE_FILE:0)>
显然这是可以避免的,但是我在将现有 DSL 的执行模型移植到 clojure 时遇到了这个限制,并且我的 DSL 中有如下构造,通过宏扩展可以很容易地将其映射到函数,除了这个限制:

(defAlias nn1 ((element ?e1) (element ?e2)) number
"@doc features of the elements are calculated for entry into
      the first neural network, the result is the score computed by the latter"
(nn1-recall (nn1-feature00 ?e1 ?e2) (nn1-feature01 ?e1 ?e2) ... (nn1-feature89 ?e1 ?e2)))

这是一个 DSL 语句,用于调用具有 90 个输入节点的神经网络。
当然可以解决它,但想知道限制来自哪里。
谢谢。

最佳答案

首先,该限制仅适用于所需的位置参数;您始终可以使用可变参数大小写(函数签名中的 & more-args)来处理任意数量的参数:

(defn foo [& args]
  (count args))

(foo 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25)
;; returns 25

其实乍一看,& args很可能是您问题的正确解决方案。 (例如,您将能够在收集到序列中的输入节点上映射函数,loop/recur 在所述序列等上 - 与分配单独的名称相比,使用大量相似的项目往往更有意义给他们每一个人。

(请注意,我不会假装知道您要转录到 Clojure 中的特定 DSL 的性质或您正在处理的问题类型,只是建议您可能感兴趣的点。如果您有这似乎并不适用的非常时髦的情况,也许您可​​以提供更多详细信息,我们会看看这里是否有人可以提供一些有用的提示来在 Clojure 中处理它。)

为了完整起见,您可以添加 & args位到将其前 19 个参数作为所需位置参数的函数:
(defn bar [a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17 a18 a19 & as]
  (+ 19 (count as)))

(bar 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25)
;; returns 25

请注意,如果您指定 20 个位置参数和 & arg 最重要的是,显然会发生奇怪的事情。

至于基本原理,我认为这与 JVM 可以非常有效地通过 arity 分派(dispatch)给一个方法有关,所以 clojure.lang.Fn类有 invoke方法重载最多 20 个。我不完全确定它是否可以更高,但我想这不是人们经常需要的东西......我的意思是,我当然发现任何 API 指定超过 20 个位置参数对一个功能有点怀疑。

关于function - 为什么 clojure 函数最多有 20 个参数的限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2735600/

相关文章:

javascript - 对象中的函数

java - 是 :gen-class is the only way to extend Java class in Clojure?

c++ - 我应该使用 C 或 C++ 实现来返回变量类型的最大大小吗?

c - C99 是否允许 UCHAR_MAX > UINT_MAX

javascript - 是否可以通过使用相同的功能单击不同的元素来切换不同的 div?

python - 作用域,使用当前模块中的函数

python - 在 Pandas 中滚动应用显示 "TypeError: only length-1 arrays can be converted to Python scalars"

clojure - 以下 Clojure 协议(protocol)有什么问题?

clojure - 如何将字符串解析为 Hiccup?

r - 限制ggplot2轴而不删除数据(超出限制): zoom