Застрял с реализацией потоков на схеме :( Основные определения у меня такие: (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)