This is the mail archive of the kawa@sources.redhat.com mailing list for the Kawa project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Problem with CL defmacro


Are Meisfjord wrote:
C:\>java kawa.repl --common-lisp
#|kawa:1|# (defmacro foo (bar) `(list ,bar))
<stdin>:1:2: Missing macro name for define-syntax
I checked in the attached patch, which seems to fix
the problem.
--
	--Per Bothner
per@bothner.com   http://www.bothner.com/per/
? kawa/standard/callcc.java.new
? kawa/standard/eval_and_compile.java
? kawa/standard/foo
cvs server: Diffing kawa/lang
Index: kawa/lang/Macro.java
===================================================================
RCS file: /cvs/kawa/kawa/kawa/lang/Macro.java,v
retrieving revision 1.18
diff -u -r1.18 Macro.java
--- kawa/lang/Macro.java	20 Oct 2002 19:49:13 -0000	1.18
+++ kawa/lang/Macro.java	12 Dec 2002 05:07:10 -0000
@@ -23,19 +23,19 @@
 
   public static Macro make (Declaration decl)
   {
-    Macro mac = new Macro(decl.getName());
+    Macro mac = new Macro(decl.getSymbol());
     mac.capturedIdentifiers = new java.util.Vector ();
     mac.bind(decl);
     return mac;
   }
 
-  public static Macro make (String name, Procedure expander)
+  public static Macro make (Object name, Procedure expander)
   {
     Macro mac = new Macro(name, expander);
     return mac;
   }
 
-  public static Macro make (String name, Procedure expander,
+  public static Macro make (Object name, Procedure expander,
 			    String[] templateIdentifiers,
 			    String capturedFields)
   {
@@ -99,20 +99,20 @@
     capturedFields = old.capturedFields;
   }
 
-  public Macro(String name, Procedure expander)
+  public Macro(Object name, Procedure expander)
   {
     super(name);
     //setType(thisType);
     this.expander = new QuoteExp(expander);
   }
 
-  public Macro(String name, Expression lexp)
+  public Macro(Object name, Expression lexp)
   {
     super(name);
     this.expander = lexp;
   }
 
-  public Macro(String name)
+  public Macro(Object name)
   {
     super(name);
   }
Index: kawa/lang/Syntax.java
===================================================================
RCS file: /cvs/kawa/kawa/kawa/lang/Syntax.java,v
retrieving revision 1.18
diff -u -r1.18 Syntax.java
--- kawa/lang/Syntax.java	9 Mar 2001 06:39:34 -0000	1.18
+++ kawa/lang/Syntax.java	12 Dec 2002 05:07:10 -0000
@@ -11,17 +11,24 @@
 
 abstract public class Syntax implements Printable, Named
 {
-  String name;
+  Object name;
 
-  public String getName() { return name; }
+  public final String getName()
+  {
+    return name == null ? null
+      : name instanceof Symbol ? ((Symbol) name).getName()
+      : name.toString();
+  }
+  public Object getSymbol() { return name; }
 
+  public void setName (Object name) { this.name = name; }
   public void setName (String name) { this.name = name; }
 
   public Syntax ()
   {
   }
 
-  public Syntax (String name)
+  public Syntax (Object name)
   {
     setName(name);
   }
Index: kawa/lang/SyntaxRules.java
===================================================================
RCS file: /cvs/kawa/kawa/kawa/lang/SyntaxRules.java,v
retrieving revision 1.28
diff -u -r1.28 SyntaxRules.java
--- kawa/lang/SyntaxRules.java	16 Nov 2002 19:55:48 -0000	1.28
+++ kawa/lang/SyntaxRules.java	12 Dec 2002 05:07:10 -0000
@@ -195,8 +195,6 @@
 	    if (literal_identifiers[i] == pattern)
 	      return new EqualPat (pattern);
 	  }
-	if (pattern instanceof Symbol) // FIXME
-	  pattern = ((Symbol) pattern).getName();
 	if (pattern_names.contains (pattern))
 	  tr.syntaxError ("duplicated pattern variable " + pattern);
 	pattern_names.addElement (pattern);
cvs server: Diffing kawa/standard
Index: kawa/standard/define_syntax.java
===================================================================
RCS file: /cvs/kawa/kawa/kawa/standard/define_syntax.java,v
retrieving revision 1.22
diff -u -r1.22 define_syntax.java
--- kawa/standard/define_syntax.java	20 Oct 2002 20:08:42 -0000	1.22
+++ kawa/standard/define_syntax.java	12 Dec 2002 05:07:10 -0000
@@ -3,7 +3,7 @@
 import gnu.expr.*;
 import gnu.bytecode.ClassType;
 import gnu.bytecode.Method;
-import gnu.mapping.Procedure;
+import gnu.mapping.*;
 import gnu.lists.*;
 
 public class define_syntax extends Syntax
@@ -26,7 +26,7 @@
       {
         return tr.syntaxError(getName()+" not in a statement list");
       }
-    String name = decl.getName();
+    Object name = decl.getSymbol();
     Macro macro = (Macro) decl.getConstantValue();
     if (! (pair.cdr instanceof Pair))
       return tr.syntaxError("Missing transformation for "+form.car);
@@ -71,13 +71,14 @@
                                      ScopeExp defs, Translator tr)
   {
     Pair p;
+    Object name;
     if (! (st.cdr instanceof Pair)
-        || ! ((p = (Pair) st.cdr).car instanceof String))
+        || ! ((name = (p = (Pair) st.cdr).car) instanceof String
+	      || name instanceof Symbol))
       {
         forms.addElement(tr.syntaxError("Missing macro name for "+st.car));
         return false;
       }
-    String name = (String) p.car;
     if (! (p.cdr instanceof Pair) || (p = (Pair) p.cdr).cdr != LList.Empty)
       {
         forms.addElement(tr.syntaxError("invalid syntax for define-syntax"));
Index: kawa/standard/syntax_case.java
===================================================================
RCS file: /cvs/kawa/kawa/kawa/standard/syntax_case.java,v
retrieving revision 1.4
diff -u -r1.4 syntax_case.java
--- kawa/standard/syntax_case.java	9 Mar 2001 06:42:14 -0000	1.4
+++ kawa/standard/syntax_case.java	12 Dec 2002 05:07:10 -0000
@@ -73,7 +73,7 @@
         args[0] = new ReferenceExp(work.matchArray);
         args[1] = new QuoteExp(IntNum.make(i));
         inits[i] = new ApplyExp(work.primArrayGet, args);
-        String name = (String) pattern_names.elementAt(i);
+        Object name = pattern_names.elementAt(i);
         Declaration decl = clauseScope.addDeclaration(name);
         decl.noteValue(inits[i]);
       }
@@ -113,14 +113,14 @@
             form = (Pair) obj;
             obj = form.car;
             int num_literals = LList.length(obj);
-            work.literal_identifiers = new String [num_literals + 1];
+            work.literal_identifiers = new Object [num_literals + 1];
             work.literal_identifiers[0] = null; // FIXME
             for (int i = 0;  i < num_literals;  i++)
               {
                 Pair lit_pair = (Pair) obj;
                 if (! (lit_pair.car instanceof String))
                   return tr.syntaxError ("syntax-case: non-symbol in literals list");
-                work.literal_identifiers[i+1] = (String) lit_pair.car;
+                work.literal_identifiers[i+1] = lit_pair.car;
                 obj = lit_pair.cdr;
               }
             obj = form.cdr;
@@ -167,7 +167,7 @@
 class syntax_case_work
 {
   LetExp let;
-  String[] literal_identifiers;
+  Object[] literal_identifiers;
 
   /** A temporary to hold the value of the input expression. */
   Declaration inputExpression;

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]