2013-04-10 2 views
4

Я пытаюсь реализовать Haskell-подобную функцию высокого порядка в Elisp, используя затворы.Emacs lisp поддержка высокого порядка

;;; -*- 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, но не в перехватах. Я что-то могу с этим поделать?

+0

Переписать '.curry' как макрос? Это идея! Спасибо за всю эту информацию! – KAction

ответ

2

Ваш ((.curry #'foo) 2 3) недействителен в любом Lisp, который я знаю, кроме Схемы (и производных Схемы, таких как Racket). Простейший код, который иллюстрирует проблему, выглядит следующим образом:

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