LINUX.ORG.RU

История изменений

Исправление monk, (текущая версия) :

Там может быть бесконечный список, или возвращаться хоть и список, но с задублированными значениями.

Это же лисп, а не хаскель. Бесконечных списков не бывает.

Как выглядит функциональная имплементация функции length?

Как всегда, хвостовая рекурсия с аккумулятором результата:

(defun my-length (list)
  (labels ((recurse (list result)
             (if list (recurse (cdr list) (1+ result)) result)))
    (recurse list 0)))

или можно красиво написать

(defun my-length (list) 
  (reduce #'+ list :key (constantly 1)))

если считать, что уже есть свёртка.

Исправление monk, :

Там может быть бесконечный список, или возвращаться хоть и список, но с задублированными значениями.

Это же лисп, а не хаскель. Бесконечных списков не бывает.

Как выглядит функциональная имплементация функции length?

Как всегда, хвостовая рекурсия с аккумулятором результата:

(defun my-length (list)
  (labels ((recurse (list result)
             (if list (recurse (cdr list) (1+ result)) result)))
    (recurse list 0)))

или можно красиво написать

(defun my-length (list) 
  (reduce #'+ list #:key (constantly 1)))

если считать, что уже есть свёртка.

Исправление monk, :

Там может быть бесконечный список, или возвращаться хоть и список, но с задублированными значениями.

Это же лисп, а не хаскель. Бесконечных списков не бывает.

Как выглядит функциональная имплементация функции length?

Как всегда, хвостовая рекурсия с аккумулятором результата:

(defun my-length (list)
  (labels ((recurse (list result)
             (if list (recurse (cdr list) (1+ result)) result)))
    (recurse list 0)))

или можно красиво написать

(defun my-length (list) 
  (reduce #'+ 0 list))

если считать, что уже есть свёртка.

Исходная версия monk, :

Там может быть бесконечный список, или возвращаться хоть и список, но с задублированными значениями.

Это же лисп, а не хаскель. Бесконечных списков не бывает.

Как выглядит функциональная имплементация функции length?

Как всегда, хвостовая рекурсия с аккумулятором результата:

(defun my-length (list)
  (labels ((recurse (list result)
             (if list (recurse (cdr list) (1+ result)) result)))
    (recurse list 0)))

или можно красиво написать

(defun my-length (list) 
  (fold #'+ 0 list))

если считать, что уже есть свёртка.