list - 我如何用 Eager 语言制作一个懒惰的列表?

标签 list functional-programming scheme lazy-evaluation operator-precedence

我想在 Scheme 中做一个懒惰的列表。这是我到目前为止。

;; Constructor for Pairs
(define (cons-stream a b)
  (cons a (λ() b)))

;; Selectors
(define (car-stream a-stream)
  (car a-stream))

(define (cdr-stream a-stream)
  ((cdr a-stream)))

;; Lazy List using the pairs
(define (lazy-list from)
  (cons-stream from (lazy-list (+ from 1))))

;; Take function
(define (take a-lazy-list number)
  (define (take-helper i )
    (if(= i number)
       empty
       (cons (car a-lazy-list) (take-helper (+ i 1)))))
  (take-helper 0))

懒惰列表的问题在于,Scheme 首先计算内部表达式(懒惰列表(+ from 1)),导致过程进入无限递归。

有没有办法让 con-stream 在没有任何评估的情况下采用这个内部表达式?

最佳答案

解决方案是使用宏。我不是方案专家(尤其不是宏),但也许这个片段可以作为灵感:

(define-syntax pointer-to
   (syntax-rules ()
    ((pointer-to var)
     (make-pointer
      (lambda () var) ; the "pointer dereference" operation
      (lambda (value) (set! var value)))))) ; "pointer write"

它的用法如下:
(define x 1)
(define px (pointer-to x))
(pointer-set! px 2) ; this (in some sense) becomes `(set! x 2)'

所以也许你想要类似的东西
(define-syntax lazy-cons
 (syntax-rules ()
  ((lazy-cons head lazytail)
   (cons head (lambda () lazytail)))))

但我不确定。看看define-syntax .

关于list - 我如何用 Eager 语言制作一个懒惰的列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/989618/

相关文章:

c# - 将不同的列表转换为字典不起作用

f# - 匹配可区分联合时的类型通配符

functional-programming - 如何访问元组的随机成员?

functional-programming - letrec 有什么好处?

python - 查找数组的第一个副本

python - sort() 不适用于列表理解

list - 在Scheme中的列表中添加元素

f# - OCaml 中的 IEnumerable<T>

recursion - Racket :识别尾递归?

scheme - 带参数和不带参数的 lisp(方案)函数