Skip to content

Instantly share code, notes, and snippets.

@reeFridge
Last active November 16, 2018 08:59
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save reeFridge/8092d9f89c1ccd8f78cb5922e2e9759a to your computer and use it in GitHub Desktop.
Save reeFridge/8092d9f89c1ccd8f78cb5922e2e9759a to your computer and use it in GitHub Desktop.
Removes elements greater than n from list s
;; Функция f (s n) которая из многоуровневого списка чисел s создают новый список
;; исключив из него все элементы которые превышают заданное число n
;; итоговая реализация
(defun remove-gtn (s n)
(filter s (lambda (el) (not (> el n))) nil))
(defun add-head-if (head l p)
(if (funcall p head) (cons head l) l))
;; просто функции для удобства чтения с более привычными именами
(defun tail (l) (cdr l))
(defun head (l) (car l))
;; бежим по списку и если очередной элемент явлется атомом
;; и проходит проверку предикатом (предикат возвращает истину с этим элементом)
;; то добавляем его в результирующий список
;; ---
;; если же элемент является не атомом тогда рекурсивно выполняем тоже самое
;; только на уровне этого элемента и аппендим получившийся на этом уровне список к родительскому
(defun filter (l p curr)
(if (null l)
curr
(filter (tail l) p (if (atom (head l))
(add-head-if (head l) curr p)
(append curr (list (filter (head l) p nil)))))))
;; пример вызова
;; (remove-gtn '(1 2 3 (1 2 3)) 2)
;; >> (2 1 (2 1))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment