皆さん、素朴な疑問...
XLISP を使用してプログラムを作成していますが、回避できない単純な根本的な問題に遭遇したようです。おそらく誰かが簡単に修正します。
then-clause が複数のフォームを評価し、最後の値を返す 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";
}
}
(Web フォーマットが貧弱で申し訳ありません。)
私が抱えている問題は次のとおりです。
(
(SETPOS (LOOK DIRECTION ROOM))
(WHERE)
)
単純に WHERE の評価を返したいのですが、最初に SETPOS 関数を実行する必要があります。XLISP は余分な括弧が好きではありません: 外側のセットを削除すると、私の WHERE リストは私の else になります (私はそれを望んでいません)。SETPOS と WHERE の前後のセットを削除すると、WHERE が SETPOS の引数のように扱われます。私もそれはしたくない。
では、最初の評価、次に 2 番目の評価を行い、最後に評価された値を返すにはどうすればよいでしょうか。