Я написал код, который использует ленивую оценку для создания бесконечной структуры данных, но есть ошибка.Как использовать Lazy Evaluation в схеме Guile?
Вот код:
#!/usr/bin/guile \
-e main -s
!#
(define ints-f
(lambda (n)
(let ((n1 (delay (ints-f (+ n 1)))))
(cons n (force n1)))))
(define (main args)
(display (car (ints-f 3)))
(newline)
)
Это дает ошибку, которая говорит, что переполнение стека. Это означает, что сила выполняется, даже если она не вызвана. Как это исправить?
#!/usr/bin/guile \
-e main -s
!#
(define ints-f
(lambda (n)
(let ((n1 (delay (ints-f (+ n 1)))))
(cons n n1))))
(define (main args)
(display (car (ints-f 3)))
(newline)
)
Приведенный выше код дает ожидаемый выход 3, но если использовать корд, как в коде ниже
#!/usr/bin/guile \
-e main -s
!#
(define ints-f
(lambda (n)
(let ((n1 (delay (ints-f (+ n 1)))))
(cons n n1))))
(define (main args)
(display (cdr (ints-f 3)))
(newline)
)
Он печатает объект обещание.
Как использовать ленивую оценку в схеме хитрости?
Если вы «задерживаете», а затем «заставляете» сразу после этого, вы обходите ленивые свойства обещаний. Форма 'delay' эффективно создает thunk, и' force' вызывает его.Единственное отличие заключается в том, что обещает кешировать их результаты, поэтому одновременное повторение одного и того же обещания не будет переоценивать вычисление. Семантика общего языка по-прежнему абсолютно строгая. –