Застрял с реализацией потоков на схеме :(
Основные определения у меня такие:
(define-macro (stream-cons p q)
(let
((pv (gensym)) (qv (gensym)))
`(let
((,pv (lambda () ,p)) (,qv (lambda () ,q)))
(lambda (f) (f ,pv ,qv)))))
(define stream-car
(lambda (s) (s (lambda (p q) (p)))))
(define stream-cdr
(lambda (s) (s (lambda (p q) (q)))))
(define stream-for-each
(lambda (func stream)
(if (null? stream)
'done
(begin
(func (stream-car stream))
(stream-for-each func (stream-cdr stream))))))
(частично спер из sicp, частично подогнал под свои нужды).
Простенький поток типа (define ones (stream-cons 1 ones)) работает
отлично, stream-for-each можно пустить по нему навечно.
Однако что-нибудь чуток посложнее, почему-то, начинает жрать память:
(define stream-map
(lambda (func . streams)
(if (or
(null? streams)
(< 0
(apply +
(map (lambda (s) (if (null? s) 1 0)) streams))))
'()
(stream-cons
(apply func (map stream-car streams))
(apply
stream-map
(cons func (map stream-cdr streams)))))))
(define nums (stream-cons 1 (stream-map + ones nums)))
или даже
(define number-stream
(lambda (number) (stream-cons number (number-stream number))))
Стоит пустить по такому потоку stream-for-each, рано или поздно он
сломается от того, что сожрет всю оперативку.
Второй день уже не могу разобраться. Есть подозрение, что где-то я
скосячил в определениях. Возможно, кто-нибудь сможет мне помочь?
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.
Похожие темы
- Форум Почему в scheme не любят set! ? (2014)
- Форум Вопрос про гигиенические макросы (2019)
- Форум Необязательные параметры функции в Scheme (2014)
- Форум Получить список из листьев дерева (scheme) (2006)
- Форум Scheme: syntax-rules . Должно быть что-то совсем простое, но не догоню - как... (2013)
- Форум GIMP - Scheme (Script-Fu) - Cохранение слоев в png (2017)
- Форум Readable Lisp S-expressions Project (2013)
- Форум [лисп?] Festival text2wave. Как оно работает? (2009)
- Форум [emacs] lambda -> cut (2011)
- Форум [xkcd] sex haskell rock 'n roll (2009)