java中的diss可以做标识符吗_为什么在Clojure中`disj`和`dissoc`有不同的功能?

只是为了给Arthur的答案提供一个平衡点:conj甚至更早定义(名称conj出现在core.clj的第82行vsp44的disj和1429的disoc),但适用于所有Clojure集合类型. :-)显然它不使用协议 – 相反它使用常规Java接口,就像大多数Clojure函数一样(事实上我相信目前Clojure中唯一使用协议的“核心”功能是reduce / reduce-kv ).

我猜想这是由于一种美学选择,并且实际上可能与地图支持结合的方式有关 – 他们支持disj,人们可能期望它采用可以传递给conj的相同参数,这将是问题:

;; hypothetical disj on map

(disj {:foo 1

[:foo 1] 2

{:foo 1 [:foo 1] 2} 3}

}

{:foo 1 [:foo 1] 2} ;; [:foo 1] similarly problematic

)

应该返回{},{:foo 1 [:foo 1] 2}还是{{:foo 1 [:foo 1] 2} 3}? conj愉快地接受[:foo 1]或{:foo 1 [:foo 1] 2}作为地图上的东西. (与两个映射参数合并意味着合并;实际上合并是根据conj实现的,添加了对nil的特殊处理).

因此,为地图设置dissoc可能是有意义的,因此很明显它会删除一个键,而不是“可以联合的东西”.

现在,理论上可以使用dissoc来处理集合,但是也许有人可能会期望它们也支持assoc,这可能说得不合理.可能值得指出的是,向量确实支持assoc而不是dissoc,所以这些并不总是在一起;这里肯定存在一些审美紧张.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值