(defun calculate-level-sums (lst) (calculate-level-sums-helper lst 1 '())) (defun calculate-level-sums-helper (lst level acc) (cond ((null lst) acc) ; Базовый случай: пустой список (t (multiple-value-bind (new-acc remaining-list) (process-level lst level acc) (calculate-level-sums-helper remaining-list level new-acc))))) (defun process-level (lst level acc) (cond ((null lst) (values acc nil)) ; Базовый случай: пустой список, возвращаем аккумулятор и nil, как признак окончания ((numberp (car lst)) (let ((new-acc (update-level-sum acc level (car lst)))) (values new-acc (cdr lst)))) ; Обновляем аккумулятор и переходим к следующему элементу ((listp (car lst)) (multiple-value-bind (inner-acc remaining-inner) (calculate-level-sums-helper (car lst) (1+ level) acc) ; Рекурсивно обрабатываем подсписок (values inner-acc (cdr lst)))); Возвращаем аккумулятор от подсписка и остаток исходного (t (values acc (cdr lst))))) ; Игнорируем не числовые атомы и продолжаем обработку (defun update-level-sum (acc level value) (let ((existing (assoc level acc))) (if existing (let ((new-acc (remove existing acc :test #'equal))) (cons (list level (+ value (cadr existing))) new-acc)) (cons (list level value) acc)))) (defun prepare-result (acc) (let ((has-level-one (assoc 1 acc))) (if has-level-one (sort acc #'< :key #'car) (sort (cons '(1 0) acc) #'< :key #'car)))) (defun calculate-level-sums (lst) (let ((acc '())) ; Initial accumulator (let ((result (calculate-level-sums-helper lst 1 acc))) (prepare-result result))))
(format t "~a~%" (calculate-level-sums '(a (b (4 (2 e (3) k 15) e 5) 7)))) (format t "~a~%" (calculate-level-sums '(1 (2 (3))))) (format t "~a~%" (calculate-level-sums '(1 2 (3 4 (5 6)))))
Standard output is empty
Warning: reserving address range 0x80000c0000...0x1fffffffffff that contains memory mappings. clisp might crash later! Memory dump: 0x8000000000 - 0x80000bffff 0x1485b4e00000 - 0x1485b50e4fff 0x1485b5215000 - 0x1485b5239fff 0x1485b523a000 - 0x1485b53acfff 0x1485b53ad000 - 0x1485b53f5fff 0x1485b53f6000 - 0x1485b53f8fff 0x1485b53f9000 - 0x1485b53fbfff 0x1485b53fc000 - 0x1485b53fffff 0x1485b5400000 - 0x1485b5402fff 0x1485b5403000 - 0x1485b5601fff 0x1485b5602000 - 0x1485b5602fff 0x1485b5603000 - 0x1485b5603fff 0x1485b5680000 - 0x1485b568ffff 0x1485b5690000 - 0x1485b56c3fff 0x1485b56c4000 - 0x1485b57fafff 0x1485b57fb000 - 0x1485b57fbfff 0x1485b57fc000 - 0x1485b57fefff 0x1485b57ff000 - 0x1485b57fffff 0x1485b5800000 - 0x1485b5803fff 0x1485b5804000 - 0x1485b5a03fff 0x1485b5a04000 - 0x1485b5a04fff 0x1485b5a05000 - 0x1485b5a05fff 0x1485b5a64000 - 0x1485b5a67fff 0x1485b5a68000 - 0x1485b5a68fff 0x1485b5a69000 - 0x1485b5a6afff 0x1485b5a6b000 - 0x1485b5a6bfff 0x1485b5a6c000 - 0x1485b5a6cfff 0x1485b5a6d000 - 0x1485b5a6dfff 0x1485b5a6e000 - 0x1485b5a7bfff 0x1485b5a7c000 - 0x1485b5a89fff 0x1485b5a8a000 - 0x1485b5a96fff 0x1485b5a97000 - 0x1485b5a9afff 0x1485b5a9b000 - 0x1485b5a9bfff 0x1485b5a9c000 - 0x1485b5a9cfff 0x1485b5a9d000 - 0x1485b5aa2fff 0x1485b5aa3000 - 0x1485b5aa4fff 0x1485b5aa5000 - 0x1485b5aa5fff 0x1485b5aa6000 - 0x1485b5aa6fff 0x1485b5aa7000 - 0x1485b5aa7fff 0x1485b5aa8000 - 0x1485b5ad5fff 0x1485b5ad6000 - 0x1485b5ae4fff 0x1485b5ae5000 - 0x1485b5b8afff 0x1485b5b8b000 - 0x1485b5c21fff 0x1485b5c22000 - 0x1485b5c22fff 0x1485b5c23000 - 0x1485b5c23fff 0x1485b5c24000 - 0x1485b5c37fff 0x1485b5c38000 - 0x1485b5c5ffff 0x1485b5c60000 - 0x1485b5c69fff 0x1485b5c6a000 - 0x1485b5c6bfff 0x1485b5c6c000 - 0x1485b5c71fff 0x1485b5c72000 - 0x1485b5c74fff 0x1485b5c77000 - 0x1485b5c77fff 0x1485b5c78000 - 0x1485b5c78fff 0x1485b5c79000 - 0x1485b5c79fff 0x1485b5c7a000 - 0x1485b5c7afff 0x1485b5c7b000 - 0x1485b5c7bfff 0x1485b5c7c000 - 0x1485b5c82fff 0x1485b5c83000 - 0x1485b5c85fff 0x1485b5c86000 - 0x1485b5c86fff 0x1485b5c87000 - 0x1485b5ca7fff 0x1485b5ca8000 - 0x1485b5caffff 0x1485b5cb0000 - 0x1485b5cb0fff 0x1485b5cb1000 - 0x1485b5cb1fff 0x1485b5cb2000 - 0x1485b5cb2fff 0x55e340f61000 - 0x55e341051fff 0x55e341052000 - 0x55e34115bfff 0x55e34115c000 - 0x55e3411bbfff 0x55e3411bd000 - 0x55e3411ebfff 0x55e3411ec000 - 0x55e34121cfff 0x55e34121d000 - 0x55e341220fff 0x55e3417c0000 - 0x55e3417e0fff 0x7fffe903c000 - 0x7fffe905cfff 0x7fffe91ac000 - 0x7fffe91affff 0x7fffe91b0000 - 0x7fffe91b1fff