вопрос по scheme
От: frogkiller Россия  
Дата: 11.09.06 20:34
Оценка:
Изучаю язык по 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-арная?
Объясните, плиз.
Курица — это инструмент, с помощью которого одно яйцо производит другие.
Re: вопрос по scheme
От: Трурль  
Дата: 12.09.06 05:28
Оценка:
Здравствуйте, frogkiller, Вы писали:

F>Вообще, мне кажется, всё упирается в функцию apply.

F>Опять-таки не понимаю, как она должна быть реализована... По идее она должна применять какую-либо операцию к списку.
apply применяет процедуру к аргументам, заданным списком.
(apply proc (list a1 ... an)) = (proc a1 ... an)
Re[2]: вопрос по scheme
От: frogkiller Россия  
Дата: 12.09.06 07:07
Оценка:
Здравствуйте, Трурль, Вы писали:

F>>Вообще, мне кажется, всё упирается в функцию apply.

F>>Опять-таки не понимаю, как она должна быть реализована... По идее она должна применять какую-либо операцию к списку.
Т>apply применяет процедуру к аргументам, заданным списком.
Т>
Т>(apply proc (list a1 ... an)) = (proc a1 ... an)
Т>


Т.е. apply — не функция, а особая форма? Что-то начинает проясняться. Спасибо.

P.S. Я так понимаю, если б в scheme были бы каррированные функции, то apply легко могла быть реализована в виде функции.
Курица — это инструмент, с помощью которого одно яйцо производит другие.
Re[2]: вопрос по scheme
От: lomeo Россия http://lomeo.livejournal.com/
Дата: 12.09.06 07:42
Оценка:
Здравствуйте, Трурль, Вы писали:

Т>apply применяет процедуру к аргументам, заданным списком.

Т>
Т>(apply proc (list a1 ... an)) = (proc a1 ... an)
Т>


Если быть точнее, то
(apply proc a1 ... an (list e1 ... en)) = (proc a1 ... an e1 ... en)
Re[3]: вопрос по scheme
От: lomeo Россия http://lomeo.livejournal.com/
Дата: 12.09.06 07:55
Оценка: 14 (2)
Здравствуйте, frogkiller, Вы писали:

F>P.S. Я так понимаю, если б в scheme были бы каррированные функции, то apply легко могла быть реализована в виде функции.


apply можно реализовать в виде функции через eval

(define (apply2 proc . lst)
  (define (gather lst)
    (if (null? (cdr lst))
        (car lst)
        (cons (car lst) (gather (cdr lst)))))
  (eval (cons proc (gather lst))))


Без eval можно в виде макроса.
Re[4]: вопрос по scheme
От: Programmierer AG  
Дата: 12.09.06 08:39
Оценка:
lomeo wrote:
> apply можно реализовать в виде функции через eval
>
>
> (define (apply2 proc . lst)
>   (define (gather lst)
>     (if (null? (cdr lst))
>         (car lst)
>         (cons (car lst) (gather (cdr lst)))))
>   (eval (cons proc (gather lst))))
>

>
> Без eval можно в виде макроса.
Чего-то сложновато.
Почему не (define (my-apply proc lst) (eval (cons proc lst)))?
Posted via RSDN NNTP Server 2.0
Re[5]: вопрос по scheme
От: lomeo Россия http://lomeo.livejournal.com/
Дата: 12.09.06 08:57
Оценка: 6 (1)
Здравствуйте, Programmierer AG, Вы писали:

PA>Чего-то сложновато.

PA>Почему не (define (my-apply proc lst) (eval (cons proc lst)))?

Потому что тогда не будет работать

(my-apply + 1 2 3 `(4 5 6))
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.