Emacs Lisp高阶函数支持

4
我正在尝试在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)

问题在于最后一行返回了错误无效的函数。因此,闭包似乎并没有考虑到合理的函数。我仍然可以在mapc中使用(.curry #'foo),但不能在钩子中使用。 我能做些什么吗?


.curry重写为宏?这是个好主意!感谢提供所有这些信息! - KAction
1个回答

2

除了Scheme(以及Scheme的衍生品,如Racket)之外,我所知道的任何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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接