当前在线人数15017
首页 - 分类讨论区 - 电脑网络 - 葵花宝典版 -阅读文章
未名交友
[更多]
[更多]
文章阅读:Re: 用Clojure写了一个程序,和python差不多
[同主题阅读] [版面: 葵花宝典] [作者:hci] , 2019年03月10日00:13:38
hci
进入未名形象秀
我的博客
[上篇] [下篇] [同主题上篇] [同主题下篇]

发信人: hci (海螺子), 信区: Programming
标  题: Re: 用Clojure写了一个程序,和python差不多
发信站: BBS 未名空间站 (Sun Mar 10 00:13:38 2019, 美东)

Clojure的各种数据结构有其自身特性,应该学会每个数据结构的概念是什么,否则会
有问题。

这也是一些人初学觉得Clojure设计有问题的地方,算是Clojure的实用性与一致性的权
衡吧。你现在遇到一个了。

1. Clojure函数是工作在抽象数据结构的接口层面上的,也就是Java Interface层次。
比如大部分函数是在Seq这个非常general的抽象层次。一般来说,你可以把Seq想成是
个List,当然List更具体,但一般把seq想成List就够了

2 有的函数是工作在更具体的数据结构层次上的,比如get,其实是工作在Map这个抽象
数据结构上的。

(doc get)
-------------------------
clojure.core/get
([map key] [map key not-found])
  Returns the value mapped to key, not-found or nil if key not present.

一般初学者不知道这个,以为get是在seq上工作的,就会犯你的(get q 0)不work的错
误。当然不会work, q是个seq,不是map。但如果q是个vector,那(get q 0)就会work
, 因为vector实现了map接口, 用index做key.

所以记住这个,只有list不是map, 而map, vector, set都可以当map用, set其实是一
个key=value的map, vector是个index=key的map. 

那为什么不把list也设计成map呢?因为不合理. List概念上是Lisp的linked list,它
不是一个可以random access by index的数据结构,所以不能当map用,没有正确的
performance characteristics。而vector可以。

还有一个区别,同一个conj函数, 在list上,是conj到前面,与cons一样的,而用在
vector上,是conj在后面。也是因为不同的performance expectation.

这一点,知道了设计意图,也就容易明白了。在一致性与实用性冲突的时候,Clojure
总是选实用性。


【 在 TheMatrix (TheMatrix) 的大作中提到: 】
: 又重构了一下:
: (def moves [[1 2] [2 1] [-1 2] [2 -1] [1 -2] [-2 1] [-1 -2] [-2 -1]])
: (def dim 5)
: (defn possible-pos [path pos]
:   (->> moves
:     (map #(map + pos %))
:     (filter (fn [[x y]] ((set (range dim)) x)))
:     (filter (fn [[x y]] ((set (range dim)) y)))
:     (filter #(not ((set path) %)))))
: (defn jump [path pos]
: ...................




--
※ 修改:·hci 於 Mar 10 00:16:18 2019 修改本文·[FROM: 67.]
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 67.]

[上篇] [下篇] [同主题上篇] [同主题下篇]
[转寄] [转贴] [回信给作者] [修改文章] [删除文章] [同主题阅读] [从此处展开] [返回版面] [快速返回] [收藏] [举报]
 
回复文章
标题:
内 容:

未名交友
将您的链接放在这儿

友情链接


 

Site Map - Contact Us - Terms and Conditions - Privacy Policy

版权所有,未名空间(mitbbs.com),since 1996