Evolvable Programming
注:这跟genetic programming毫无关系。 最近,我有一个任务:我要写一个Partial Evaluator。 更具体的,这是个Simply Typed Lambda Calculus加上Reference/ADT的Partial Evaluator(PE)。Lambda Calculus上的PE很多人都做过,但是加上Reference就不好办了。我找了很多Scheme/ML的PE的paper,但是在里面,很多都对Effect闭口不提。就算提Effect,也是‘遇到Effect不做PE,跳过就好’。 没办法,我只好自己设计。凭借着我对Partial Evaluation跟Staging的理解,我弄了一个这样的设计: 0:我们先写一个Definitional Interpreter。 1:我们reify the Store。 2:我们利用MetaOCaml式的LetList写一个ANF converter。 3:我们把Definitional Interpreter的Value lift上Partially Static Domain,然后跟ANF converter‘合并’- 这样,Partially Evaluated Code会生成ANF代码,于是就没有code duplication跟capture avoidance substitution的问题。 别急,我们来一步步来看这是啥意思。 0:我们先写一个Definitional Interpreter。 type ('a, 'b) sum = Left of 'a | Right of 'b type var = Var of int type term = | Let of (var * term * term) | FromVar of var | Abs of (var * term) | App of (term * term) | Unit | Int of int | Add of (term * term) | Mult of (term * term) | IfZero of (term * term * term) | MkProd of (term * term) | Zro of term | Fst of term | MkRef of term | SetRef of (term * term) | GetRef of term | TLeft of term | TRight of term | Match of term * term * term type 'a env = int -> 'a let emptyStore _ = raise Not_found let extend e v x = function i when i == v -> x | i -> e i let genCounter () = let cnt = ref 0 in let gen () = let ret = !...