在Clojure函数名称中允许使用尾部斜杠

Gra*_*Gra 2 clojure

对于我正在实现的DSL,我想创建一个=/函数(就像not=).
有可能告诉读者允许我这样做吗?

我的猜测是"不,你做梦.",但是谁知道......

user=> =/
RuntimeException Invalid token: =/  clojure.lang.Util.runtimeException (Util.java:221)

user=> (def =/ 1)
RuntimeException Invalid token: =/  clojure.lang.Util.runtimeException (Util.java:221)
1
RuntimeException Unmatched delimiter: )  clojure.lang.Util.runtimeException (Util.java:221)

user=> (defn =/ [x y] (not= x y))
RuntimeException Invalid token: =/  clojure.lang.Util.runtimeException (Util.java:221)
CompilerException java.lang.RuntimeException: Unable to resolve symbol: y in this context, compiling:(NO_SOURCE_PATH:0:0) 
CompilerException java.lang.RuntimeException: Unable to resolve symbol: y in this context, compiling:(NO_SOURCE_PATH:16:16) 
RuntimeException Unmatched delimiter: )  clojure.lang.Util.runtimeException (Util.java:221)
Run Code Online (Sandbox Code Playgroud)

jma*_*svt 8

Clojure的读者对待斜杠以特殊的方式:

'/'具有特殊含义,它可以在符号中间使用一次,以将命名空间与名称分开,例如my-namespace/foo.'/'本身命名除法函数.

因此,您将无法在函数名称中包含斜杠,因为读者会将其解释为命名空间的名称.

不明显的部分是当你输入:

(defn =/ ...)
Run Code Online (Sandbox Code Playgroud)

=/读者将符号扩展为完全命名空间限定名称:

 my.org.namespace/=/
Run Code Online (Sandbox Code Playgroud)

这违反了"每个名字的一个斜线"规则.

  • 我非常怀疑这个解释的"被读者扩展"的一部分.除非您使用反引号形式,否则读者不会展开任何内容. (2认同)