“用100个函数来操作一个数据结构比10个函数操作10个数据结构要好很多。基于一个统一的数据结构,我们可以构建出一系列的小函数,这些小函数又可以组合起来形成一个强大的系统。而为不同的数据结构编写不同的函数,在根本上就削减了复用的可能。” —— [ Alan Perlis ]
实现一个函数,在一个序列里定位某个函数的位置索引。
这个函数必须:
(defn index-of-coll
"索引函数
输入: coll,e (coll代表集合类型:顺序类型 set或者map) (e是用来匹配的项)
返回:索引号 (特殊的map返回key)
"
{:added "1.0"}
[coll e]
(let [cmp (if (map? coll) #(= (second %1) %2) #(= %1 %2)) ] ;; 定义比较表达式
;; 遍历比较
(loop [s coll, idx 0] ;; 开始循环
(when (seq s) ;; 退出条件
(if (cmp (first s) e) ;; 如果相等
(if (map? coll) ;; 如果是map
(first (first s)) ;; 返回key
idx) ;; 否则返回索引
(recur (next s) (inc idx))))))) ;; 跳转到循环
(def a-to-z (map char (range 97 123)))
(index-of-coll a-to-z \z) ;=> 25
(index-of-coll (set a-to-z) \z) ;=>25
(def A-to-Z (map char (range 65 91)))
(def my-map (zipmap A-to-Z a-to-z))
(index-of-coll my-map \z) ;=> \Z
(defn index-of-coll‘
{:added "终极版"}
[coll] (cond (map? coll) (seq coll) (set? coll) (map vector coll coll) :else (map vector (iterate inc 0) coll) ))
(defn pos
"索引函数
输入: coll,e (coll代表集合类型:顺序类型 set或者map) (e是用来匹配的项)
返回:索引号 (特殊的map返回key)
"
{:added "终极版"}
[coll ele]
(for [[i e] (index-of-coll‘ coll ) :when (= e ele)] i))
(pos A-to-Z \Z) ;=> (25)
(pos (set a-to-z) \z) ;=> (\z)
(pos my-map \z) ;=> (\Z)
“很难找到这样的两种语言(Pascal和Lisp),它们能如此清晰地代表着围绕这两种语言而聚集起来的两种差异巨大的文化。Pascal是为了构造金字塔————壮丽而辉煌、令人震撼,是由各就其位的沉重巨石筑起的静态结构。而Lisp则是为了构造有机体————同样的壮丽辉煌并令人震撼,由各就其位但却永不静止的无数简单的有机体片段构成动态结构。在两种语言里都采用了同样的组织原则,除了其中特别重要的一点不同之外:托付给Lisp程序员个人可用的自由支配权,要远远超过那些使用Pascal的公司。Lisp程序大大抬高了函数库的地位,使其可用性超越了催生它们的那些具体应用。……
而在Pascal里,数据结构的过度声明导致函数的专用性,阻碍并惩罚临时性的合作,(在Pascal中)采用100个函数在一种数据结构上操作,远远优于用10个函数在10种数据结构上操作。作为这些情况的必然后果,金字塔矗立在那里千年不变,而有机体则必须演化,否则就会死亡。”
本Markdown编辑器使用[StackEdit][6]修改而来,用它写博客,将会带来全新的体验哦:
[1]: SICP读书笔记(2)——扉页,序 - - ITeye技术网站
http://kidneyball.iteye.com/blog/923957
[2]:Fun with underscore.js - GitBook
https://www.gitbook.com/book/juntao/fun-with-underscore/details
[3]: Clojure 学习入门(12)—— map/pmap - IT-Homer - 博客频道 - CSDN.NET
http://blog.csdn.net/ithomer/article/details/17591499
原文地址:http://blog.csdn.net/lord_is_layuping/article/details/46277877