1. Configure Emacs for clojure

    1.使用环境: ubuntu12.04 + emacs24 + leiningen2.3.4

    2.配置emacs
    a.添加package地址,在~/.emacs.d/init.el中加入:

    (require 'package)
    (add-to-list 'package-archives
                 '("marmalade" . "http://marmalade-repo.org/packages/"))
    (package-initialize)
    

    b.安装相关插件,在~/.emacs.d/init.el中加入:

    (defvar my-packages '(starter-kit
                          starter-kit-lisp
                          starter-kit-bindings
                          starter-kit-eshell
                          clojure-mode
                          clojure-test-mode
                          cider))
    
    (dolist (p my-packages)
      (when (not ...
    read more
  2. Recursive Clojure

    一般函数可以通过调用自身来实现递归的效果,但这种方式会消耗栈有导致栈 溢出。比如下面这个计算阶乘的例子:

    (defn recur-fac [n]
        (if (= 1 n)
            1
            (* n (recur-fac (dec n)))))
    

    通常,可以改写成尾递归的方式来避免消耗栈导致栈溢出,改写如下:

    (defn recur-fac [n]
        (letfn [(fac [c r]
                    (if (= 0 c)
                        r
                        (fac (dec c) (* c r))))]
        (fac n 1)))
    

    上面的写法使用了尾递归,在common lisp的语言中可以达到尾递归优化(TCO), 问题是clojure是基于JVM,无法支持完全的TCO,这主要是Java的安全模型决定 的。还好Clojue也支持同一个函数体直接调用自身的TCO,只是要使用clojure的 特殊形式,即使用recur关键字。改写如下 ...

    read more
  3. Description in Python

    在python中一个描述器就是定义下面的方法中一个或多个的一个对象:

    __get__(self, instance, owner)t
    __set__(self, instance, value)
    __delete__(self, instance)
    

    如果一个对象同时定义了__get__()__set__(),它叫做资料描述器。只定义了__get__()的描述器叫做非资料描述器(一般用于方法)。 资料描述器和非资料描述器的区别在于:相对于实例字典的优先级。如果实例字典中有与资料描述器同名的属性,优先使用资料描述器中的;如果实例字典中有与非资料描述器中同名的属性,优先使用实例字典中的。即优先级 资料描述器 > 实例字典 > 非资料描述器。
    要想写一个只读的资料描述器,只需同时定义__get__()__set__()并在__set__()中抛出一个AttributeError

    描述器的调用
    描述器可以直接这么调用:descriptor.__get__(obj),不过一般都是用来拦截对实例属性的访问。
    描述器的调用规则如下:

    • __get__(self ...
    read more
  4. Context manager in Python

    上下文管理器(context manager)是Python2.5开始支持的一种语法,用于处理指 定代码块进入和退出时的操作。一般使用with语法,也可以直接调用相应的方法。

    with语句
    with语句是用来简化“try/finally”语句的,通常用于处理共享资源的获取和 释放,比如文件、数据库和线程资源。它的用法如下:

    with VAR = EXPR:
        BLOCK
    

    其相当于进行了如下操作:

    VAR = EXPR
    VAR.__enter__()
    try:
        BLOCK
    finally:
        VAR.__exit__()
    

    例子如下:

    import time
    class demo:
        def __init__(self,label):
            self.label = label
    
        def __enter__(self):
            self.start ...
    read more
  5. Decroator in Python

    装饰器的作用是在原有对象的基础上添加额外功能。python中可以将函数作为参 数,进行装饰,返回经过修饰过的函数,比如:

    def decorator(fn):
        def wrapper():
            print "*** wrapper ***"
            fn()
            print "*** wrapper ***"
        return wrapper
    
    def origin_fn():
        print "--- origin ---"
    
    decorated_fn = decorator(origin_fn)
    
    decorated_fn()
    

    python可以使用语法糖@来达到相同的作用,例子如下:

    def makebold(fn):
        def wrapper():
            return "<b>" + fn() + "</b>"
        return wrapper
    
    def makeitalic(fn):
        def wrapper():
            return "<i>" + fn() + "</i>"
        return ...
    read more
  6. Generator in Python

    生成器是可以当作iterator使用的特殊函数。它有以下优点:
    1. 惰性求值;
    2. 在处理大的列表时不需要一次性加载全部数据,可以减小内存使用;
    除非特殊的原因,应该在代码中使用生成器。

    生成器(generator) vs 函数(function)
    生成器和函数的主要区别在于函数return a value, 生成器yield a value同时 记录以便在下次调用时从上次的状态下恢复执行。

    生成器(generator) vs 迭代器(iterator)
    * 迭代器是一个更一般的概念,它是一个有next方法和返回self的__iter__方 法的类。
    * 每个生成器是一个迭代器,但迭代器不一定是生成器,生成器是有记录上次 执行状态的迭代器。从这点上看生成器有点像闭包,只是它记录的不是数据 的状态,记录的是执行过程中的状态。

    生成器(generator) vs 续延(coninuations) 与生成器相比,续延更加灵活,续延允许你调用不同状态的执行过程,而不像生 成器这样直接返回。

    创建生成器
    在python可以使用以下方式创建生成器:
    1 ...

    read more
  7. Ruby Variables

    ruby变量类型有其首位字符来决定,分类如下:
    $ 全局变量
    @ 实例变量
    @@ 类变量,在module中定义的模块变量可被所有包含该module的类所访问
    [a-z] 局部变量
    [A-Z] 常量
    self 伪变量,永远指向当前正执行着的对象或未初始化变量的空值nil

    read more
  8. Javascript Tips

    Append an array to existing Array

    ``` javascript Append an array to existing Array var a = [1,2,3]; var b = [4,5,6]; Array.prototype.push.apply(a,b); // a contains [1,2,3,4,5,6]

      And use concat() method for the same but cancat() creates new array while ...
    read more
  9. Notebooks of the Mind

    • These incessant dialectical movements -- between process and product, person and society, one modality and another, intention and expression --are the core of the creative process.
    • Albert Einstein describes some of his ways of thinking: The words or the language, as they are written or spoken, do not seem to play ...
    read more
  10. Mastery

    • Mastery is not about perfection. It’s about a process, a journey. The master is the one who stays on the path day after day, year after year. The master is the one who is willing to try, and fail, and try again, for as long as he or she ...

    read more

« Page 3 / 4 »

blogroll

social