Открыть список
Как стать автором
Обновить

Комментарии 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)))

Оно?

Где cons-stream-то?

Вот вам цитата:

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, который нужно проверить?


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