fork(1) download
  1. ; maximal 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)
  55. (let ((ps (primegen)))
  56. (let loop ((prev-prime (ps)) (prev-gap 0))
  57. (let* ((prime (ps)) (gap (- prime prev-prime)))
  58. (when (< prev-gap gap)
  59. (display prev-prime) (display #\tab)
  60. (display gap) (newline))
  61. (loop prime (max gap prev-gap))))))
  62.  
  63. (gaps)
Runtime error #stdin #stdout #stderr 0.01s 7268KB
stdin
Standard input is empty
stdout
Standard output is empty
stderr
Error: during expansion of (lambda ...) - in `lambda' - pair expected: (lambda)

	Call history:

	<syntax>	  (quote15 ())
	<syntax>	  (##core#quote ())
	<syntax>	  (##sys#cdr tail17)
	<syntax>	  (##sys#car tail17)
	<syntax>	  (##core#begin (##sys#syntax-rules-mismatch input7))
	<syntax>	  (##sys#syntax-rules-mismatch input7)
	<syntax>	  (##sys#cdr input7)
	<eval>	  (##sys#er-transformer (lambda10 (input7 rename16 compare4) (let11 ((tail17 (##sys#cdr input7))) (con......
	<syntax>	  (##core#undefined)
	<syntax>	  (define-syntax define-generator (lambda (x) (syntax-case x (lambda) ((stx name (lambda formals e0 e1...
	<syntax>	  (##core#define-syntax define-generator (lambda (x) (syntax-case x (lambda) ((stx name (lambda formal......
	<syntax>	  (lambda (x) (syntax-case x (lambda) ((stx name (lambda formals e0 e1 ...)) (with-syntax ((yield (dat......
	<syntax>	  (##core#lambda (x) (syntax-case x (lambda) ((stx name (lambda formals e0 e1 ...)) (with-syntax ((yie......
	<syntax>	  (##core#begin (syntax-case x (lambda) ((stx name (lambda formals e0 e1 ...)) (with-syntax ((yield (d......
	<syntax>	  (syntax-case x (lambda) ((stx name (lambda formals e0 e1 ...)) (with-syntax ((yield (datum->syntax (......
	<syntax>	  (lambda)	<--