У меня есть функция вычисления биномиального расширения с необязательными параметрами для указания начального и конечного членов:
(defun comb-index (s k)
(let ((combinations nil))
(labels ((rec (s k offset entry)
(cond ((equal s k)
(push (reverse (loop
for i from 1 to s
do (push (1- (+ i offset)) entry)
finally (return entry)))
combinations))
((equal k 0)
(push (reverse entry) combinations))
(t (rec (1- s) (1- k) (1+ offset) (cons offset entry))
(rec (1- s) k (1+ offset) entry)))))
(rec s k 0 nil))
(nreverse combinations)))
(defun binomial (k &key (start 1) end)
(let ((b start)
(e (if (null end) k end)))
(labels ((rec (i)
(cond ((equal i e)
(comb-index k e))
(t
(append (comb-index k i) (rec (1+ i)))))))
(rec b))
)
)
Когда я компилирую и запускаю этот код, он выдаст следующую ошибку времени выполнения:
Unhandled memory fault at #x18.
[Condition of type SB-SYS:MEMORY-FAULT-ERROR]
Это вызвано е, но я не уверен почему. Я могу избежать этой проблемы, присваивая 'e' либо с 'k', либо с 'end', либо просто используя (когда ...) установить 'end' на 'k', если это ноль, но я не уверен, почему это не работает