fork download
  1. ; prime gaps
  2.  
  3. (define (identity x) x)
  4.  
  5. (define-syntax while
  6. (syntax-rules ()
  7. ((while pred? body ...)
  8. (do () ((not pred?)) body ...))))
  9.  
  10. (define-syntax define-generator
  11. (lambda (x)
  12. (syntax-case x (lambda)
  13. ((stx name (lambda formals e0 e1 ...))
  14. (with-syntax ((yield (datum->syntax (syntax stx) 'yield)))
  15. (syntax (define name
  16. (lambda formals
  17. (let ((resume #f) (return #f))
  18. (define yield
  19. (lambda args
  20. (call-with-current-continuation
  21. (lambda (cont)
  22. (set! resume cont)
  23. (apply return args)))))
  24. (lambda ()
  25. (call-with-current-continuation
  26. (lambda (cont)
  27. (set! return cont)
  28. (cond (resume (resume))
  29. (else (let () e0 e1 ...)
  30. (error 'name "unexpected return"))))))))))))
  31. ((stx (name . formals) e0 e1 ...)
  32. (syntax (stx name (lambda formals e0 e1 ...)))))))
  33.  
  34. (define-generator (primegen)
  35. (yield 2) (yield 3)
  36. (let* ((ps (primegen))
  37. (p (and (ps) (ps)))
  38. (q (* p p))
  39. (d (make-hashtable identity =)))
  40. (define (add m s)
  41. (while (hashtable-contains? d m)
  42. (set! m (+ m s)))
  43. (hashtable-set! d m s))
  44. (do ((c (+ p 2) (+ c 2))) (#f)
  45. (cond ((hashtable-contains? d c)
  46. (let ((s (hashtable-ref d c #f)))
  47. (hashtable-delete! d c)
  48. (add (+ c s) s)))
  49. ((< c q) (yield c))
  50. (else (add (+ c p p) (+ p p))
  51. (set! p (ps))
  52. (set! q (* p p)))))))
  53.  
  54. (define (gaps n)
  55. (let ((ps (primegen))
  56. (gs (make-hashtable identity =)))
  57. (let* ((prev (ps)) (prev (ps)) (curr (ps)))
  58. (let loop ((prev prev) (curr curr) (len 0))
  59. (cond ((= n len)
  60. (do ((g 2 (+ g 2))) ((< n g))
  61. (display g) (display #\tab)
  62. (display (hashtable-ref gs g #f))
  63. (newline)))
  64. ((hashtable-contains? gs (- curr prev))
  65. (loop curr (ps) len))
  66. (else (hashtable-set! gs (- curr prev) prev)
  67. (loop curr (ps) (+ len 1))))))))
  68.  
  69. (gaps 50)
Runtime error #stdin #stdout #stderr 0.08s 9944KB
stdin
Standard input is empty
stdout
Standard output is empty
stderr
Backtrace:
In ice-9/boot-9.scm:
 157: 12 [catch #t #<catch-closure 83e8bd0> ...]
In unknown file:
   ?: 11 [apply-smob/1 #<catch-closure 83e8bd0>]
In ice-9/boot-9.scm:
  63: 10 [call-with-prompt prompt0 ...]
In ice-9/eval.scm:
 432: 9 [eval # #]
In ice-9/boot-9.scm:
2401: 8 [save-module-excursion #<procedure 83f7cc0 at ice-9/boot-9.scm:4045:3 ()>]
4052: 7 [#<procedure 83f7cc0 at ice-9/boot-9.scm:4045:3 ()>]
1724: 6 [%start-stack load-stack ...]
1729: 5 [#<procedure 83fd738 ()>]
In unknown file:
   ?: 4 [primitive-load "/home/jhggFP/prog.scm"]
In ice-9/eval.scm:
 411: 3 [eval # #]
 386: 2 [eval #<memoized (make-hashtable identity =)> (50 . #<directory # 8373630>)]
 393: 1 [eval #<memoized make-hashtable> (50 . #<directory (guile-user) 8373630>)]
In unknown file:
   ?: 0 [memoize-variable-access! #<memoized make-hashtable> #<directory # 8373630>]

ERROR: In procedure memoize-variable-access!:
ERROR: Unbound variable: make-hashtable