Можно ли выполнить несколько операторов в “если” оператор?

Это - моя функция:

(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) чтобы установить новую переменную и затем вызвать функцию. Какие-либо идеи о том, как сделать это?

25
задан Frédéric Henri 16 October 2015 в 19:53
поделиться

3 ответа

Чтобы выполнить несколько последовательных действий, нужно 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
ответ дан 28 November 2019 в 18:27
поделиться

Когда ваш 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))

В зависимости от условия он оценивает все подчиненные формы в первой или второй, но возвращает только последнюю.

12
ответ дан 28 November 2019 в 18:27
поделиться

Вы не можете использовать несколько операторов с 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
ответ дан 28 November 2019 в 18:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: