Lisp - 返回函数的函数

时间:2011-11-30 20:09:34

标签: lisp common-lisp

我想创建一个接收2个参数的函数,并返回一个自己接收电路板的函数。该功能需要检查用户输入并根据输入在板上进行更改。我对用户输入和我必须对电路板所做的更改没有任何问题。我的问题是返回函数的函数。要做到这一点,我正在使用lambda。这是我正在处理的代码:

(defun faz-jogador-manual (n_aneis peca)
#'(lambda (tabuleiro)
    (setf jogada (le-posicao))
    (let ((num_anel (first jogada))
        (posicao_anel (second jogada))
        (tab (copia-tabuleiro tabuleiro)))
    (tabuleiro-poe-peca tab peca num_anel posicao_anel))))

这个函数应该返回一个函数lambda,但是当我使用:

调用函数时
(faz-jogador-manual 3 'X)

我得到以下内容:

#<Closure (:INTERNAL FAZ-JOGADOR-MANUAL 0) [X] @ #x2112f462>

我不知道我做错了什么,是电话吗?功能本身?我需要帮助。

2 个答案:

答案 0 :(得分:3)

Common Lisp是一个Lisp-2,这意味着它有一个单独的命名空间用于函数和值;因此,在这种情况下,需要稍微特别对待功能。 (这与大多数Lisps相反。)

当您将函数作为值返回时,您不能以与使用defun定义函数相同的方式调用它。您需要使用funcallapply来执行此操作。你可以这样做:

;; insert an appropriate argument in place of tabuleiro for the inner function
(funcall (faz-jogador-manual 3 'X) tabuleiro)

如果您想更详细地了解此行为,您可以在线找到大量参考资料,例如this one.

答案 1 :(得分:2)

Closure对象是一个lambda,其中包含从上下文中捕获的词法变量(在您的情况下为n_aneis和peca)。这是一个可以放入变量的值,或者作为funcall的函数应用。

(defvar closure (faz-jogador-manual 3 'X))
(funcall closure *table*)