Гнездовые функции в операторе Lisp `if` - PullRequest
0 голосов
/ 01 января 2019

У меня есть этот if код в Common Lisp:

(if (= 1 1) ((write "Hello") NIL)  (else-function...)) 

Очевидно, 1 = 1, я хотел бы сделать это:

если условие (в данном случае 1= 1) верно, тогда я хотел бы напечатать "Hello" И вернуть NIL.Как я могу это сделать?Из того, что я понимаю, я могу сделать только одно из этих двух действий.

Должен ли я использовать лямбду для печати и возврата NIL одновременно?

1 Ответ

0 голосов
/ 01 января 2019

Чтобы составить выражения в последовательное выполнение (сначала сделайте это, затем сделайте это, наконец, верните это), вам нужно заключить их во что-то, если вы не более или менее используете сценарии на верхнем уровне.

самая основная конструкция для этого - progn, которая оценивает все данные формы в последовательности и, наконец, возвращает значения последней.Многие конструкции в Common Lisp имеют неявное progn, например, тела функций, тела let и т. Д. Есть также prog1 и prog2, которые делают то же самое, но возвращают значения первого иливторая форма после оператора, соответственно.

Таким образом, progn - это то, что вы должны использовать здесь.

Однако, если у вас есть только последующее, никакое другое предложение, вы можете использовать when вместо if.When имеет неявное progn.Существует также unless, поскольку, когда у вас есть только предложение else, не имеет значения.

Следует отметить, что существуют другие составные конструкции для других нужд: block позволяет использовать явную форму return-fromопределить значения во время выполнения.Tagbody позволяет использовать go, чтобы прыгать в нем (но ничего не возвращает, для этого вам понадобится дополнительный блок).Это в основном полезно для создания новых управляющих структур (например, в макросах).

...