Return Styles: Pseud0ch, Terminal, Valhalla, NES, Geocities, Blue Moon. Entire thread

ENTERPRISE METAPROGRAMMING

Name: Anonymous 2007-10-10 8:24

Name: Anonymous 2011-01-09 12:48

``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.

(define x 10)
(range 0 x) ; => '(0 1 2 3 4 5 6 7 8 9 10), evaluated at run-time.

(range 10 0) ; => '(10 9 8 7 6 5 4 3 2 1 0), compile-time.
(range x 0) ; same, run-time.

(range 0 5 0.5) ; => '(0 0.5 1 1.5 2 2.5 3 3.5 4 4.5 5)

(range 10) ; => '(0 1 2 3 4 5 6 7 8 9), builds a list of 10 elements at compile-time.
(range x) ; same, but at run-time.

Newer Posts
Don't change these.
Name: Email:
Entire Thread Thread List