Типовое безопасное и безопасное рассуждение в общих списках - PullRequest
1 голос
/ 20 января 2012

Короче говоря, мне нужно defun ts_div и позволить ему быть типизированной и "безопасной аргументом" версией обычной /

По сути, я хочу, чтобы он принимал список с любым количеством чисел в нем (даже без него) и мог называть его так:

(ts_div (123 321 23))

или

(ts_div somelist)

Желаемый результат: если в списке более двух элементов, первый будет разделен на второй, а остальные будут игнорироваться. Если второе число равно 0, оно должно вернуть значение первого числа. Если список пуст, он должен вернуть 0.

Есть предложения о том, как этого добиться?

Sidenote: Я провел некоторое тестирование, пытаясь создать его дополнительный вариант. По сути, суммируйте все числа, переданные ему в контексте списка, но, как и ожидалось, он жалуется на то, что первый элемент списка не является функцией, и я не смог выяснить, как это можно смягчить.

1 Ответ

1 голос
/ 20 января 2012

Hm. Что-то вроде

(defun ts-div (list)
   (check-type list list)
   (destructuring-bind (&optional (first 0 got-first) (second 0 got-second) &rest ignored) list
       (declare (ignore ignored))
       (if got-second 
           (if (zerop second) first (/ first second)) 
           (if got-first first 0))))

может сработать, я думаю.

CL-USER> (ts-div '())
0
CL-USER> (ts-div '(1))
1
CL-USER> (ts-div '(1 0))
1
CL-USER> (ts-div '(1 2))
1/2
CL-USER> (ts-div '(1 2 123))
1/2
...