指针运算的技巧

看下面示例:

int* p;
p = p + 12;

这里的p会发生什么?

答案是:右移12*4=48个byte。

为什么呢?指针在运算的时候,默认实在连续的内存空间里向右移动n个同类型的字节。比如int* p; p = p + 1,这里相当于p向右移动了一个int类型的,所以上面的代码应该是48个bytes。

python decorator解密

源:https://github.com/hchasestevens/posts/blob/master/notebooks/the-decorators-they-wont-tell-you-about.ipynb

感觉作者在这里写的这一点很好:

  • Decorators are applied once, at function definition time. 这里的意思呢,这个docorator是在“编译”时就被应用,而不是在“运行”时。
  • Annotating a function definition x with a decorator @d is equivalent to defining x, then, immediately afterward, having x = d(x).同样强调,这个decorator在这里类似于静态语言的内联(inline)。
  • Decorating a function with @d and @e, in that order, is equivalent to performing x = d(e(x)) after the function’s definition.这里强调的是decorator在这里使用的是函数编程里的习惯。

为什么c语言中的struct引用自己时,必须使用指针?

很多人提到的forward declaration,但是这里的这个人讲了为什么,感觉很有益:

its very important to note that structures are ‘value’ types i.e they contain the actual value, so when you declare a structure the compiler has to decide how much memory to allocate to an instance of it, so it goes through all its members and adds up their memory to figure out the over all memory of the struct, but if the compiler found an instance of the same struct inside then this is a paradox (i.e in order to know how much memory struct A takes you have to decide how much memory struct A takes !).

But reference types are different, if a struct ‘A’ contains a ‘reference’ to an instance of its own type, although we don’t know yet how much memory is allocated to it, we know how much memory is allocated to a memory address (i.e the reference).

The character of Functional Programming

在看Oreilly的《Functional Programming in Python》这个免费的小书的时候,里面提到了函数式编程的定义,作者说,什么是函数式编程(后面都简称为FP),首先要完全的讲清楚定义就是一个非常难的问题。所以要真正的讲清楚,什么不是FP?

  • FP不是你使用了所谓的函数式编程语言(Lisp、Clojure、Scala、Haskell、ML、OCAML、ErLang等)去编写程序就可以叫做FP。虽然这个答案很安全,但是没有解释到底什么是FP。包括很多使用了这些编程语言本身的人也很难解释清楚啥是FP。就比如瞎子摸象一样,每一个人看到的都是自己所知道的局部。
  • 拿FP跟命令式编程(imperative programming)对比也是一个安全的答案,但是依然没有回答问题。
  • 或者FP不是OOP(object oriented programming),不是答案!
  • FP不是Logic Programming(比如prolog)。

所以作者在这里总结的函数式编程要符合下面的特征:

  • function是一级类或者对象。也就是说,你对对象的所有的操作,同样也可以被应用到function上。
  • recursion被用作基础的控制结果(control structure),甚至在某些FP语言中没有loop这样的控制结构存在。
  • 聚焦于list processing(也是lisp语言的由来)。list或者sublist经常与递归一起使用用来代替loops。
  • FP拒绝所有的边际效应(side effects)。在命令式编程中,经常使用变量来跟踪state,而在FP中使用的是不可变的数据结构。
  • FP拒绝使用statement,而只使用expression。
  • FP通常更加关注what而不是how。
  • FP大量使用high order function(function嵌套)去解决实际的问题。