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)

问题是最后一行返回错误Invalid function。所以,似乎闭包不被认为是正常的功能。我仍然可以使用(.curry #'foo)in mapc,但不能使用 hooks。我能做些什么吗?

4

1 回答 1

2

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

(defun f () (lambda ()))
(funcall (f)) ; tested in Emacs 23 and CLISP, works
((f)) ; tested in Emacs 23 and CLISP, results in an error
于 2013-05-30T19:20:50.280 回答