2010-05-20 90 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。