これは私の機能です:
(defun MyFunction(input)
(let ((NEWNUM (find input num)))
(if (find input num) //if this
(setq num NEWNUM) (FUNCT2) //then execute both of these
(list 'not found)))) //else output this
したがって、if
ステートメントの後で、新しい変数を設定して関数を呼び出すために、(setq num NEWNUM)
の後に(FUNCT2)
を実行できるようにします。これを行う方法についてのアイデアはありますか?
いくつかのことを順番に行うには、progn
が必要です。
(defun MyFunction(input)
(let ((NEWNUM (find input num)))
(if (find input num) //if this
(progn
(setq num NEWNUM)
(FUNCT2)) //then execute both of these
(list 'not found)))) //else output this
if
が「片腕」である場合(つまり、else
ブランチが含まれていない場合)、通常はwhen
を使用する方が簡単で慣用的です。 unless
: http://www.cs.cmu.edu/Groups/AI/html/hyperspec/HyperSpec/Body/mac_whencm_unless.html
(when pred x y ... z)
を呼び出すと、pred
がtrueの場合、x y z
が順番に評価されます。 unless
がNILの場合、pred
も同様に動作します。 x y z
は、1つ以上の任意の数のステートメントを表すことができます。したがって:
(when pred (thunk))
と同じです
(if pred (thunk))
明確にするために、when
とunless
は常に「片腕のif」に使用する必要があると言う人もいます。
編集:あなたのスレッドは私にアイデアを与えました。このマクロ:
(defmacro if/seq (cond then else)
`(if ,cond (progn ,@then) (progn ,@else)))
これを有効にする必要があります:
(if/seq (find input num) //if this
((setq num NEWNUM) (FUNCT2)) //then execute both of these
((list 'not found)))))
したがって、一般的な形式は次のとおりです。
(if/seq *condition* (x y ... z) (a b ... c))
条件に応じて、最初または2番目のすべてのサブフォームを評価しますが、最後のサブフォームのみを返します。
上記のif
を除いて、progn
で複数のステートメントを使用することはできません。しかし、cond
フォームがあります。
(cond
((find input num) // if this
(setq num NEWNUM) // then execute both of these
(FUNCT2))
(t
(list 'not found))) // else output this
追加するだけで、(begin exp1 exp2 ...)構文を使用して、LISP内の複数の式を順番に評価することもできます。 ifのブランチでこれを使用すると、複数のステートメントを使用するのと同じ効果があります。