Archive for the ‘elisp’ tag
發一段以前寫的elisp
無任何實用價值,無聊的時候寫的,做ASCII Art動畫。
(defun cinema (file fps)
(interactive "sFile: \nnFPS: ")
(let ((int-time (/ 1.0 fps)))
(find-file file)
(while t
(scroll-up 25)
(sit-for int-time))))
具體效果見 ASCII Art Bad Apple Emacs 。
Elisp不支持闭包,白忙了
今天下午研究了一下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
不得不说,这个等式,比一个冗长的定义更清楚。