Clojure如何更改运算符的返回类型?

时间:2016-08-16 15:58:04

标签: clojure

首先,我不是在寻找这个问题的答案,我简单地寻求澄清。这是一个4clojure问题,措辞有点暧昧,似乎没有涵盖任何例子。问题是:http://www.4clojure.com/problem/166

文本:

对于任何可订购数据类型,可以从单个操作(任何运算符但是=或≠将起作用)导出所有基本比较运算(<,≤,=,≠,≥和>)。编写一个带三个参数的函数,一个小于数据的运算符和两个要比较的项。该函数应返回描述两个项之间关系的关键字。 x和y之间关系的关键字如下:     x = y→:eq     x> y→:gt     x< y→:lt

  1. 我相信比较可用于实现所有比较运算符。我对么?
    1. 我相信这个问题要我改变小于运算符和大于运算符的返回类型,以便它们返回:lt,:gt和:eq
    2. 4clojure不允许使用defmacro。
    3. 我的问题是我在假设我应该覆盖<的返回类型时是正确的。和>?
    4. 如果我是正确的,有没有办法用宏来做到这一点? 请不要发布4clojure问题的答案,只是对问题的一般澄清会有所帮助。该文本还提到编写一个接收<然而其中一个例子使用>。所以对这里的要求有点困惑。我应该使用正确传递给我的函数的函数的输出,或者我想编写一个覆盖<的函数。和>传入函数内的运算符?

2 个答案:

答案 0 :(得分:5)

问题是要求你定义一个像

这样的函数
(defn compare [lt x y] ...)

其中lt是两个参数的函数,它返回第一个参数是否小于第一个参数。

(defn compare [lt x y]
   (if (lt x y)
     ...))

答案 1 :(得分:2)

事实上,在clojure核心中有一个特殊功能:comparator。它从任何带有两个args的函数生成比较器并返回truthy或falsey val。该比较器本身就是一个函数,当arg1和arg2的函数为真时返回-1,当arg2和arg1的函数为真时返回1,否则返回0

user> ((comparator <) 1 2)
-1
user> ((comparator <) 2 1)
1
user> ((comparator <) 1 1)
0
user> ((comparator (fn [a b] (< (count a) (count b)))) [1 2 3] [4])
1
user> ((comparator (fn [a b] (< (count a) (count b)))) [] [4])
-1
user> ((comparator (fn [a b] (< (count a) (count b)))) [10] [4])
0

所以,从4clojure应用到任务就足以创建比较器,比较val并得到-1,0或1所需的指标。