Ladies_Man

Бесконечные списки

Dec 26th, 2013
253
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scheme 1.14 KB | None | 0 0
  1. (use-syntax (ice-9 syncase))
  2.  
  3. (define-syntax lazy-cons
  4.   (syntax-rules ()
  5.     ((lazy-cons a b)
  6.      (cons a (delay b)))))
  7.  
  8. (define (lazy-car p)
  9.   (car p))
  10.  
  11. (define (lazy-cdr p)
  12.   (force (cdr p)))
  13.  
  14. (define (lazy-head xs k)
  15.   (define (iter i xs l)
  16.     (if (= i k) l (iter (+ i 1) (lazy-cdr xs) (append l (list (lazy-car xs))))))
  17.   (iter 0 xs '()))
  18.  
  19.  
  20. (define (lazy-ref xs k)
  21.   (define (iter i xs)
  22.     (if (= i k) (lazy-car xs) (iter (+ i 1) (lazy-cdr xs))))
  23.   (iter 0 xs))
  24.  
  25. (define (natural n)
  26.   (lazy-cons n (natural (+ n 1))))
  27.  
  28. (define naturals
  29.   (natural 0))
  30.  
  31. (define (lazy-map . args)
  32.   (define (iter xs S)
  33.     (if (null? xs) S (iter (cdr xs) (append S (list (lazy-cdr (car xs)))))))
  34.   (let ((proc (car args))
  35.         (xs (if (list? (cadr args))
  36.                 (cadr args)
  37.                 (cdr args))))
  38.    (lazy-cons
  39.     (eval (cons proc (map lazy-car xs)) (interaction-environment))
  40.     (lazy-map proc  (iter xs '())))))
  41.  
  42. (define (lazy-filter pred? xs)
  43.   (define (iter xs)
  44.     (if (pred? (lazy-car xs)) xs (iter (lazy-cdr xs))))
  45.   (let ((xs (iter xs)))
  46.     (lazy-cons (lazy-car xs) (lazy-filter pred? (lazy-cdr xs)))))
Advertisement
Add Comment
Please, Sign In to add comment