Emacs lisp高阶函数支持

时间:2013-04-10 18:47:12

标签: emacs functional-programming lisp elisp

我正在尝试使用闭包在Elisp中实现类似Haskell的高阶函数。

;;; -*- lexical-binding: t -*-
(defun foo (pair)
    (car pair))
(defun* .curry (fn)
    (lambda (x y &rest args) (apply fn (cons x y) args)))

((lambda (x y) (1+ x)) 2 3)
((lambda (&rest args) (apply (.curry #'foo) args)) 2 3)
(funcall (.curry #'foo) 2 3)
((.curry #'foo) 2 3)

问题是最后一行返回错误Invalid function。因此,似乎关闭不考虑理智的功能。我仍然可以在(.curry #'foo)中使用mapc,但不能在钩子中使用{{1}}。 这是我可以做些什么吗?

1 个答案:

答案 0 :(得分:2)

除了Scheme(以及诸如Racket之类的Scheme衍生物)之外,我所知道的任何Lisp中的((.curry #'foo) 2 3)无效。说明问题的最简单的代码如下:

(defun f () (lambda ()))
(funcall (f)) ; tested in Emacs 23 and CLISP, works
((f)) ; tested in Emacs 23 and CLISP, results in an error