Thanks a lot guys.<div><br></div><div>As Eli pointed out, the main objective here is to use the special identifiers as macros, so I&#39;ll take a look at his suggestion.</div><div><br></div><div>Basically, @anything is used as a macro for dsl-style variable assignments:  ie, </div>
<div>@x = something, @y = something</div><div>Here &#39;@&#39; is the macro, and the rest of it is parsed out and stores &#39;x&#39; or &#39;y&#39; in local scope.</div><div><br></div><div>Similarly, I&#39;d like a macro $something, $something-else, where &#39;$&#39; is the macro for a kind of named action that has special properties.</div>
<div><br></div><div>I could make these work as (@ x = 2) or ($ call-my-action), but would prefer the token to be self-contained as in (@x = 2) or ($do-something).</div><div><br></div><div>Scott.<br><br><div class="gmail_quote">
On Sun, Jan 27, 2013 at 1:08 AM, Eli Barzilay <span dir="ltr">&lt;<a href="mailto:eli@barzilay.org" target="_blank">eli@barzilay.org</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="im">On Wednesday, Scott Klarenbach wrote:<br>
&gt; Is it possible to have a macro bound to an identifier with wildcards<br>
&gt; in it?<br>
&gt;<br>
&gt; So, for example, a macro (@*) that would be used for (@x) and (@y),<br>
&gt; where the symbols x and y are available during expansion.<br>
&gt;<br>
&gt; Or is this something that would have to be done at the reader level?<br>
&gt;  ie, (@ ...) is the macro, and the reader turns @x and @y into (@ x)<br>
&gt; and (@ y) respectively.<br>
<br>
</div>This is possibly irrelevant, but since there were some pointers in a<br>
direction that is not doing the above:<br>
<br>
1. You should try to avoid doing this at the reader level as much as<br>
   possible.  If you&#39;re trying to replace `@foo&#39; by something else,<br>
   then you can easily run into a mess when these things are quoted<br>
   etc.  In addition, since you&#39;re at the reader level, you cannot<br>
   know if you&#39;re looking at something which is any other kind of<br>
   non-expression, like argument names etc.<br>
<br>
   (This is from experience: a previous attempt at the scribble reader<br>
   was reading @foo{blah} as (dispatch foo &quot;blah&quot;).  It was<br>
   problematic for these reasons.)<br>
<br>
2. Identifier macros don&#39;t seem so helpful either, since they&#39;re used<br>
   as bindings for known names.<br>
<br>
3. Using `#%top&#39; might work, if you want the bindings of the<br>
   wildcard-ed @foo identifiers to be values as in Danny&#39;s example,<br>
   but it won&#39;t work if you want them to be macros.<br>
<br>
So if you really want them to be macros, then I think that your best<br>
bet is to hook into both the `#%top&#39; and the `#%app&#39; macros, the<br>
former to identify cases where you want (.... @foo ....) to expand to<br>
some (.... &quot;at-foo&quot; ....), and the latter to identify cases where you<br>
want (@foo ....) to get expanded to something else (that is, not just<br>
expand the @foo as in the identifier case).<br>
<br>
Here&#39;s an example that shows how both are used -- for fun, I made two<br>
things magical, `foo%&#39; identifiers, and `@foo&#39; things that were read<br>
by the scribble reader (which can be identified via a syntax<br>
property).<br>
<br>
<br>
-------------------------------------------------------------------------------<br>
#lang at-exp racket/base<br>
<br>
(module magic racket/base<br>
<br>
  (provide (rename-out [top #%top] [app #%app]))<br>
<br>
  (require (for-syntax racket/base))<br>
<br>
  (define-for-syntax (magical? id)<br>
    (and (identifier? id)<br>
         (regexp-match? #rx&quot;%$&quot; (symbol-&gt;string (syntax-e id)))))<br>
<br>
  (define-syntax (top stx)<br>
    (syntax-case stx ()<br>
      [(_ . id)<br>
       (cond [(magical? #&#39;id) #&#39;&#39;id]<br>
             [(syntax-property stx &#39;scribble) #&#39;&#39;id]<br>
             [else #&#39;id])]))<br>
<br>
  (define-syntax (app stx)<br>
    (syntax-case stx ()<br>
      [(_ id x ...)<br>
       (cond [(magical? #&#39;id) #&#39;(vector &#39;id x ...)]<br>
             [(syntax-property stx &#39;scribble) #&#39;(list &#39;id x ...)]<br>
             [else #&#39;(id x ...)])]))<br>
<br>
  )<br>
<br>
(require &#39;magic)<br>
<br>
blah%<br>
(blah% 1 2 3)<br>
@blah<br>
@blah{zzz}<br>
-------------------------------------------------------------------------------<br>
<span class="HOEnZb"><font color="#888888"><br>
<br>
--<br>
          ((lambda (x) (x x)) (lambda (x) (x x)))          Eli Barzilay:<br>
                    <a href="http://barzilay.org/" target="_blank">http://barzilay.org/</a>                   Maze is Life!<br>
</font></span></blockquote></div><br><br clear="all"><div><br></div>-- <br>Talk to you soon,<br><br>Scott Klarenbach<br><br>PointyHat Software Corp.<br><a href="http://www.pointyhat.ca" target="_blank">www.pointyhat.ca</a><br>
p 604-568-4280<br>e <a href="mailto:scott@pointyhat.ca" target="_blank">scott@pointyhat.ca</a><br>#308 - 55 Water St.<br>Vancouver, BC V6B1A1<br><br>_______________________________________<br>To iterate is human; to recur, divine
</div>