常见的lisp中的Typesafe和参数安全除法

时间:2012-01-20 05:28:10

标签: lisp common-lisp type-safety

长话短说我需要defun ts_div并允许它成为常规/

的类型安全和“参数安全”版本

基本上,我希望它接受一个包含任意数量的数字的列表(甚至没有),并且能够像这样调用它:

(ts_div (123 321 23))

或:

(ts_div somelist)

期望的结果:如果列表中有两个以上的项目,则第一项将被第二项除,其余项将被忽略。如果第二个数字为0,则应返回第一个数字的值。如果列表为空,则应返回0.

有关如何实现这一目标的任何建议?

旁注:我做了一些测试,尝试制作它的附加变体。基本上,总结在列表上下文中传递给它的任何数字,但正如预期的那样,它抱怨列表中的第一项不是函数,我一直无法弄清楚如何减轻它。

1 个答案:

答案 0 :(得分:1)

嗯。

的内容
(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