2024 Clojure状态调查!中分享您的想法。

欢迎!有关如何使用本网站的更多信息,请参阅关于页面。

0

重新标记

这是最小案例,但是这似乎与提供的其他arity数量无关,以及是否使用列表或向量语法进行arity。

user=> (clojure-version)
"1.12.0-rc1"
user=> (defn f [&form])
Unexpected error (IndexOutOfBoundsException) macroexpanding defn at (REPL:1:1).
null
user=> *e
#error {
 :cause nil
 :via
 [{:type clojure.lang.Compiler$CompilerException
   :message "Unexpected error macroexpanding defn at (1:1)."
   :data #:clojure.error{:phase :macroexpansion, :line 1, :column 1, :source "NO_SOURCE_PATH", :symbol defn}
   :at [clojure.lang.Compiler macroexpand1 "Compiler.java" 7551]}
  {:type java.lang.IndexOutOfBoundsException
   :message nil
   :at [clojure.lang.RT subvec "RT.java" 1634]}]
 :trace
 [[clojure.lang.RT subvec "RT.java" 1634]
  [clojure.core$sigs$asig__5505 invoke "core.clj" 235]
  [clojure.core$sigs invokeStatic "core.clj" 259]
  [clojure.core$defn__5514 invokeStatic "core.clj" 317]
  [clojure.core$defn__5514 doInvoke "core.clj" 294]
  [clojure.lang.RestFn applyTo "RestFn.java" 149]
  [clojure.lang.Var applyTo "Var.java" 707]
  [clojure.lang.Compiler macroexpand1 "Compiler.java" 7525]
  [clojure.lang.Compiler macroexpand "Compiler.java" 7598]
  [clojure.lang.Compiler eval "Compiler.java" 7684]
  [clojure.lang.Compiler eval "Compiler.java" 7655]
  [clojure.core$eval invokeStatic "core.clj" 3232]
  [clojure.core$eval invoke "core.clj" 3228]
  [clojure.main$repl$read_eval_print__9240$fn__9243 invoke "main.clj" 437]
  [clojure.main$repl$read_eval_print__9240 invoke "main.clj" 437]
  [clojure.main$repl$fn__9249 invoke "main.clj" 459]
  [clojure.main$repl invokeStatic "main.clj" 459]
  [clojure.main$repl_opt invokeStatic "main.clj" 523]
  [clojure.main$main invokeStatic "main.clj" 668]
  [clojure.main$main doInvoke "main.clj" 617]
  [clojure.lang.RestFn invoke "RestFn.java" 400]
  [clojure.lang.AFn applyToHelper "AFn.java" 152]
  [clojure.lang.RestFn applyTo "RestFn.java" 135]
  [clojure.lang.Var applyTo "Var.java" 707]
  [clojure.main main "main.java" 40]]}

2 个答案

+2

被选中
+2
by

好吧,&form 和 &env 是特殊的参数名称,所以...不要这么做,好吗?

https://clojure.org/reference/macros#_special_variables

这与 anaphoric宏中的anaphors很相似。

by
它们是在 defmacro 表达式中特殊的参数名称。为什么它们会在 defn 表达式中也很特殊呢?
by
宏也是函数。在这种情况下,我认为它实际上是在构建 defn (宏) 中的 arglists(参数列表)时发生的,这是在宏展开过程中发生的。
by
我原本预计 defn 调用与 defmacro 调用的语义会有所不同,尽管它们依赖于相同的底层机制。也许“构建宏的签名(省略前两个参数)”可以在不同于“构建函数的签名(使用所有参数)”的方式进行。
...