This is the mail archive of the
kawa@sources.redhat.com
mailing list for the Kawa project.
Re: Problem with CL defmacro
- From: Per Bothner <per at bothner dot com>
- To: Are Meisfjord <are at meisfjord dot com>
- Cc: kawa at sources dot redhat dot com
- Date: Wed, 11 Dec 2002 21:04:47 -0800
- Subject: Re: Problem with CL defmacro
- References: <214440-22002122108405593@meisfjord.com>
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;