Это - моя функция:
(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
), обычно проще и идиоматичнее использовать , когда
и , если
: http://www.cs.cmu.edu/Groups/AI/html/hyperspec/HyperSpec/Body/mac_whencm_unless.html
Когда вы звоните (когда pred xy ... z)
, он просто вычислит xyz
последовательно, если pred
истинно. , если
не ведет себя аналогичным образом, когда pred
равно NIL. x y z
может представлять любое количество операторов, начиная с одного. Таким образом:
(when pred (thunk))
- это то же самое, что
(if pred (thunk))
. Некоторые люди говорят , когда
и , кроме случаев, когда
всегда следует использовать для «одноруких если» из-за ясности.
Edit: Ваша ветка дала мне идею. Этот макрос:
(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))
В зависимости от условия он оценивает все подчиненные формы в первой или второй, но возвращает только последнюю.
Вы не можете использовать несколько операторов с 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