01: package kawa.standard;
02:
03: import kawa.lang.*;
04: import gnu.lists.*;
05: import gnu.mapping.*;
06: import gnu.expr.*;
07: import gnu.bytecode.*;
08:
09: public class define_alias extends Syntax {
10: public static final define_alias define_alias = new define_alias();
11: static {
12: define_alias.setName("define-alias");
13: }
14:
15: public boolean scanForDefinitions(Pair st, java.util.Vector forms,
16: ScopeExp defs, Translator tr) {
17: Object formCdr = st.cdr;
18: SyntaxForm formSyntax = null;
19: while (formCdr instanceof SyntaxForm) {
20: formSyntax = (SyntaxForm) formCdr;
21: formCdr = formSyntax.form;
22: }
23: if (formCdr instanceof Pair) {
24: Pair p = (Pair) formCdr;
25: SyntaxForm nameSyntax = formSyntax;
26: Object name = p.car;
27: while (name instanceof SyntaxForm) {
28: nameSyntax = (SyntaxForm) name;
29: name = nameSyntax.form;
30: }
31: formCdr = p.cdr;
32: while (formCdr instanceof SyntaxForm) {
33: formSyntax = (SyntaxForm) formCdr;
34: formCdr = formSyntax.form;
35: }
36: if ((name instanceof String || name instanceof Symbol)
37: && formCdr instanceof Pair
38: && (p = (Pair) formCdr).cdr == LList.Empty) {
39: Declaration decl = tr.define(name, nameSyntax, defs);
40: decl.setIndirectBinding(true);
41: decl.setAlias(true);
42: Expression arg = tr.rewrite_car(p, formSyntax);
43: if (arg instanceof ReferenceExp)
44: ((ReferenceExp) arg).setDontDereference(true);
45: else
46: arg = location.rewrite(arg, tr);
47: tr.mustCompileHere(); // For simplicity.
48: tr.push(decl);
49: SetExp sexp = new SetExp(decl, arg);
50: tr.setLineOf(sexp);
51: decl.noteValue(arg);
52: sexp.setDefining(true);
53: if (!(arg instanceof ReferenceExp))
54: decl
55: .setType(ClassType
56: .make("gnu.mapping.Location"));
57: forms.addElement(sexp);
58: return true;
59: }
60: }
61: tr.error('e', "invalid syntax for define-alias");
62: return false;
63: }
64:
65: public Expression rewrite(Object obj, Translator tr) {
66: return tr
67: .syntaxError("define-alias is only allowed in a <body>");
68: }
69: }
|