長くなる可能性のあるリストで使用apply
するのは少し危険です。リストが よりも長い場合call-arguments-limit
、機能し(apply '+ list)
ません。現在、call-arguments-limit
は通常、現代の Lisp ではかなり大きいですが、50 まで小さくすることができます。これに関する詳細については、以下を参照してください。
あなたの最善の策reduce '+ list
は、各数値をそれ自体に、各非数値を に取るキー関数で使用することだと思います0
。(この重要な機能はabiessu がコメントで言及したものです。)
(reduce '+ list :key (lambda (x) (if (numberp x) x 0)))
CL-USER> (let ((list '(cheese 12 dog 8 shoe 5)))
(reduce '+ list :key (lambda (x) (if (numberp x) x 0))))
25
CL-USER> (let ((list '()))
(reduce '+ list :key (lambda (x) (if (numberp x) x 0))))
0
より複雑なキー関数を使用する代わりに、非数値 (または)(remove-if-not 'numberp list)
を取り除くために使用することもできます。(remove-if (complement 'numberp) list)
CL-USER> (let ((list '(cheese 12 dog 8 shoe 5)))
(reduce '+ (remove-if-not 'numberp list)))
25
CL-USER> (let ((list '()))
(reduce '+ (remove-if-not 'numberp list)))
0