2010-05-20 3 views
2

안녕 얘들 아, 간단한 질문 ...양식 내 연속적인 통화/평가?

XLISP를 사용하여 프로그램을 작성했지만 간단한 근본적인 문제가 발생하여 작동하지 않는 것처럼 보였습니다. .

나는 then 절이 여러 양식을 평가하고 마지막 값을 리턴하는 if 문을 작성하려고합니다. 예에서

:

(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"; 
} 

} 

(. 사과 가난한 웹 서식)

I 가지는 문제는 함께

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

단순히 WHERE의 평가를 반환하고 싶지만 SETPOS 함수를 먼저 실행해야합니다. XLISP는 여분의 괄호를 좋아하지 않습니다. 외부 세트를 제거하면 WHERE 목록이 다른 것이됩니다 (나는 원하지 않습니다). SETPOS와 WHERE 주변의 세트를 제거하면 SETPOS에 대한 인수처럼 WHERE가 처리됩니다. 나는 또한 그것을 원하지 않는다.

그래서 첫 번째 평가 후 두 번째 평가를하고 마지막으로 평가 한 결과를 어떻게 반환합니까?

변경 :

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

사람 :

(let() 
(SETPOS (LOOK DIRECTION ROOM)) 
(WHERE) 
) 
두 폼을 실행

+0

비슷한 질문이 여기에 있습니다 : http://stackoverflow.com/questions/2852249/can-you-execute-multiple-statements-in-with-a-if-statement –

답변

1

그래서 나는 (그 최선의 방법이나하지 여부) 연속 실행을하는 방법을 발견 마지막 출력을 리턴했다.

+0

게시하는 것보다 질문을 편집하는 것이 좋습니다 답변이 답변으로 표시됩니다. – Vatine

3

보통 Lisp는 PROGN과 같은 것을 제공합니다. PROGN은 일련의 표현식을 평가하고 마지막 표현식의 값이 리턴됩니다.

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

또한 당신의 코드를 보면 :

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

을 또는 당신은 공간이 있는지 확인하려면 :

(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 (ROOM-P (LOOK DIRECTION POSITION)) ... ...) 

ROOM-P는 T를 반환하는 술어입니다. if 뭔가 방입니다.

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

나는 또한 CLISP 또는 ECL 같은 것으로 XLISP 전환을 제안합니다 :

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

또한 COND 구조가있다 :

은 또한 일반적인 리스프 들여 쓰기를 사용할 수 있습니다. XLISP는 오래되었고, 대부분 유지되지 않고 Common Lisp이 아닙니다.

관련 문제