My Blogs

基于Org的GTD实践

Tags: Org Mode

Published 2017年06月30日 22:53 by james

引言

在过去的4年里,我一直在使用Orgmode来实现GTD方法

在这篇文章中,我将详细介绍如何使用Orgmode实现GTD,而不是解释GTD方法本身或Orgmode是如何工作的。

如果您不了解Orgmode并对其感兴趣,您应该先访问其网站。

orgmode文件

我将GTD拆分为四个单独的文件: - inbox.org:我收集所有东西的地方; - gtd.org:放置所有项目的位置; - someday.org:所有我可能在将来某个时候完成但不想一直看到的非当前活动任务; - tickler.org:我在此文件中放置了带有时间戳的条目,以便在正确的时间得到提醒。

将这些文件添加到议程文件非常重要(稍后将详细介绍议程),如下所示:

(setq org-agenda-files '("~/gtd/inbox.org"
                         "~/gtd/gtd.org"
                         "~/gtd/tickler.org"))

1. GTD收件箱 …

Linear Algebra

Tags: 数学

Published 2015年04月30日 23:00 by james

设$V_n,U_m$分别是$n,m$维的线性空间,如果一个从$V_n$ 到$U_m$的映射T满足

1)对于任意$\vec{a}_1,\vec{a_2} \in V_n$,有$T(\vec{a_1}+\vec{a_2})=T(\vec{a}_1)+T(\vec{a}_2)$

2)对于任一$\vec{a} \in V_n, \lambda \in R$,有$T(\lambda \vec{a})=\lambda T(\vec{a})$

则称映射T为线性映射,又称线性变换。

通过实例看解释器和编译器的区别

Tags: JavaScript , 编译器 , 解释器 , 程序设计语言理论

Published 2015年04月25日 23:00 by james

本文将通过一个简单例子来对比一下解释器和编译器的区别。

在实现Compiler(编译器)和Interpreter(解释器)之前,我们需要先选择一种目标语言,这里我们选用计算器语言,它的文法非常简单,而且可以很方便地扩展,除了四则运算之外,如果有需要,我们可以很方便地加入负数,平方,开方,幂,括号及变量等。

本例,为了演示简单,我们的计算器仅支持四则运算,负数和括号。

expression : term | expression '+' term | expression '-' term
term : primary_expression | term '*' primary_expression | term '/' primary_expression
primary_expression : DOUBLE_LITERAL | '(' …

零基础构建语言解释器

Tags: 函数式编程 , 程序设计语言理论 , Lambda , Lisp , JavaScript , 编译器 , 解释器

Published 2015年04月01日 23:00 by james

在编写Interpreter之前,我们需要先了解Lexer(词法分析器),Parser(语法解析器),AST(抽象语法树)。

一般情况下,Interpreter在解释执行程序时,一般会经过如下步骤。

  1. Lexer读入程序代码,把代码转换token序列。
  2. Parser把读到的token序列转换为AST(大部分情况下,Lexer内嵌为Parser的一部分)。
  3. 对AST进行Lowering(化简AST)或者desugar(把语法糖的AST节点转换为标准等价AST节点)处理。
  4. Interpreter递归执行AST,AST决定了代码的执行顺序。

alternative text

介绍完了基本的一些概念,我们现在开始来实现语言解释器。

首先,我们需要先定制文法规则,一般情况下,我们只要制定好了文法规则,就可以找一些工具来帮我们生成AST,对于复杂的文法规则,手写Parser是非常麻烦并且乏味的。 这里,为了简单,我们选用S-Expression来作为我们的文法规则来实现Lambda Calculus(Lambda演算)的解释器。 通过该Interpreter的实现,大家可以很容易就搞明白程序设计语言中耳熟能详却又未必深刻了解的一些概念,比如:类型,Lexical Scope(词法作用域),Dynamic Scope(动态作用域),闭包等概念。

Lambda Calculus

虽然规则简单,Lambda演算却是一门强大的语言。它的三个元素分别是是:变量,函数,调用。用传统的表达法,它们看起来就是:
    变量:x
    函数:λx.t
    调用:t1 t2

每个程序语言里面都有这三个元素,只不过具体的语法不同,所以你其实每天都在使用 lambda calculus。换成S-Expression就是:
    变量:x
    函数:(lambda (x) e)
    调用:(e1 …

Y-Combinator不同语言实现方案

Tags: 函数式编程 , 程序设计语言理论 , Lambda , 数学 , JavaScript

Published 2014年09月19日 19:00 by james

递归和定点

纯λ演算的一大特色是可以通过使用一种自应用技巧来书写递归函数。

f(n) = if n = 0 then 1 else n*f(n-1) 
f = λn.if n = 0 then 1 else n*f(n-1)

把f移到等式的后面,得到函数G

G = λf.λn.if n = 0 then …