Python3中排序的cmp函数的替代方法

作者:JerryXia | 发表于 , 阅读 (22)
def cmp_to_key(func):def key(x):return KeyWrapper(func, x)return keyprint(sorted([1,3,None,2], key=cmp_to_key(my_cmp)))我们在key函数中返回一个KeyWrapper对象,这个对象保存了cmp函数和实际要比较的值的引用,然后改写KeyWrapper的__lt__比较函数,使用cmp函数进行大小比较即可。
事实上python3已经为我们想到了这一点,我们只需要用functools.cmp_to_key函数就可以了。
...阅读全文

Build Redis with Xcode

作者:JerryXia | 发表于 , 阅读 (22)
Build and Debugging Redis with XcodeI’ve set up an Xcode project building redis. Debugging, code completion and jumping are all working properly.
Repository: https://github.com/codescv/redis.git
Happy hacking! :-)
...阅读全文

Redis Highlights (1) Redis中的类型和数据结构

作者:JerryXia | 发表于 , 阅读 (19)
Redis中的类型和数据结构redis对外有5中基本类型,分别是string t_string.c, list t_list.c, hash t_hash.c, set t_set.c 和 zset (ordered set) t_zset.c.这5种类型是“接口”而不是“实现”,因此redis得以根据不同的情形自由选择不同数据结构的实现,这也是redis在设计上的高明之处。
5种基本类型对应了int object.c, embstr object.c, raw sds.c, linkedlist adlist.c, ziplist ziplist.c, skiplist t_zset.c, ht dict.c, intset intset.c 这8种数据结构的实现。
类型与数据结构实现的对应关系如图。

实用type KEYNAME可以查看某个key对应的类型,而object encoding KEYNAME可以查看该key内部的实现。
stringstring 有三种实现方式,分别是int, embstr和raw.长度比较短的整数会使用int实现。长度比较短的字符串会使用...阅读全文

面向对象与函数式的思考

作者:JerryXia | 发表于 , 阅读 (16)
语序的区别在很长一段时间里,OOP在程序语言里占了统治地位。之所以它会如此流行,不是因为它有多优秀,而是因为它更容易被接受。在OOP里,对象是第一位的,动作是第二位的,这和主流的人类语言最为接近。例如,在面向对象的语言里,要描述”我看书”这个概念,一般是这样的:
i.read(book) (python, c++, java, ...)i read book  (ruby, scala, ...)这和人类语言的思维非常相似。而在函数式语言里,要表达这个概念就变成了:
read(i, book) 或者(read i book)在英语和中文里,语序都是”我 看 书”, 在日语和韩语里,语序是”我 书 看”, 无论如何,作为主语的”我”总是放在最前面的。而如果让你改口说”看 我 书”,无疑会非常别扭。
先有对象还是先有动作在面向对象语言里是先有对象后有方法,方法隶属于对象。这和人类直觉的思维方式是一致的。在OOP中,万物皆对象,数字是一种对象,数组是一种对象,字符串是一种对象, lambda是一种带有apply方法的对象。这很容易接受,对不对?
然而到了函数式语言里,万物皆lambd...阅读全文

scala中的for语句和map

作者:JerryXia | 发表于 , 阅读 (19)
Scala中的for语句是一种语法糖。
case 1: for (x) yfor (a <- x; b <- y; c <- z) expr会转成:
x.foreach(a => y.foreach(c => z.foreach(expr)))case 2: for (x) yield yfor (a <- x; b <- y; c <- z) yield expr会转成:
x.flatMap(a => y.flatMap(c => z.map(expr)))for中的类型匹配for (x: String <- Seq("a", "b", null)) yield x会返回List(a, b)。也就是说会对后面的值进行匹配,而null不会匹配String, 因此yield不会出null.
可以用scala -Xprint:parser 来查看编译器生成的代码,非常有用:
scala> for (x: String <- Seq("a", "b", null)) yield x[[syntax trees at end of                    parser]...阅读全文