Преобразование списка в список простых чисел - Lisp

Формулировка задачи:

Добрый день, уважаемые форумчане! Я в Лиспе совсем новичок, поэтому решение задач пока дается с трудом. Помогите с написанием цикла по простым числам при заданных начальном и конечном значении, т.е. имеем допустим список вида: (1 11) нужно получить из него такой: (2 3 5 7 11) Плюс нужно проверять первичные элементы списка на положительность, т.е. если какой-либо из элементов списка (первый или последний) меньше 1, то возвращаемый список должен быть nil. Функция проверки что число простое есть, да и поиск следующего простого числа тоже уже удалось получить. Пишу на CommonLisp. Заранее буду благодарен за любую помощь.

Код к задаче: «Преобразование списка в список простых чисел - Lisp»

textual
(defun is-prime (n &optional (c 2))
  (cond ((= n 1) nil)
        ((<= n 3) t)
        ((> c (/ n 2)) t)
        ((zerop (rem n c)) nil)
        (t (is-prime n (+ c 1)))))
 
==> IS-PRIME
 
(defun task (beg end &optional (r nil))
  (cond ((or (minusp beg) (minusp end)) nil)
        ((> beg end) r)
        ((is-prime end) (task beg (- end 1) (cons end r)))
        (t (task beg (- end 1) r))))
 
==> TASK
 
(task 1 20)
 
==> (2 3 5 7 11 13 17 19)
 
(task 2 66)
 
==> (2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61)
 
(task 12 66)
 
==> (13 17 19 23 29 31 37 41 43 47 53 59 61)

6   голосов, оценка 4.000 из 5


СОХРАНИТЬ ССЫЛКУ