Похоже, что он делает то, что вы хотите:
(defun first-n (lst n acc)
(if (or (= n 0) (eq lst nil))
(reverse acc)
(first-n (cdr lst) (- n 1) (cons (car lst) acc))))
(defun keep-at-most-n-bits (l n)
(first-n l n '()))
Это работает путем создания вспомогательной функции (first-n
), которая принимает переменную аккумулятора.(acc
) first-n
вызывает себя, каждый раз обращаясь к первому значению списка ввода.Как только список ввода исчерпан или n
равен 0, функция восстанавливает аккумулятор и возвращает его.
Теперь все, что нужно keep-at-most-n-bits
, - это запустить вспомогательную функцию с пустым аккумулятором.
Это довольно распространенный шаблон в Схеме, однако в Схеме вы можете определить вспомогательную функцию в той функции, в которой она вам нужна. :) Я не уверен, поддерживается ли она на используемом вами диалекте.с, поэтому я решил, что это безопасно.:)