2010-05-20 42 views
2

嘿傢伙,簡單的問題...表單中的連續調用/評估?

使用XLISP編寫程序,但我似乎遇到了一個簡單的基本問題,我似乎無法解決:也許有人有一個快速修復。

我想寫一個if語句誰是then-clause評估多個表單並返回最後一個值。

在例如:

(setq POSITION 'DINING-ROOM) 

(defun LOOK (DIRECTION ROOM) ...) 
(defun SETPOS (ROOM) ...) 
(defun WHERE() ...) 

(defun MOVE (DIRECTION) 
(if (not(equal nil (LOOK DIRECTION POSITION))) ; If there is a room in that direction 
(; Then-block: Go to that room. Return where you are. 
(SETPOS (LOOK DIRECTION ROOM)) 
(WHERE) 
) 
(; Else-block: Return error 
(list 'CANT 'GO 'THERE) 
) 
) 

意圖的邏輯等價物是:

function Move (Direction) 
{ 

if(Look(Direction, Room) != null) 
{ 
SetPos(Look(Direction,Room)); 
return Where(); 
} 
else 
{ 
return "Can't go there"; 
} 

} 

(道歉爲窮人web的格式)

我的問題是:

(
(SETPOS (LOOK DIRECTION ROOM)) 
(WHERE) 
) 

I只想返回WHERE的評估,但我需要先執行SETPOS函數。 XLISP不喜歡額外的括號:如果我刪除外部集合,我的WHERE列表就成爲我的其他人(我不想那樣)。如果我刪除了SETPOS和WHERE的集合,它將WHERE視爲SETPOS的參數;我也不想那樣。

那麼,我該如何評估第一個,然後第二個,然後返回最後評估的值?

+0

類似的問題在這裏:http://stackoverflow.com/questions/2852249/can-you-execute-multiple-statements-in-with-a-if-statement – 2010-05-21 19:23:24

回答

1

所以我發現做連續執行的方式(它的最佳手段或不是否):

更改:

(
(SETPOS (LOOK DIRECTION ROOM)) 
(WHERE) 
) 

要:

(let() 
(SETPOS (LOOK DIRECTION ROOM)) 
(WHERE) 
) 

其中執行兩種形式和返回最後的輸出。

+0

這將是更好的編輯你的問題,而不是交更新爲答案。 – Vatine 2010-05-22 12:54:05

3

Lisp通常提供類似PROGN的內容。 PROGN評估一系列表達式並返回最後一個表達式的值。

(progn 
    (do-this) 
    (do-that)) 

另外,也要看看你的代碼:

(if (not(equal nil (LOOK DIRECTION POSITION))) 

(EQUAL NIL (FOO)) is the same as (NULL FOO) 

(NOT (NULL FOO)) is the same as FOO. 

所以,你可以簡單的寫:

(if (LOOK DIRECTION POSITION) ... ...) 

或者,如果你想檢查是否有一個房間:

(if (ROOM-P (LOOK DIRECTION POSITION)) ... ...) 

ROOM-P將是一個返回T if有東西是房間。

您可能還需要使用典型的Lisp的縮進:

(defun MOVE (DIRECTION) 
    (if (LOOK DIRECTION POSITION) 
    (progn 
     (SETPOS (LOOK DIRECTION ROOM)) 
     (WHERE)) 
    (progn 
     ... 
     (list 'CANT 'GO 'THERE)))) 

還有一個COND結構:

(defun MOVE (DIRECTION) 
    (cond ((LOOK DIRECTION POSITION) 
     (SETPOS (LOOK DIRECTION ROOM)) 
     (WHERE)) 
     (t 
     ... 
     (list 'CANT 'GO 'THERE)))) 

我還提議從XLISP切換到像CLISP或ECL。 XLISP是舊的,大多數不是維護,而不是Common Lisp。