Liuw's Thinkpad

想要赢就先学会输,想要成功就先学会失败

Archive for the ‘scheme’ tag

Elisp不支持闭包,白忙了

without comments

今天下午研究了一下Continuation,在Wikipedia上看到了Continuation Passing Style的相关介绍,带有例程(不过是用Scheme写的)。既然自己在用Emacs,那么试试把例子都用Elisp实现一下吧。

其中有一个函数,用来制作支持CPS的函数,原型是这样的:

(define (cps-prim f)
  (lambda args
    (let ((r (reverse args)))
      ((car r) (apply f
                (reverse (cdr r)))))))

这样用,比如说要制作一个支持CPS的减法运算:

(define cps- (cps-prim -))

假如不使用cps-prim,那么每个函数都要这样写:

(define cps- (a b k)
  (k (- a b)))

很显然,使用cps-prim更加方便点。于是我打算用Elisp也做一个同样的函数,谁让我这么懒呢。

Elisp比较乱,所以写了挺久的,但是总算是写出来了:

(defun cps-prim (f)
  #'(lambda (args)
      (let ((r (reverse args)))
        (funcall (car r) (apply f
                                (reverse (cdr r)))))))
(fset 'cps- (cps-prim '-))

但是使用cps-的时候,会提示f无值。好吧,查一个info,心彻底凉了。11.9.2中明确写到,Elisp是不支持闭包的,所以f在cps-中是unbound的。想偷懒偷不成咯。

再进一步想想,Elisp不支持闭包,是否就不支持高阶函数呢?个人程序设计语言方面没什么了解,只能google了。显然我不是第一个想到这个问题的,还真是发现了一些有趣的东西。

http://lambda-the-ultimate.org/node/1936

有人说:

Closure = Function x Environment

不得不说,这个等式,比一个冗长的定义更清楚。

Written by liuw

January 23rd, 2010 at 10:42 pm