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

发信人: TheMatrix (TheMatrix), 信区: Programming
标  题: Re: 用Clojure写了一个程序,和python差不多
发信站: BBS 未名空间站 (Sat Mar  9 23:32:34 2019, 美东)

又重构了一下:

(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]
  (if (= (count path) (* dim dim))
    (println path)
    (->> (possible-pos path pos)
      (map #(jump (conj path %) %)))))

(jump [[0 0]] [0 0])


我用thread last macro把几个地方改了一下。用thread last把map和filter串起来,
我感觉很方便。这个用法和clojure本身的for list comprehension,以及python的
list comprehension都很象。和其他语言所谓的flow style编程也很类似。

filter我用了三次,一次filter一点,这个是我喜欢的用法。不过我的口味也不固定,
有时这样有时那样。

let seen没有提出来,因为我看那行code长度比较合适,太长的我才提出。

尽量用了anonymous function shorthand的写法,但是有两个怎么也写不出来。它们用
到了parameter destructuring,我试图先写成

(filter (fn [p] ((set (range dim)) (get p 0))))

然后再写成

(filter #((set (range dim)) (get % 0)))

但是不行。第一种写法就不行。不知道为什么。



【 在 hci (海螺子) 的大作中提到: 】
: 我来code review一下:
: 1. 可以看出, 你还没有从imperative programming换成FP思维。因为你还在把for当
: 成for-loop在用,for是list comprehension,不是for-loop。Idiomatic Clojure在你
: 用for的地方,就用map。
: 2. 你用两道filter,其实应该就写在一个函数里面;
: 3. 要多用destructuring.
: 4. 集合可以当函数用,不用contain?
: 5. 简单函数用shorthand,省时省地方。
: 6. 用let把这个集合操作提出来,给个名字,不用重算了,代码目的更清晰
: (defn possible-pos [path pos]
: ...................



--
※ 来源:·WWW 未名空间站 网址:mitbbs.com 移动:在应用商店搜索未名空间·[FROM: 50.]

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

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

友情链接


 

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

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