如何在Clojure中重命名操作?

Sil*_*aya 1 functional-programming clojure

在我的列表中,添加,操作+显示为#.我怎样才能使它看起来像+?当我评估它时,它也应该与+完全相同.

我想这也适用于Clojure中的各种函数......谢谢你们.

Mic*_*zyk 5

#字符在Clojure中的符号名称中不是有效字符(请参阅此页面以获取有效字符列表),虽然它有时可能会起作用(通常会这样),但使用它并不是一个好习惯.此外,它肯定不会在符号的开头工作(实际上是文字,你仍然可以做(symbol "#"),虽然可能没有意义).正如Clojure读者目前所做的那样,没有什么可以做的(除了可能会将读者打开以使其处理#(即'#'后跟空格)作为符号#- 或者简单+- 尽管这是你真的不应该做的事情不行,所以我几乎感到内疚,因为它提供如何操作说明的链接.

如果您想将名称别名为Clojure中合法的其他名称,您可能会发现使用clojure.contrib.def/defalias宏而不是普通的方便def; 这有额外的好处是为您设置元数据(并且应该处理宏,虽然它似乎有一个错误,此时阻止,至少在1.2 HEAD).


如果您想在创建别名时重新定义一些内置名称...(如果不这样做,其余部分可能与您无关.)

首先,如果您使用Clojure 1.1或更早版本并且想要为名称提供自己的绑定clojure.core,则需要:refer-clojure在定义命名空间时使用.例如,如果您想提供自己的+:

(ns foo.bar
  (:refer-clojure :exclude [+]))

;; you can now define your own +
(defn + [x y]
  (if (zero? y)
    x
    (recur (inc x) (dec y))))

;; examples
(+ 3 5)
; => 8
(+ 3 -1)
; => infinite loop
(clojure.core/+ 3 -1)
; => 2
Run Code Online (Sandbox Code Playgroud)

Clojure 1.1对此结果的需求禁止重新引用在其他名称空间中引用Vars的名称; ns-unmap提供了一种适合REPL使用的方法(:refer-clojure :exclude ...),(:use :exclude ...)而且(:use :only ...),系统地提供了一种方法来防止不需要的名称首先从其他名称空间导入.

在当前的1.2快照中,有一个"last-var-in wins"策略,所以你可以不用:refer-clojure; 但它仍然会生成编译器警告,并且它的使用方式更好,而且:refer-clojure无法保证此策略能够在实际的1.2版本中生存.