You want define-for-syntax
(in Racket).
(define-for-syntax _iota 0)
(define-syntax (iota stx)
(syntax-case stx ()
((iota)
(let ((i _iota))
(set! _iota (+ i 1))
#`#,i))))
(define zero (iota))
(define one-two-three (list (iota) (iota) (iota)))
(define (four) (iota))
(equal? zero 0)
(equal? one-two-three '(1 2 3))
(equal? (four) 4)
(equal? (four) 4)
(equal? (four) 4)
produces all true.