2011-11-30 57 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*)