Partial Evaluation - Cookie Clicker
我们在上一篇文章中,描述了一个通用的优化技术: 找到时间差,把数据分成已知跟未知,并且用代码表示后者。 但是,这种做法有两个问题: 0 - 你需要费时费力去整这个东东,而且不是所有时候都能刚刚好复用代码。 1 - 如果我们预先不知道应该怎么区分呢?甚至,如果这是动态的呢?假设我们先接受一半的数据,等一会,然后接受另一半,那我们如何用上述的技巧?难不成把所有可能的分法都预先写一遍? 所以,我们希望把上述技术,staging,自动化掉,使得程序员不再需要去关心之。 我们应该怎么做呢? 我们先从最基本的开始,先决定要操作的语言吧: type expr = | Var of string | Int of int | Add of (expr * expr) | Mult of (expr * expr) 这个语言,简单到了极点,只剩下+跟*两个操作了。别担心,我们会一步步扩展这个语言。 module ENV = Map.Make(String) let rec eval (e : int ENV.t) : expr -> int = function | Var v -> ENV.find v e | Int i -> i | Add (x, y) -> eval e x + eval e y | Mult (x, y) -> eval e x * eval e y 这是一个标准的definitional interpreter实现,中规中矩,并没任何出彩的地方。...