Можете ли вы выполнить несколько операторов в инструкции "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)
, чтобы установить новую переменную, а затем вызвать функцию. Любые идеи о том, как это сделать?
Ответы
Ответ 1
Чтобы выполнить несколько действий последовательно, вы хотите 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
Ответ 2
Когда ваш if
является "одноруким", как они его называют (то есть, он не содержит ветки else
), обычно проще и более идиоматично использовать when
и unless
: http://www.cs.cmu.edu/Groups/AI/html/hyperspec/HyperSpec/Body/mac_whencm_unless.html
Когда вы вызываете (when pred x y ... z)
, он будет просто оценивать x y z
последовательно, если pred
- true. unless
ведет себя аналогично, когда pred
является NIL. x y z
может представлять любое количество операторов от одного вверх. Таким образом:
(when pred (thunk))
совпадает с
(if pred (thunk))
Некоторые люди говорят, что when
и unless
всегда должны использоваться для "однорукого-ifs" из-за ясности.
Изменить: ваш поток дал мне представление. Этот макрос:
(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))
В зависимости от условия, он оценивает все подформы в первом или втором, но возвращает только последний.
Ответ 3
Вы не можете использовать несколько операторов с 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
Ответ 4
Чтобы добавить, вы также можете использовать синтаксис (begin exp1 exp2...) для последовательного вычисления более одного выражения в Lisp. Использование этого в ветке if будет иметь тот же эффект, что и использование нескольких операторов.