<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=Content-Type content="text/html; charset=utf-8">
<META content="MSHTML 6.00.6000.16788" name=GENERATOR>
<STYLE></STYLE>
</HEAD>
<BODY>
<DIV><FONT face="Courier New" size=2>Thanks Matthew, with your help I concocted 
the following:</FONT></DIV>
<DIV><FONT face="Courier New" size=2></FONT>&nbsp;</DIV>
<DIV><FONT face="Courier New" size=2>&nbsp;; (macro-id? id-stx) (identifier? . 
-&gt; . boolean?)</FONT></DIV>
<DIV><FONT face="Courier New" size=2>&nbsp;;&nbsp;For use in a transformer 
only.</FONT></DIV>
<DIV><FONT face="Courier New" size=2>&nbsp;;&nbsp;Returns #t if the 
id-stx&nbsp;has a syntactic binding&nbsp;in the&nbsp;syntax local&nbsp;context 
of&nbsp;the run-time environment.</FONT></DIV>
<DIV><FONT face="Courier New" size=2>&nbsp;; If not, returns #f including when 
id-stx is not bound at all.</FONT></DIV>
<DIV><FONT face="Courier New" size=2></FONT>&nbsp;</DIV>
<DIV><FONT face="Courier New" size=2>&nbsp;(define (macro-id? id)<BR>&nbsp; 
(let/ec ec<BR>&nbsp;&nbsp; (call-with-exception-handler<BR>&nbsp;&nbsp;&nbsp; 
(lambda (exn) (ec #t))<BR>&nbsp;&nbsp;&nbsp; (lambda 
()<BR>&nbsp;&nbsp;&nbsp;&nbsp; (syntax-case*<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
(local-expand #`(#,id) (syntax-local-context) 
'())<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (#%plain-app) 
free-transformer-identifier=?<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((#%plain-app . 
z) #f)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (_ #t))))))</FONT></DIV>
<DIV><FONT face="Courier New" size=2></FONT>&nbsp;</DIV>
<DIV><FONT face="Courier New" size=2>Jos</DIV>
<DIV><BR></DIV></FONT>
<DIV><FONT face="Courier New" size=2>----- Original Message ----- </FONT>
<DIV><FONT face="Courier New" size=2>From: "Matthew Flatt" &lt;</FONT><A 
href="mailto:mflatt@cs.utah.edu"><FONT face="Courier New" 
size=2>mflatt@cs.utah.edu</FONT></A><FONT face="Courier New" 
size=2>&gt;</FONT></DIV>
<DIV><FONT face="Courier New" size=2>To: "Jos Koot" &lt;</FONT><A 
href="mailto:jos.koot@telefonica.net"><FONT face="Courier New" 
size=2>jos.koot@telefonica.net</FONT></A><FONT face="Courier New" 
size=2>&gt;</FONT></DIV>
<DIV><FONT face="Courier New" size=2>Cc: &lt;</FONT><A 
href="mailto:plt-scheme@list.cs.brown.edu"><FONT face="Courier New" 
size=2>plt-scheme@list.cs.brown.edu</FONT></A><FONT face="Courier New" 
size=2>&gt;</FONT></DIV>
<DIV><FONT face="Courier New" size=2>Sent: Thursday, January 15, 2009 6:57 
PM</FONT></DIV>
<DIV><FONT face="Courier New" size=2>Subject: Re: [plt-scheme] attempt to 
discern applications from syntactic formsfails</FONT></DIV></DIV>
<DIV><FONT face="Courier New"><BR><FONT size=2></FONT></FONT></DIV><FONT 
face="Courier New" size=2>&gt; At Thu, 15 Jan 2009 18:40:36 +0100, "Jos Koot" 
wrote:<BR>&gt;&gt; My question is at the &lt;===== in the following 
code:<BR>&gt;&gt; <BR>&gt;&gt; (define-syntax (x stx)<BR>&gt;&gt;&nbsp; 
(syntax-case stx ()<BR>&gt;&gt;&nbsp;&nbsp; ((_ x)<BR>&gt;&gt;&nbsp;&nbsp;&nbsp; 
(let ((y (expand-once #'x)))<BR>&gt;&gt;&nbsp;&nbsp;&nbsp;&nbsp; (printf "~s~n" 
(syntax-&gt;datum y))<BR>&gt;&gt;&nbsp;&nbsp;&nbsp;&nbsp; (syntax-case y 
(#%app)<BR>&gt;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((#%app . z) 
#''app)<BR>&gt;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (_ #''no-app))))))<BR>&gt;&gt; 
<BR>&gt;&gt; [...]<BR>&gt;&gt; (x (list 1 2 3))<BR>&gt;&gt; ; printed (#%app 
list 1 2 3)<BR>&gt;&gt; ; value: no-app, why??? &lt;===== I expected app<BR>&gt; 
<BR>&gt; The `expand-once' is working at phase 1, while `syntax-case' is<BR>&gt; 
comparing identifiers at phase 0.<BR>&gt; <BR>&gt; Furthermore, the `#%app' of 
`scheme/base' is being expanded to<BR>&gt; `#%plain-app'. Confusingly, in the 
scope of the `#%app' definition,<BR>&gt; `#%plain-app' is called `#%app', so the 
expansion prints as `#%app'<BR>&gt; <BR>&gt; So, you would have gotten the 
expected results with<BR>&gt; <BR>&gt;&nbsp;&nbsp;&nbsp; (syntax-case* y 
(#%plain-app) free-transformer-identifier=?<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp; 
((#%plain-app . z) #''app)<BR>&gt;&nbsp;&nbsp;&nbsp;&nbsp; (_ 
#''no-app))<BR>&gt; <BR>&gt; <BR>&gt; I doubt that this is what you really 
intended, though. I think it's<BR>&gt; more likely that you wanted to use 
`local-expand' (which will expand<BR>&gt; the given expression at phase 0) and 
use `#%app' as one of the stop<BR>&gt; forms, in which case the `syntax-case' 
match would work as you expect.<BR>&gt; <BR>&gt; Actually, depending on the 
context, it's probably better to use<BR>&gt; `#%plain-app' as a stop form, in 
which case you'll match on<BR>&gt; `#%plain-app'. That works with macros defined 
in a language other than<BR>&gt; `scheme/base', since `#%plain-app' is the 
primitive application form.<BR>&gt; <BR>&gt; <BR>&gt; 
Matthew<BR>&gt;</FONT></BODY></HTML>