(defun add-them(a b)
(loop
(if (< a 15)
(setq a (* a b))
(write a)
)
(when(> a 15)
(return a))
)
)
(print (add-them 3 5))
Имея проблемы с этим блоком кода, я хочу иметь возможность проверить, меньше ли a 15, и умножить его на b, если оно меньше 15 в цикле. Затем я хочу вернуть его, если он больше 15. Я никогда раньше не использовал lisp, и это для задания, поэтому, пожалуйста, не давайте мне прямой ответ, просто руководство.
В присваивании указано: «Это повторяется до тех пор, пока результат меньше 15».
Таким образом, цикл не требуется; это можно сделать с помощью рекурсии.
Что должно произойти, если a=15?
Я предполагаю, что они хотят, если >= 15, то вернуться. Это не указывает прямо, поэтому я предполагаю, исходя из контекста.
Я только что понял, что это уже решено, ха-ха, оно остановилось на 15, потому что было 15, я чувствую себя немного глупо.
Пожалуйста, добавьте точные инструкции для этого задания (вы действительно должны выводить a на каждом шаге?)... и также спросите учителя, можете ли вы использовать такие вещи, как loop или просто рекурсию.
На самом деле нет никакого смысла в изучении Лиспа, если в конечном итоге вы просто копируете код, который мог бы быть написан на Фортране. Лучше подумать о другом способе решения проблемы. В частности таким образом:
Чтобы ответить на задание:
Проверьте свой синтаксис. Оператор if принимает три аргумента: условие, код, когда условие истинно, и код, когда условие ложно.
(if <test>
<do-this-when-true>
<do-this-when-false> )
Каждый из них должен быть списком, поэтому, если вам нужно сделать несколько вещей, окружите его, например. progn. В вашем примере это будет выглядеть так
(loop
(if (< a 15)
(progn
(setq a (* a b))
(write a))
(return a))
)
Как упоминалось в другом комментарии, это не очень шепеляво, но это должно быть хорошим началом.
Требует ли ваше задание использования цикла?