Я новичок в распространении lisp, когда вижу в аргументе аргументов функции, я думал, что он похож на *args
в ruby
. И я начал писать функцию sumit
, чтобы сделать то же самое, что и +
.как бороться с `& rest` args в общем lisp
(defun sumit (&rest args)
(if (null args)
0
(+ (car args) (sumit (cdr args)))))
но когда я призываю (sumit 1 2 3)
он получает ошибку сегментации, рекурсии никогда не заканчивается. (sumit)
работает.
Так что мой подозреваемый (null args)
часть, но после изменения чего-то вроде (eql nil args)
или что-то подобное не работает.
Так что же такое способ разложения &rest
args? Каков правильный способ проверить nil
?
'SUMIT' принимает переменное число чисел в качестве аргументов, но в' (sumit (cdr args)) 'вы вызываете его одним аргументом списка, а не цифрами. Вам нужно использовать '(вместо этого применить # 'sumit (cdr args))'. – jkiiski
@jkiiski ohhh, это правильно! спасибо! btw, есть ли способ расширить список на несколько аргументов без использования 'apply'? – delta
@delta: no, use APPLY –