Определение для каждого


Упражнения 2.23

Процедура для каждого похож на карте. Он принимает как аргументы процедуры и список элементы. Однако, вместо того, чтобы формировать список результатов, для каждого просто применяется процедура для каждой из элементы, в свою очередь, слева направо. Значения, возвращаемые применения порядок элементов не используются на всех-для каждого используется с процедуры, которые выполняют определенные действия, такие как печать. Например,

(for-each (lambda (x) (newline) (display x))
          (list 57 321 88))
57
321
88

Значение, возвращаемое при вызове для каждого (не показано выше) могут быть чем-то произвольным, такие как true. Дать реализацию для каждого.

Я написал следующее:

(define (for-each l f)
  (f (car l))
  (when (> (length l) 1) (for-each (cdr l) f)))

Это хороший ответ?



2221
1
задан 5 апреля 2011 в 06:04 Источник Поделиться
Комментарии
2 ответа

Нет. Ваша функция должна обработать пустой список. Если ваша реализация поддерживает только, использовать это:

(define (for-each f l)
(unless (null? l)
(f (car l))
(for-each f (cdr l))))

В противном случае R5RS-совместимая версия будет:

(define (for-each f l)
(cond ((not (null? l))
(f (car l))
(for-each f (cdr l)))))

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

(define (for-each f l)
(cond ((not (null? l))
(let ()
(f (car l))
(for-each f (cdr l))))))

Сейчас, вот, тоже, пусть тело неявное начать. Если вы хотите, чтобы обойти , чтотоже, затем привязать результате побочного эффекта к фиктивной переменной:

(define (for-each f l)
(cond ((not (null? l))
(let ((unused (f (car l))))
(for-each f (cdr l))))))

3
ответ дан 5 апреля 2011 в 06:04 Источник Поделиться

Приведенное ниже решение зависит не только и не начнется. Это кажется чем-то желательным, поскольку ни одна из этих процедур была введена в текст на данный момент.

(define (for-each proc items)
(if (null? items)
#t
(if ((lambda (x) #t) (proc (car items)))
(for-each proc (cdr items)))))

2
ответ дан 2 марта 2014 в 09:03 Источник Поделиться