我想创建一个接收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>
我不知道我做错了什么,是电话吗?功能本身?我需要帮助。
答案 0 :(得分:3)
Common Lisp是一个Lisp-2,这意味着它有一个单独的命名空间用于函数和值;因此,在这种情况下,需要稍微特别对待功能。 (这与大多数Lisps相反。)
当您将函数作为值返回时,您不能以与使用defun
定义函数相同的方式调用它。您需要使用funcall
或apply
来执行此操作。你可以这样做:
;; 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*)