# Macro syntax incompatibility

**URL:** <https://racket.discourse.group/t/macro-syntax-incompatibility/1433>\
**Category:** General\
**Created:** [November 2, 2022, 7:30am UTC](https://racket.discourse.group/t/macro-syntax-incompatibility/1433 "2022-11-02T07:30:35Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![damien\_mattei](https://yyz2.discourse-cdn.com/free1/user_avatar/racket.discourse.group/damien_mattei/32/2706_2.png) [@damien\_mattei](https://racket.discourse.group/u/damien_mattei)\
**Post date:** [November 2, 2022, 7:30am UTC](https://racket.discourse.group/t/macro-syntax-incompatibility/1433/1 "2022-11-02T07:30:35Z")

</div>

hello,

i have a macro that works in Guile scheme and is accepted by Racket but the execution is bad:

here is the macro:

```scheme
(define-syntax for
  (lambda (stx)
    (syntax-case stx ()
      ((kwd (init test incrmt) body ...)
       (with-syntax ((BREAK (datum->syntax #'kwd 'break))
		     (CONTINUE (datum->syntax #'kwd 'continue)))
		    #'(call/cc
		       (lambda (escape)
			 (let-syntax ((BREAK (identifier-syntax (escape))))
			   init
			   (let loop ()
			     (when test
				   (call/cc
				    (lambda (next)
				      (let-syntax ((CONTINUE (identifier-syntax (next))))
					body ...)))
				   incrmt
				   (loop)))))))))))

```

and here is a simple example in Scheme:

scheme@(guile-user)\> (for ((define i 0) (\< i 5) (set! i (+ i 1))) (display i) (newline))  
0  
1  
2  
3  
4

and here is the problem in Racket:  
Welcome to DrRacket, version 8.6 [cs].  
Language: racket, with debugging; memory limit: 512 MB.

```scheme
(define-syntax for
  (lambda (stx)
    (syntax-case stx ()
      ((kwd (init test incrmt) body ...)
       (with-syntax ((BREAK (datum->syntax #'kwd 'break))
		     (CONTINUE (datum->syntax #'kwd 'continue)))
		    #'(call/cc
		       (lambda (escape)
			 (let-syntax ((BREAK (identifier-syntax (escape))))
			   init
			   (let loop ()
			     (when test
				   (call/cc
				    (lambda (next)
				      (let-syntax ((CONTINUE (identifier-syntax (next))))
					body ...)))
				   incrmt
				   (loop)))))))))))

```

(for ((define i 0) (\< i 5) (set! i (+ i 1))) (display i) (newline))  
. . ../../Applications/Racket v8.6/share/pkgs/errortrace-lib/errortrace/stacktrace.rkt:700:4: identifier-syntax: undefined;  
cannot reference an identifier before its definition

i just realize the problem comes from identifier-syntax not existing in Racket (but i had no error until i used the macro...)

how can identifier-syntax be replaced with in racket?

thanks in advance  
Damien

---

<div class="post-metadata">

**Author:** ![soegaard](https://yyz2.discourse-cdn.com/free1/user_avatar/racket.discourse.group/soegaard/32/19_2.png) [@soegaard](https://racket.discourse.group/u/soegaard)\
**Post date:** [November 2, 2022, 10:35am UTC](https://racket.discourse.group/t/macro-syntax-incompatibility/1433/2 "2022-11-02T10:35:11Z")

</div>

Import it like this:

```scheme
(require (for-syntax r6rs/private/base-for-syntax))

```

---

<div class="post-metadata">

**Author:** ![damien\_mattei](https://yyz2.discourse-cdn.com/free1/user_avatar/racket.discourse.group/damien_mattei/32/2706_2.png) [@damien\_mattei](https://racket.discourse.group/u/damien_mattei)\
**Post date:** [November 2, 2022, 12:03pm UTC](https://racket.discourse.group/t/macro-syntax-incompatibility/1433/3 "2022-11-02T12:03:07Z")

</div>

> [@soegaard](#):
>
> `(require (for-syntax r6rs/private/base-for-syntax))`

Welcome to DrRacket, version 8.6 [cs].  
Language: reader "racket/SRFI-105.rkt", with debugging; memory limit: 512 MB.  
'()

> (for ((define i 0) (\< i 5) (set! i (+ i 1))) (display i) (newline))  
> 0  
> 1  
> 2  
> 3  
> 4  
> '()

Great 🙂  
thank you  
damien
