2011-11-30 59 views
1

我想创建一个函数,它接收2个参数并返回一个接收自己的函数。该功能需要检查用户输入并根据输入对板进行更改。我对用户输入和我必须对董事会所做的更改没有任何问题。我的问题是返回一个函数的函数。要做到这一点,我使用了lambda。这是我工作的代码:Lisp - 返回函数的函数

(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)))) 

该函数返回一个函数的λ,但是当我调用使用功能:

(faz-jogador-manual 3 'X) 

我得到如下:

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

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

回答

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.

+0

当试图调用与funcall的功能,你说,我得到如下:错误:试图把未绑定变量'FAZ-JOGADOR-手册”的价值。 –

+0

是的,当调用这样的函数时,它实际上工作:)但编译时仍然会出现警告,是否有任何方法可以解决这些问题,或者我不应该在意? –

+1

如果您显示您正在接受的警告,那么也许! – mquander

2

关闭对象从捕获的词法变量拉姆达上下文(在你的情况下,n_aneis和peca)。这是一个值,你可以将其放入一个变量中,或者与funcall一起作为函数应用。

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