I think this example [1,2]: (define-syntax my-or (syntax-rules () ((my-or) #t) ((my-or exp) exp) ((my-or exp rest ...) (let ((t exp)) (if exp exp (my-or rest ...)))))) should look like this: (define-syntax my-or (syntax-rules () ((my-or) #t) ((my-or exp) exp) ((my-or exp rest ...) (let ((t exp)) (if t ; <- t (my-or rest ...)))))) Otherwise, what's the rationale behind 'let'? AFAICT, it's described here [3], but Guile is not affected, right? So the following works as well: (define-syntax my-or (syntax-rules () ((my-or) #t) ((my-or exp) exp) ((my-or exp rest ...) (if exp exp (my-or rest ...))))) Note that 'my-or' is used in several places (e.g., [4]) and it's necessary to change them all. Also, there are other macros that use 'let' (e.g., 'cond1'). [1] https://gnu.org/software/guile/manual/guile.html#Defining-Macros [2] https://gnu.org/software/guile/manual/guile.html#Hygiene [3] http://stackoverflow.com/a/3215238 [4] https://gnu.org/software/guile/manual/guile.html#Syntax-Case