(defun count_eq (x n)
(if (typep n 'number)
(and (not (null (nth (- n 1) x))) (null (nth n x)))
(not t)
)
)
Lisp. Размер списка.
я реализовал так:
Код:
есть еще рекурсивный вариант:
Код:
(defun count_eq (x n)
(if (not (null (car x)))
(count_eq (cdr x) (- n 1))
(= n 0)
)
)
(if (not (null (car x)))
(count_eq (cdr x) (- n 1))
(= n 0)
)
)
однако данные функции работают не всегда корректно:
Код:
(count_eq '(1 2 ()) 3) -> NIL
(count_eq '(1 2 NIL) 3) -> NIL
(count_eq '(1 2 NIL) 3) -> NIL
это вызвано тем, что NIL является атомом. вопрос, как можно поправить функцию, что бы обработать данную ситуацию?
ЗЫ: функцию list-length не предлагать, бо сразу пропадает спортивный интерес! ;):D:)
Код:
(define (n-list? x count)
(match x
[(list head rest ...)
(n-list? rest (- count 1))]
['()
(= count 0)]
[_
#f]))
(match x
[(list head rest ...)
(n-list? rest (- count 1))]
['()
(= count 0)]
[_
#f]))
в итоге я реализовал это дело так.
Код:
(defun isnlist (x n)
(if (numberp n)
(if (listp x)
(isnlist (cdr x) (1- n))
(= n 0)
)
t
)
)
(if (numberp n)
(if (listp x)
(isnlist (cdr x) (1- n))
(= n 0)
)
t
)
)
Всё же, посмотрите в стандартной кодобазе камнлиспа механизмы сопоставления с образцом - если Схема, с её исключительно гигиеничными макросами, позволяет делать такие штуки, то в CL сопоставление с образцом присутствует наверняка. Паттерн матчинг универсален, выразителен и им очень удобно пользоваться, особенно при обработке списков.