web-dev-qa-db-ja.com

「if」ステートメントで複数のステートメントを実行できますか?

これは私の機能です:

(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)を実行できるようにします。これを行う方法についてのアイデアはありますか?

26
Bramble

いくつかのことを順番に行うには、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
41
Chuck

ifが「片腕」である場合(つまり、elseブランチが含まれていない場合)、通常はwhenを使用する方が簡単で慣用的です。 unlesshttp://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))

明確にするために、whenunlessは常に「片腕の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番目のすべてのサブフォームを評価しますが、最後のサブフォームのみを返します。

12
Zorf

上記の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
6
JohnMaraist

追加するだけで、(begin exp1 exp2 ...)構文を使用して、LISP内の複数の式を順番に評価することもできます。 ifのブランチでこれを使用すると、複数のステートメントを使用するのと同じ効果があります。

1
Hrishi