• 王垠的【40行代码】


    "我有什么资格说话呢?如果你要了解我的本事,真的很简单:我最精要的代码都放在 GitHub 上了。但是除非接受过专门的训练,你绝对不会理解它们的价值。你会很难想象,这样一片普通人看起来像是玩具的 40 行 cps.ss 代码, 融入了我一个星期的日日夜夜的心血,数以几十计的推翻重写。这段代码,曾经耗费了一些顶尖专家十多年的研究。一个教授告诉我,光是想看懂他们的论文就需要 不止一个月。而它却被我在一个星期之内闷头写出来了。我是在说大话吗?代码就摆在那里,自己去看看不就知道了。当我死后,如果有人想要知道什么是我上半生 最重要的“杰作”,也就是这 40 行代码了。它蕴含的美,超越我给任何公司写的成千上万行的代码。"

    有没有人来说说这个东西,我想知道他有没有说大话。

    附代码:

    ;; A simple CPS transformer which does proper tail-call and does not;; duplicate contexts for if-expressions.;; author: Yin Wang (yw21@cs.indiana.edu)(load "pmatch.scm")(define cps
      (lambda (exp)
        (letrec
            ([trivial? (lambda (x) (memq x '(zero? add1 sub1)))]
             [id (lambda (v) v)]
             [ctx0 (lambda (v) `(k ,v))]      ; tail context
             [fv (let ([n -1])
                   (lambda ()
                     (set! n (+ 1 n))
                     (string->symbol (string-append "v" (number->string n)))))]
             [cps1
              (lambda (exp ctx)
                (pmatch exp
                  [,x (guard (not (pair? x))) (ctx x)]
                  [(if ,test ,conseq ,alt)
                   (cps1 test
                         (lambda (t)
                           (cond
                            [(memq ctx (list ctx0 id))
                             `(if ,t ,(cps1 conseq ctx) ,(cps1 alt ctx))]
                            [else
                             (let ([u (fv)])
                               `(let ([k (lambda (,u) ,(ctx u))])
                                  (if ,t ,(cps1 conseq ctx0) ,(cps1 alt ctx0))))])))]
                  [(lambda (,x) ,body)
                   (ctx `(lambda (,x k) ,(cps1 body ctx0)))]
                  [(,op ,a ,b)
                   (cps1 a (lambda (v1)
                             (cps1 b (lambda (v2)
                                       (ctx `(,op ,v1 ,v2))))))]
                  [(,rator ,rand)
                   (cps1 rator
                         (lambda (r)
                           (cps1 rand
                                 (lambda (d)
                                   (cond
                                    [(trivial? r) (ctx `(,r ,d))]
                                    [(eq? ctx ctx0) `(,r ,d k)]  ; tail call
                                    [else
                                     (let ([u (fv)])
                                       `(,r ,d (lambda (,u) ,(ctx u))))])))))]))])
          (cps1 exp id))));;; tests;; var(cps 'x)(cps '(lambda (x) x))(cps '(lambda (x) (x 1)));; no lambda (will generate identity functions to return to the toplevel)(cps '(if (f x) a b))(cps '(if x (f a) b));; if stand-alone (tail)(cps '(lambda (x) (if (f x) a b)));; if inside if-test (non-tail)(cps '(lambda (x) (if (if x (f a) b) c d)));; both branches are trivial, should do some more optimizations(cps '(lambda (x) (if (if x (zero? a) b) c d)));; if inside if-branch (tail)(cps '(lambda (x) (if t (if x (f a) b) c)));; if inside if-branch, but again inside another if-test (non-tail)(cps '(lambda (x) (if (if t (if x (f a) b) c) e w)));; if as operand (non-tail)(cps '(lambda (x) (h (if x (f a) b))));; if as operator (non-tail)(cps '(lambda (x) ((if x (f g) h) c)));; why we need more than two names(cps '(((f a) (g b)) ((f c) (g d))));; factorial(define fact-cps
      (cps
       '(lambda (n)
          ((lambda (fact)
             ((fact fact) n))
           (lambda (fact)
             (lambda (n)
               (if (zero? n)
                   1
                   (* n ((fact fact) (sub1 n))))))))));; print out CPSed function(pretty-print fact-cps);; =>;; '(lambda (n k);;    ((lambda (fact k) (fact fact (lambda (v0) (v0 n k))));;     (lambda (fact k);;       (k;;        (lambda (n k);;          (if (zero? n);;            (k 1);;            (fact;;             fact;;             (lambda (v1) (v1 (sub1 n) (lambda (v2) (k (* n v2))))))))));;     k))((eval fact-cps) 5 (lambda (v) v));; => 120


    === 07/29/2013 更新 ===
    当事人到场了。我毕竟是个业余搞函数式编程的。大家还是不要看我这里,看的原版解释吧。
    ===================

    我大概读过这段代码:

  • 相关阅读:
    10.$和#的区别 | 11.添加对象时如何把生成的id返回
    9. Mybatis的分页助手(pageHelper):
    8.逆向工程
    7.动态Sql语句
    6.关联查询
    5.解决列名与属性名不一致的情况
    4.接口与映射文件结合使用
    3.优化Mybatis
    2、Mybatis的编程Demo
    阿帕奇ab测试
  • 原文地址:https://www.cnblogs.com/nbeee/p/9418486.html
Copyright © 2020-2023  润新知