diff --git a/pd/src/m_atom.c b/pd/src/m_atom.c
index b38fa8d226ac88baee6b3e56e991c35661ef28aa..3c4f5be2e6ca5af73cba8ef78362b426052cb960 100644
--- a/pd/src/m_atom.c
+++ b/pd/src/m_atom.c
@@ -6,6 +6,8 @@
 #include <stdio.h>
 #include <string.h>
 
+#define DOLLARALL -0x7fffffff /* defined in m_binbuf.c, too. Consider merging */
+
     /* convenience routines for checking and getting values of
         atoms.  There's no "pointer" version since there's nothing
         safe to return if there's an error. */
@@ -129,7 +131,7 @@ void atom_string(t_atom *a, char *buf, unsigned int bufsize)
     }
         break;
     case A_DOLLAR:
-        if(a->a_w.w_symbol == gensym("@"))
+        if(a->a_w.w_index == DOLLARALL)
         {
             /* JMZ: $@ expansion */
             sprintf(buf, "$@");
diff --git a/pd/src/m_binbuf.c b/pd/src/m_binbuf.c
index 9aa47d80644493814bd165e7d71aa3f3ce7426ea..1f815aa6a19f626cdb88030d1303d3b2202bf2a1 100644
--- a/pd/src/m_binbuf.c
+++ b/pd/src/m_binbuf.c
@@ -22,6 +22,8 @@
 #include <string.h>
 #include <stdarg.h>
 
+#define DOLLARALL -0x7fffffff /* sentinel value for "$@" dollar arg */
+
 /* escape characters for saving */
 static char* strnescape(char *dest, const char *src, size_t outlen)
 {
@@ -202,7 +204,7 @@ void binbuf_text(t_binbuf *x, char *text, size_t size)
                     if(buf[2]==0) /* only expand A_DOLLAR $@ */
                     {
                         ap->a_type = A_DOLLAR;
-                        ap->a_w.w_symbol = gensym("@");
+                        ap->a_w.w_index = DOLLARALL;
                     } 
                     else /* there is no A_DOLLSYM $@ */
                     {
@@ -392,7 +394,7 @@ void binbuf_addbinbuf(t_binbuf *x, t_binbuf *y)
             break;
         case A_DOLLAR:
             //fprintf(stderr,"addbinbuf: dollar\n");
-            if(ap->a_w.w_symbol==gensym("@")){ /* JMZ: $@ expansion */
+            if(ap->a_w.w_index==DOLLARALL){ /* JMZ: $@ expansion */
                 SETSYMBOL(ap, gensym("$@"));
             } else {
                 sprintf(tbuf, "$%d", ap->a_w.w_index);
@@ -456,7 +458,7 @@ void binbuf_restore(t_binbuf *x, int argc, t_atom *argv)
             else if (!strcmp(str, "$@")) /* JMZ: $@ expansion */
             {
                 ap->a_type = A_DOLLAR;
-                ap->a_w.w_symbol = gensym("@");
+                ap->a_w.w_index = DOLLARALL;
             }
             else if ((str2 = strchr(str, '$')) && str2[1] >= '0'
                 && str2[1] <= '9')
@@ -694,7 +696,7 @@ void binbuf_eval(t_binbuf *x, t_pd *target, int argc, t_atom *argv)
     {
         //fprintf(stderr, "count %d\n", count);
         if (at[count].a_type == A_DOLLAR &&
-            at[count].a_w.w_symbol==gensym("@"))
+            at[count].a_w.w_index==DOLLARALL)
         {
             //fprintf(stderr,"found @ count:%d ac:%d argc:%d ac+argc-1:%d\n",
             //    count, ac, argc, ac+argc-1);
@@ -765,6 +767,7 @@ void binbuf_eval(t_binbuf *x, t_pd *target, int argc, t_atom *argv)
             if (!ac) break;
             if (at->a_type == A_DOLLAR)
             {
+                /* would it make sense to consider $@ here? */
                 if (at->a_w.w_index <= 0 || at->a_w.w_index > argc)
                 {
                     error("$%d: not enough arguments supplied",
@@ -839,7 +842,7 @@ void binbuf_eval(t_binbuf *x, t_pd *target, int argc, t_atom *argv)
                 *msp = *at;
                 break;
             case A_DOLLAR:
-                if (at->a_w.w_symbol==gensym("@")) 
+                if (at->a_w.w_index==DOLLARALL)
                 { /* JMZ: $@ expansion */
                     int i;
                     //if(msp+argc >= ems)