call/ccscheme

你们对王垠的 40 行代码有啥看法?

你们懂它在做啥吗?我目前不是很懂

;; A simple CPS transformer which does proper tail-call and does not
;; duplicate contexts for if-expressions.

;; author: Yin Wang ([email protected])


(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

Colliot12/17/2017, 2:18:09 AM

抵制主页刷屏,从怼虎哥做起。

ice100012/17/2017, 3:27:30 AM

预览:

取消

其他地方

zuozijian3720 回复了 校招的本质是什么呢?

1.第一个问题我处理过,但是这完全是小问题,说不上难不难题的。第二个依靠配置解决,也能算难题?甚至不如第一个难,搜索一下就有答案。 2.没怎么了解过双向绑定,不过帖子里说的都是各大博客和文章还有专栏说腻了的东西,经常上网都能知道个大概。没有读过具体的源码。 3.体积太大就压缩,去除无用代码,提取公共代码。原文说的提取第三方库应该说是提取公共代码比较好。延迟加载,按需加载解决了首屏时间问题,但是会导致总量更加大。 4.这个问题很大,最简单的场景下自然是直接去重。 5.暂时没有考虑过优化性能,反正虚拟dom兜底,碰到需要优化的情况再说。immutable.js实现原理不知道,没读过源码,但是性能不错的原因就是原文说的,复用了部分数据,优化了equal 6.没有用过redux-promise和redux-trunk 7.我es6都才刚上手你们就es8了。。。。。。。 8.没用过promise.race。。。。。。 9.不懂css。。。。。。 10.不知道说的啥。。。。。。 11.不懂 12.没用过。。。 13.只用过koa2,没法对比。。。。。 14.没啥说的 15.链路复用,头更精简,没有具体了解过,道听途说。 16.不懂css 17.不知道Etag 太难了,找工作真难。。。。。

Colliot 回复了 MathJax 预览去掉闪烁有方法吗?

我有点想法了,关于实时性会展示错误的中间状态,我们可以等多少秒不输入之后再触发预览,貌似可以轻松用 rxjs 实现,参考它那个著名的搜索框例子。

nickname 回复了 这个无穷乘积的结果是多少?

根据资料 [1],关键在于以下结论 [2]:

frac{sin x}{x} = prod_{n = 1}^infty biggl( 1 - frac{x^2}{n^2pi^2} biggr)

结论的证明,细节见 [3]. 以下简述过程: 将函数 f(x) = cos(mu x),x in (-pi, pi), mu notinmathbb{Z} 傅立叶展开,得到式 1; 由连续性,取 x = pi,可得 cot(mu pi) 的无穷级数展开,得到式 2; 限制 mu < 1,可知式2中的无穷级数一致收敛,对式2在区间mu in (0, x)积分,即得到最初的结论. 要回忆一下复变函数的知识,我们就能解答最初的问题了。 [1] Weisstein, Eric W. "Sinc Function." From MathWorld--A Wolfram Web Resource. link [2] Gearhart, W. B. and Schulz, H. S. "The Function sinx/x." College Math. J. 21, 90-99, 1990. [3] R. Courant and F. John. "Introduction to Calculus and Analysis, volume I." Interscience Publishers, John Wiley & Sons. New York, 1965. p. 602.

nickname 回复了 LaTeX 有哪些可以改进的地方?

希望改进为: 只用编译一次,中间过程全部走内存,可选辅助文件是否输出 原生支持unicode 字体选择,原生提供字体回退和自由分区 支持更多图片类型 提高图文混排功能 提高编译器的「智能程度」,减少行间公式环境的数量 其实相当于,基于目前的软硬件水平重新设计和制造。知乎有人估计过,以 google 水平的薪资,大概需要10人*年的工作量。

nickname 回复了 这个无穷乘积的结果是多少?

may help: evaluate prod_{n=1}^infty bigl(1 + frac1{n^2} + frac1{n^4}bigr), from math.se

Colliot 回复了 这个无穷乘积的结果是多少?

上面打错了 QAQ 目前还没有修改功能。我好想有点头绪了,用 frac{pi^2}{6}=1+dfrac{1}{2^2}+dfrac{1}{3^2}+cdots 合起来搞搞应该就能看见胜利的曙光。

Colliot 回复了 这个无穷乘积的结果是多少?

我感觉可以直观理解一下…… sinh x = x + dfrac{x^3}{3} + dfrac{x^5}{5} + cdots 好吧直观理解不了……无法把里面 pi 的高次项消掉。

ztony 回复了 这个无穷乘积的结果是多少?

不会做 |_・)( _ _)ノ|壁

Colliot 回复了 这个无穷乘积的结果是多少?

卧槽,Mathematica 算出来是 dfrac{sinhpi}{pi}!

Colliot 回复了 类型系统可以对写机器学习的代码有所助益吗?

看这个帖子有感——PyTorch 有哪些坑/bug?——不知道类型系统能不能帮助。