Комментарии 11
Интересно. Может развлекусь в части реализации. А не должен к srfi прилагаться какой-нибудь тест [с корнер кейсами]? Или это на отдаётся на откуп реализаторам?
ps: задал этот же вопрос в мейл-листе.
а вторая вообще заявляет, что не является Scheme.
А чем это плохо? Остальные аргументы понятны, но чем плохо, что Racket — это не (или скорее "больше чем") схема?
Это не то чтобы плохо, racket отличный язык. Просто если начать решать "в стиле racket", есть шанс (особенно когда пишешь мета-интерпретатор), что мета-интерпретатор (схемы) код из первых глав выполнить не может, потому что он использует фичи racket-only.
Плюс, я забыл написать, что оба не поддерживают r7rs в полной мере.
А разве реализация стримов не описана в самом SICP? Зачем ее реализовывать в SRFI?
Как реализовать cons-stream?
Я делал так в своём проекте. Про cons-stream тогда не знал. Даже если бы знал, всё равно бы сам делал ;)
(define (stream:car stream)
(car (force stream)))
(define (stream:cdr stream)
(cdr (force stream)))
(define (list->stream lst)
(delay (cons (if (null? lst) #f (car lst)) (list->stream (if (null? lst) lst (cdr lst))))))
(define (string->stream str)
(list->stream (string->list str)))
(define (reader->stream reader)
(delay (cons (reader) (reader->stream reader))))
(define (inport->charstream inport)
(delay (cons (read-char inport) (inport->charstream inport)))
Ну и как через вашу реализацию стримов реализовать cons-stream, чтобы код из sicp работал?
И ещё было бы прикольно посмотреть, как через ваши стримы реализовать, например, стрим, который через stream-ref выдаёт все положительные числа.
Пока не вижу проблем. Вопрос в генераторе ...->stream. Его можно сделать через макру, например с delay. В примере один из стримов делается из reader'а.
В моём проекте эти стримы использовались для парсера. Парсер ел столько символов, сколько ему надо через stream:cdr, а если фейлился, то следующий парсер использовал тот-же стрим (естественно, с уже вычисленной головой).
Можете привести код с sicp, который нужно проверить?
Пример с положительными числами вот такой?
;; вспомогательный стрим с указанного числа
(define (nats->stream* n)
(delay (cons n (nats->stream* (+ n 1)))))
;; все натуральные
(define (nats->stream)
(nats->stream 0))
;; "фильтрующий" стрим с предикатом
(define (stream:filter stream filter)
(delay (let loop ((s stream))
(let ((a (stream:car s))
(d (stream:cdr s)))
(if (filter a) (cons a (stream:filter d filter)) (loop d))))))
;; стрим с чётными
(define stream-even (stream:filter (nats->stream) even?))
;; 0
(stream:car stream-even)
;; 2
(stream:car (stream:cdr stream-even))
;; 4
(stream:car (stream:cdr (stream:cdr stream-even)))
Оно?
Вот вам цитата:
There is a constructor, cons-stream,
and two selectors, stream-car and stream-cdr, which satisfy the con-
straints
(stream-car (cons-stream x y)) = x
(stream-cdr (cons-stream x y)) = y
Можете привести код с sicp, который нужно проверить?
Ну, батенька, сходите уж, книжку откройте.
SRFI-216: Поддержка курса SICP. Обсудим?