``ABSTRACT BULLSHITE'' ;; range macro that builds a list of numbers at compile-time when possible
;; otherwise, it will be generated at run-time.
(define-syntax (range stx)
(define gen
(λ (x y s)
(let-values (((compare +/-)
(if (< x y) (values > +)
(values < -))))
(let loop ((x x)
(r '()))
(if (compare x y) (reverse r)
(loop (+/- x s)
(cons x r)))))))
(syntax-case stx ()
((~ n m s) (let ((n1 (syntax->datum #'n))
(m1 (syntax->datum #'m))
(s1 (syntax->datum #'s)))
(cond ((and (number? n1)
(number? m1)
(number? s1)) #`'#,(gen n1 m1 s1))
(else #`(#,gen n m s)))))
((~ n m) #'(~ n m 1))
((~ m) (let ((m1 (syntax->datum #'m)))
(if (number? m1) #`'#,(gen 0 (sub1 m1) 1)
#`(#,gen 0 (sub1 m) 1))))))
(range 0 10) ; => '(0 1 2 3 4 5 6 7 8 9 10), builds the list at compile-time.