Можете ли вы выполнить несколько операторов в операторе «если»? - PullRequest
25 голосов
/ 17 мая 2010

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

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

Ответы [ 4 ]

41 голосов
/ 17 мая 2010

Чтобы сделать несколько вещей в последовательности, вы хотите 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
12 голосов
/ 18 мая 2010

Когда ваш 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 - правда.unless ведет себя аналогично, когда pred равен NIL.x y z может представлять любое количество операторов от одного вверх.Таким образом:

(when pred (thunk))

- это то же самое, что и

(if pred (thunk))

Некоторые люди говорят, что when и unless всегда следует использовать для «однорукого действия» из-за ясности.

Редактировать: Ваша тема дала мне идею.Этот макрос:

(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))

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

6 голосов
/ 19 мая 2010

Вы не можете использовать несколько операторов с 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
1 голос
/ 01 августа 2013

Просто добавьте, что вы также можете использовать синтаксис (begin exp1 exp2 ...) для последовательной оценки нескольких выражений в Lisp.Использование этого в ветви if будет иметь тот же эффект, что и использование нескольких операторов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...