All macros are hygienic. However, you can pass in a lazy expression which then is evaluated in its original context.
The macro cannot insert variables into the caller scope, nor cause the function to return. Mostly it's similar to a static inline function with optionally polymorphic arguments. But it can do some more things as well, but nothing violating hygiene.