fork(1) download
  1. ; two simple tasks
  2.  
  3. (define-syntax fold-of
  4. (syntax-rules (range in is)
  5. ((_ "z" f b e) (set! b (f b e)))
  6. ((_ "z" f b e (v range fst pst stp) c ...)
  7. (let* ((x fst) (p pst) (s stp)
  8. (le? (if (positive? s) <= >=)))
  9. (do ((v x (+ v s))) ((le? p v) b)
  10. (fold-of "z" f b e c ...))))
  11. ((_ "z" f b e (v range fst pst) c ...)
  12. (let* ((x fst) (p pst) (s (if (< x p) 1 -1)))
  13. (fold-of "z" f b e (v range x p s) c ...)))
  14. ((_ "z" f b e (v range pst) c ...)
  15. (fold-of "z" f b e (v range 0 pst) c ...))
  16. ((_ "z" f b e (x in xs) c ...)
  17. (do ((t xs (cdr t))) ((null? t) b)
  18. (let ((x (car t)))
  19. (fold-of "z" f b e c ...))))
  20. ((_ "z" f b e (x is y) c ...)
  21. (let ((x y)) (fold-of "z" f b e c ...)))
  22. ((_ "z" f b e p? c ...)
  23. (if p? (fold-of "z" f b e c ...)))
  24. ((_ f i e c ...)
  25. (let ((b i)) (fold-of "z" f b e c ...)))))
  26.  
  27. (define-syntax list-of (syntax-rules ()
  28. ((_ arg ...) (reverse (fold-of
  29. (lambda (d a) (cons a d)) '() arg ...)))))
  30.  
  31. (define (sum xs) (apply + xs))
  32.  
  33. (define (square x) (* x x))
  34.  
  35. (define (digits n . args)
  36. (let ((b (if (null? args) 10 (car args))))
  37. (let loop ((n n) (d '()))
  38. (if (zero? n) d
  39. (loop (quotient n b)
  40. (cons (modulo n b) d))))))
  41.  
  42. (define (f limit)
  43. (let loop ((n 1) (m 5))
  44. (when (<= n limit)
  45. (display n) (newline)
  46. (loop (* n m) (/ 10 m)))))
  47.  
  48. (display (f 10000)) (newline)
  49.  
  50. (display (list-of n
  51. (n range 110 1000 11)
  52. (= (sum (map square (digits n))) (/ n 11))))
Success #stdin #stdout 0.01s 8712KB
stdin
Standard input is empty
stdout
1
5
10
50
100
500
1000
5000
10000
#<unspecified>
(550 803)