Изучаю язык по MIT'овской книжке (ссылка здесь где-то проскакивала).
Второй день ломаю голову над задачей (видно, трудно перестроиться на их образ мышления)
Там в одной из задач (3.50) предложено написать обобщённую функцию stream-map, заполнив недостающие фрагменты:
(define (stream-map proc . argstreams)
(if (<...> (car argstreams))
the-empty-stream
(<...>
(apply proc (map <...> argstreams))
(apply stream-map
(cons proc (map <...> argstreams))))))
Честно говоря, я в ауте. Подскажите, как это сделать?
Вообще, мне кажется, всё упирается в функцию apply.
Опять-таки не понимаю, как она должна быть реализована... По идее она должна применять какую-либо операцию к списку.
Т.е. для бинарной операции что-то типа:
(define (apply proc args)
(if (= (length args) 1)
(car args)
(proc (car args) (apply proc (cdr args)))))
Тогда stream-map я бы сделал несколько иначе:
(define (stream-map proc . argstreams)
(if (stream-null? (car argstreams))
the-empty-stream
(cons-stream
(apply proc (map stream-car argstreams))
(stream-map proc (map stream-cdr argstreams)))))
где map задана в виде:
(define (map proc items)
(if (null? items)
'()
(cons (proc (car items))
(map proc (cdr items)))))
Но как быть, например, если операция, например, триарная? Или в общем случае n-арная?
Объясните, плиз.
Курица — это инструмент, с помощью которого одно яйцо производит другие.