Эй, ребята, простой вопрос ...
Работа с XLISP для написания программы, но я, кажется, столкнулся с простой фундаментальной проблемой, с которой не могу обойтись: возможно, у кого-то есть быстрое решение.
Я пытаюсь написать оператор 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";
}
}
(Извиняюсь за плохое форматирование сети.)
У меня проблема с:
(
(SETPOS (LOOK DIRECTION ROOM))
(WHERE)
)
Я просто хочу вернуть оценку WHERE, но мне нужно сначала выполнить функцию SETPOS. XLISP не нравятся дополнительные скобки: если я удаляю внешний набор, мой список WHERE становится моим else (я этого не хочу). Если я удаляю наборы вокруг SETPOS и WHERE, он рассматривает WHERE как аргумент для SETPOS; Я тоже этого не хочу.
Итак, как мне просто оценить первое, затем второе и затем вернуть значения последнего оцененного?