KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > kawa > standard > Scheme


1 package kawa.standard;
2 import kawa.lang.*;
3 import gnu.bytecode.Type;
4 import gnu.bytecode.ClassType;
5 import gnu.bytecode.ArrayType;
6 import gnu.mapping.*;
7 import gnu.expr.*;
8 import java.util.Hashtable JavaDoc;
9 import gnu.text.SourceMessages;
10 import gnu.kawa.lispexpr.*;
11 import gnu.lists.AbstractFormat;
12 import gnu.kawa.functions.ApplyToArgs;
13 import gnu.kawa.functions.DisplayFormat;
14 import gnu.kawa.functions.NumberCompare;
15 import gnu.kawa.functions.GetNamedPart;
16 import gnu.kawa.reflect.ClassMethods;
17 import gnu.kawa.reflect.StaticFieldLocation;
18 import gnu.math.Unit;
19
20 public class Scheme extends LispLanguage
21 {
22   public static final Environment nullEnvironment;
23   public static final Environment r4Environment;
24   public static final Environment r5Environment;
25   protected static final SimpleEnvironment kawaEnvironment;
26
27   public static LangPrimType booleanType;
28   public static final Scheme instance;
29
30   public static final gnu.kawa.reflect.InstanceOf instanceOf;
31   public static final not not;
32   public static final kawa.standard.map map;
33   public static final kawa.standard.map forEach;
34   public static final gnu.kawa.functions.IsEq isEq;
35   public static final gnu.kawa.functions.IsEqv isEqv;
36   public static final gnu.kawa.functions.IsEqual isEqual;
37   public static final kawa.repl repl;
38
39   public static final NumberCompare numEqu;
40   public static final NumberCompare numGrt;
41   public static final NumberCompare numGEq;
42   public static final NumberCompare numLss;
43   public static final NumberCompare numLEq;
44
45   public static final ApplyToArgs applyToArgs;
46   static final Declaration applyFieldDecl;
47   public static final Declaration getNamedPartDecl;
48
49   static {
50     // (null-environment)
51
nullEnvironment = Environment.make("null-environment");
52     r4Environment = Environment.make("r4rs-environment", nullEnvironment);
53     r5Environment = Environment.make("r5rs-environment", r4Environment);
54     kawaEnvironment = Environment.make("kawa-environment", r5Environment);
55
56     instance = new Scheme(kawaEnvironment);
57     instanceOf = new gnu.kawa.reflect.InstanceOf(instance, "instance?");
58     not = new not(instance, "not");
59     map = new map(true);
60     forEach = new map(false);
61     applyToArgs = new ApplyToArgs("apply-to-args", instance);
62     applyFieldDecl
63       = Declaration.getDeclarationFromStatic("kawa.standard.Scheme",
64                                              "applyToArgs");
65     isEq = new gnu.kawa.functions.IsEq(instance, "eq?");
66     isEqv = new gnu.kawa.functions.IsEqv(instance, "eqv?", isEq);
67     isEqual = new gnu.kawa.functions.IsEqual(instance, "equal?");
68     numEqu = NumberCompare.make(instance, "=",
69                                 NumberCompare.TRUE_IF_EQU);
70     numGrt = NumberCompare.make(instance, ">",
71                                 NumberCompare.TRUE_IF_GRT);
72     numGEq = NumberCompare.make(instance, ">=",
73                                 NumberCompare.TRUE_IF_GRT|NumberCompare.TRUE_IF_EQU);
74     numLss = NumberCompare.make(instance, "<",
75                                 NumberCompare.TRUE_IF_LSS);
76     numLEq = NumberCompare.make(instance, "<=",
77                                 NumberCompare.TRUE_IF_LSS|NumberCompare.TRUE_IF_EQU);
78
79     // Declare the special symbol $lookup$ (from the reader)
80
// and bind it to getNamedPartDecl.
81
String JavaDoc cname = "gnu.kawa.functions.GetNamedPart";
82     String JavaDoc fname = "getNamedPart";
83     getNamedPartDecl = Declaration.getDeclarationFromStatic(cname, fname);
84     Symbol lookup_sym = instance.getSymbol("$lookup$");
85     StaticFieldLocation loc
86       = StaticFieldLocation.define(instance.environ, lookup_sym, null,
87                                    cname, fname);
88     loc.setProcedure();
89     loc.setDeclaration(getNamedPartDecl);
90
91     repl = new kawa.repl(instance);
92     instance.initScheme();
93   }
94
95   public static Scheme getInstance()
96   {
97     return instance;
98   }
99
100   public static Environment builtin ()
101   {
102     return kawaEnvironment;
103   }
104
105   public static final Lambda lambda = new kawa.lang.Lambda();
106   static { lambda.setKeywords(Special.optional, Special.rest, Special.key); }
107
108   private void initScheme ()
109   {
110       environ = nullEnvironment;
111
112       defSntxStFld("lambda", "kawa.standard.Scheme", "lambda");
113
114       //-- Section 4.1 -- complete
115
defSntxStFld(LispLanguage.quote_sym, "kawa.lang.Quote", "plainQuote");
116       defSntxStFld("%define", "kawa.standard.define", "defineRaw");
117       defSntxStFld("define", "kawa.lib.prim_syntax");
118
119       defSntxStFld("if", "kawa.lib.prim_syntax");
120       defSntxStFld ("set!", "kawa.standard.set_b", "set");
121
122       // Section 4.2 -- complete
123
defSntxStFld("cond", "kawa.lib.std_syntax");
124       defSntxStFld("case", "kawa.lib.std_syntax");
125       defSntxStFld("and", "kawa.lib.std_syntax");
126       defSntxStFld("or", "kawa.lib.std_syntax");
127       defSntxStFld("%let", "kawa.standard.let", "let");
128       defSntxStFld("let", "kawa.lib.std_syntax");
129       defSntxStFld("let*", "kawa.lib.std_syntax");
130       defSntxStFld("letrec", "kawa.lib.std_syntax");
131
132       defSntxStFld("begin", "kawa.standard.begin", "begin");
133       defSntxStFld("do", "kawa.lib.std_syntax");
134       defSntxStFld("delay", "kawa.lib.std_syntax");
135       defProcStFld("%make-promise", "kawa.lib.std_syntax");
136       defSntxStFld("quasiquote", "kawa.lang.Quote", "quasiQuote");
137
138       //-- Section 5 -- complete [except for internal definitions]
139

140       // Appendix (and R5RS)
141
defSntxStFld("define-syntax", "kawa.lib.prim_syntax");
142       defSntxStFld("let-syntax", "kawa.standard.let_syntax", "let_syntax");
143       defSntxStFld("letrec-syntax", "kawa.standard.let_syntax",
144                    "letrec_syntax");
145       defSntxStFld("syntax-rules", "kawa.standard.syntax_rules",
146                    "syntax_rules");
147
148       nullEnvironment.setLocked();
149       environ = r4Environment;
150
151       //-- Section 6.1 -- complete
152
defProcStFld("not", "kawa.standard.Scheme");
153       defProcStFld("boolean?", "kawa.lib.misc");
154
155       //-- Section 6.2 -- complete
156
defProcStFld("eq?", "kawa.standard.Scheme", "isEq");
157       defProcStFld("eqv?", "kawa.standard.Scheme", "isEqv");
158       defProcStFld("equal?", "kawa.standard.Scheme", "isEqual");
159
160       //-- Section 6.3 -- complete
161
defProcStFld("pair?", "kawa.lib.lists");
162       defProcStFld("cons", "kawa.lib.lists");
163       defProcStFld("car", "kawa.lib.lists");
164       defProcStFld("cdr", "kawa.lib.lists");
165       defProcStFld("set-car!", "kawa.lib.lists");
166       defProcStFld("set-cdr!", "kawa.lib.lists");
167
168       defProcStFld("caar", "kawa.lib.lists");
169       defProcStFld("cadr", "kawa.lib.lists");
170       defProcStFld("cdar", "kawa.lib.lists");
171       defProcStFld("cddr", "kawa.lib.lists");
172       defProcStFld("caaar", "kawa.lib.lists");
173       defProcStFld("caadr", "kawa.lib.lists");
174       defProcStFld("cadar", "kawa.lib.lists");
175       defProcStFld("caddr", "kawa.lib.lists");
176       defProcStFld("cdaar", "kawa.lib.lists");
177       defProcStFld("cdadr", "kawa.lib.lists");
178       defProcStFld("cddar", "kawa.lib.lists");
179       defProcStFld("cdddr", "kawa.lib.lists");
180       defProcStFld("caaaar", "kawa.lib.lists");
181       defProcStFld("caaadr", "kawa.lib.lists");
182       defProcStFld("caadar", "kawa.lib.lists");
183       defProcStFld("caaddr", "kawa.lib.lists");
184       defProcStFld("cadaar", "kawa.lib.lists");
185       defProcStFld("cadadr", "kawa.lib.lists");
186       defProcStFld("caddar", "kawa.lib.lists");
187       defProcStFld("cadddr", "kawa.lib.lists");
188       defProcStFld("cdaaar", "kawa.lib.lists");
189       defProcStFld("cdaadr", "kawa.lib.lists");
190       defProcStFld("cdadar", "kawa.lib.lists");
191       defProcStFld("cdaddr", "kawa.lib.lists");
192       defProcStFld("cddaar", "kawa.lib.lists");
193       defProcStFld("cddadr", "kawa.lib.lists");
194       defProcStFld("cdddar", "kawa.lib.lists");
195       defProcStFld("cddddr", "kawa.lib.lists");
196       defProcStFld("null?", "kawa.lib.lists");
197       defProcStFld("list?", "kawa.lib.lists");
198       defProcStFld("list", "gnu.kawa.functions.MakeList");
199       defProcStFld("length", "kawa.lib.lists");
200       defProcStFld("append", "kawa.standard.append", "append");
201       defProcStFld("reverse", "kawa.lib.lists");
202       defProcStFld("reverse!", "kawa.lib.lists"); // Not R5RS.
203
defProcStFld("list-tail", "kawa.lib.lists");
204       defProcStFld("list-ref", "kawa.lib.lists");
205
206       defProcStFld("memq", "kawa.lib.lists");
207       defProcStFld("memv", "kawa.lib.lists");
208       defProcStFld("member", "kawa.lib.lists");
209       defProcStFld("assq", "kawa.lib.lists");
210       defProcStFld("assv", "kawa.lib.lists");
211       defProcStFld("assoc", "kawa.lib.lists");
212
213       //-- Section 6.4 -- complete, including slashified read/write
214

215       defProcStFld("symbol?", "kawa.lib.misc");
216       defProcStFld("symbol->string", "kawa.lib.misc");
217       defProcStFld("string->symbol", "kawa.lib.misc");
218
219       //-- Section 6.5
220
defProcStFld("number?", "kawa.lib.numbers");
221       defProcStFld("quantity?", "kawa.lib.numbers");
222       defProcStFld("complex?", "kawa.lib.numbers");
223       defProcStFld("real?", "kawa.lib.numbers");
224       defProcStFld("rational?", "kawa.lib.numbers");
225       defProcStFld("integer?", "kawa.lib.numbers");
226       defProcStFld("exact?", "kawa.lib.numbers");
227       defProcStFld("inexact?", "kawa.lib.numbers");
228       defProcStFld("=", "kawa.standard.Scheme", "numEqu");
229       defProcStFld("<", "kawa.standard.Scheme", "numLss");
230       defProcStFld(">", "kawa.standard.Scheme", "numGrt");
231       defProcStFld("<=", "kawa.standard.Scheme", "numLEq");
232       defProcStFld(">=", "kawa.standard.Scheme", "numGEq");
233       defProcStFld("zero?", "kawa.lib.numbers");
234       defProcStFld("positive?", "kawa.lib.numbers");
235       defProcStFld("negative?", "kawa.lib.numbers");
236       defProcStFld("odd?", "kawa.lib.numbers");
237       defProcStFld("even?", "kawa.lib.numbers");
238       defProcStFld ("max", "kawa.lib.numbers");
239       defProcStFld ("min", "kawa.lib.numbers");
240       defProcStFld("+", "gnu.kawa.functions.AddOp", "$Pl");
241       defProcStFld("-", "gnu.kawa.functions.AddOp", "$Mn");
242       defProcStFld("*", "gnu.kawa.functions.MultiplyOp", "$St");
243       defProcStFld("/", "gnu.kawa.functions.DivideOp", "$Sl");
244       defProcStFld("abs", "kawa.lib.numbers");
245       defProcStFld("quotient", "kawa.lib.numbers");
246       defProcStFld("remainder", "kawa.lib.numbers");
247       defProcStFld("modulo", "kawa.lib.numbers");
248       defProcStFld ("gcd", "kawa.lib.numbers");
249       defProcStFld ("lcm", "kawa.lib.numbers");
250       defProcStFld("numerator", "kawa.lib.numbers");
251       defProcStFld("denominator", "kawa.lib.numbers");
252       defProcStFld("floor", "kawa.lib.numbers");
253       defProcStFld("ceiling", "kawa.lib.numbers");
254       defProcStFld("truncate", "kawa.lib.numbers");
255       defProcStFld("round", "kawa.lib.numbers");
256       defProcStFld("rationalize", "kawa.lib.numbers");
257       defProcStFld("exp", "kawa.lib.numbers");
258       defProcStFld("log", "kawa.lib.numbers");
259       defProcStFld("sin", "kawa.lib.numbers");
260       defProcStFld("cos", "kawa.lib.numbers");
261       defProcStFld("tan", "kawa.lib.numbers");
262       defProcStFld("asin", "kawa.lib.numbers");
263       defProcStFld("acos", "kawa.lib.numbers");
264       defProcStFld("atan", "kawa.lib.numbers");
265       defProcStFld("sqrt", "kawa.lib.numbers");
266       defProcStFld("expt", "kawa.standard.expt");
267       defProcStFld("make-rectangular", "kawa.lib.numbers");
268       defProcStFld("make-polar", "kawa.lib.numbers");
269       defProcStFld("real-part", "kawa.lib.numbers");
270       defProcStFld("imag-part", "kawa.lib.numbers");
271       defProcStFld("magnitude", "kawa.lib.numbers");
272       defProcStFld("angle", "kawa.lib.numbers");
273       defProcStFld("exact->inexact", "kawa.lib.numbers");
274       defProcStFld("inexact->exact", "kawa.lib.numbers");
275       defProcStFld("number->string", "kawa.lib.numbers");
276       defProcStFld("string->number", "kawa.lib.numbers");
277
278       //-- Section 6.6 -- complete
279
defProcStFld("char?", "kawa.lib.characters");
280       defProcStFld("char=?", "kawa.lib.characters");
281       defProcStFld("char<?", "kawa.lib.characters");
282       defProcStFld("char>?", "kawa.lib.characters");
283       defProcStFld("char<=?", "kawa.lib.characters");
284       defProcStFld("char>=?", "kawa.lib.characters");
285       defProcStFld("char-ci=?", "kawa.lib.characters");
286       defProcStFld("char-ci<?", "kawa.lib.characters");
287       defProcStFld("char-ci>?", "kawa.lib.characters");
288       defProcStFld("char-ci<=?", "kawa.lib.characters");
289       defProcStFld("char-ci>=?", "kawa.lib.characters");
290       defProcStFld("char-alphabetic?", "kawa.lib.characters");
291       defProcStFld("char-numeric?", "kawa.lib.characters");
292       defProcStFld("char-whitespace?", "kawa.lib.characters");
293       defProcStFld("char-upper-case?", "kawa.lib.characters");
294       defProcStFld("char-lower-case?", "kawa.lib.characters");
295       defProcStFld("char->integer", "kawa.lib.characters");
296       defProcStFld("integer->char", "kawa.lib.characters");
297       defProcStFld("char-upcase", "kawa.lib.characters");
298       defProcStFld("char-downcase", "kawa.lib.characters");
299       
300       //-- Section 6.7 -- complete
301
defProcStFld("string?", "kawa.lib.strings");
302       defProcStFld("make-string", "kawa.lib.strings");
303       defProcStFld("string", "kawa.lib.strings");
304       defProcStFld("string-length", "kawa.lib.strings");
305       defProcStFld("string-ref", "kawa.lib.strings");
306       defProcStFld("string-set!", "kawa.lib.strings");
307
308       defProcStFld("string=?", "kawa.lib.strings");
309       defProcStFld("string-ci=?", "kawa.lib.strings");
310       defProcStFld("string<?", "kawa.lib.strings");
311       defProcStFld("string>?", "kawa.lib.strings");
312       defProcStFld("string<=?", "kawa.lib.strings");
313       defProcStFld("string>=?", "kawa.lib.strings");
314
315       defProcStFld("string-ci<?", "kawa.lib.strings");
316       defProcStFld("string-ci>?", "kawa.lib.strings");
317       defProcStFld("string-ci<=?", "kawa.lib.strings");
318       defProcStFld("string-ci>=?", "kawa.lib.strings");
319
320       defProcStFld("substring", "kawa.lib.strings");
321       defProcStFld("string-append", "kawa.lib.strings");
322       defProcStFld("string-append/shared", "kawa.lib.strings");
323       defProcStFld("string->list", "kawa.lib.strings");
324       defProcStFld("list->string", "kawa.lib.strings");
325       defProcStFld("string-copy", "kawa.lib.strings");
326       defProcStFld("string-fill!", "kawa.lib.strings");
327
328       //-- Section 6.8 -- complete
329
defProcStFld("vector?", "kawa.lib.vectors");
330       defProcStFld("make-vector", "kawa.lib.vectors");
331       defProcStFld("vector", "kawa.lib.vectors");
332       defProcStFld("vector-length", "kawa.lib.vectors");
333       defProcStFld("vector-ref", "kawa.lib.vectors");
334       defProcStFld("vector-set!", "kawa.lib.vectors");
335       defProcStFld("list->vector", "kawa.lib.vectors");
336       defProcStFld("vector->list", "kawa.lib.vectors");
337       defProcStFld("vector-fill!", "kawa.lib.vectors");
338       // Extension:
339
defProcStFld("vector-append", "kawa.standard.vector_append", "vectorAppend");
340       defProcStFld("values-append", "gnu.kawa.functions.AppendValues",
341            "appendValues");
342
343       //-- Section 6.9 -- complete [except restricted call/cc]
344
defProcStFld("procedure?", "kawa.lib.misc");
345       defProcStFld("apply", "gnu.kawa.functions.Apply", "apply");
346       defProcStFld("map", "kawa.standard.Scheme", "map");
347       defProcStFld("for-each", "kawa.standard.Scheme", "forEach");
348       defProcStFld("call-with-current-continuation",
349                    "kawa.standard.callcc", "callcc");
350       defProcStFld("call/cc", "kawa.standard.callcc", "callcc");
351       defProcStFld("force", "kawa.lib.misc");
352
353       //-- Section 6.10 -- complete
354
defProcStFld("call-with-input-file", "kawa.lib.ports");
355       defProcStFld("call-with-output-file", "kawa.lib.ports");
356       defProcStFld("input-port?", "kawa.lib.ports");
357       defProcStFld("output-port?", "kawa.lib.ports");
358       defProcStFld("current-input-port", "kawa.lib.ports");
359       defProcStFld("current-output-port", "kawa.lib.ports");
360       defProcStFld("with-input-from-file", "kawa.lib.ports");
361       defProcStFld("with-output-to-file", "kawa.lib.ports");
362       defProcStFld("open-input-file", "kawa.lib.ports");
363       defProcStFld("open-output-file", "kawa.lib.ports");
364       defProcStFld("close-input-port", "kawa.lib.ports");
365       defProcStFld("close-output-port", "kawa.lib.ports");
366       defProcStFld("read", "kawa.lib.ports");
367       defProcStFld("read-line", "kawa.lib.ports");
368       defProcStFld("read-char", "kawa.standard.readchar", "readChar");
369       defProcStFld("peek-char", "kawa.standard.readchar", "peekChar");
370       defProcStFld("eof-object?", "kawa.lib.ports");
371       defProcStFld("char-ready?", "kawa.lib.ports");
372       defProcStFld("write", "kawa.lib.ports");
373       defProcStFld("display", "kawa.lib.ports");
374       defProcStFld("print-as-xml", "gnu.xquery.lang.XQuery", "writeFormat");
375       defProcStFld("write-char", "kawa.lib.ports");
376       defProcStFld("newline", "kawa.lib.ports");
377       defProcStFld("load", "kawa.standard.load", "load");
378       defProcStFld("load-relative", "kawa.standard.load", "loadRelative");
379       defProcStFld("transcript-off", "kawa.lib.ports");
380       defProcStFld("transcript-on", "kawa.lib.ports");
381       defProcStFld("call-with-input-string", "kawa.lib.ports"); // Extension
382
defProcStFld("open-input-string", "kawa.lib.ports"); // SRFI-6
383
defProcStFld("open-output-string", "kawa.lib.ports"); // SRFI-6
384
defProcStFld("get-output-string", "kawa.lib.ports"); // SRFI-6
385
defProcStFld("call-with-output-string", "kawa.lib.ports"); // Extension
386
defProcStFld("force-output", "kawa.lib.ports"); // Extension
387

388       defProcStFld("port-line", "kawa.lib.ports");
389       defProcStFld("set-port-line!", "kawa.lib.ports");
390       defProcStFld("port-column", "kawa.lib.ports");
391       defProcStFld("current-error-port", "kawa.lib.ports");
392       defProcStFld("input-port-line-number", "kawa.lib.ports"); // Extension
393
defProcStFld("set-input-port-line-number!", "kawa.lib.ports");
394       defProcStFld("input-port-column-number", "kawa.lib.ports");
395       defProcStFld("input-port-read-state", "kawa.lib.ports");
396       defProcStFld("default-prompter", "kawa.lib.ports");
397       defProcStFld("input-port-prompter", "kawa.lib.ports");
398       defProcStFld("set-input-port-prompter!", "kawa.lib.ports");
399       defProcStFld("base-uri", "kawa.lib.misc");
400
401       defProcStFld("%syntax-error", "kawa.standard.syntax_error",
402                    "syntax_error");
403       defProcStFld("syntax-error", "kawa.lib.prim_syntax");
404
405       r4Environment.setLocked();
406       environ = r5Environment;
407
408       defProcStFld("values", "kawa.lib.misc");
409       defProcStFld("call-with-values", "kawa.standard.call_with_values",
410            "callWithValues");
411       defSntxStFld("let-values", "kawa.lib.syntax");
412       defSntxStFld("let*-values", "kawa.lib.syntax");
413       defSntxStFld("case-lambda", "kawa.lib.syntax");
414       defSntxStFld("receive", "kawa.lib.syntax");
415       defProcStFld("eval", "kawa.lang.Eval");
416       defProcStFld("repl", "kawa.standard.Scheme", "repl");
417       defProcStFld("scheme-report-environment", "kawa.lib.misc");
418       defProcStFld("null-environment", "kawa.lib.misc");
419       defProcStFld("interaction-environment", "kawa.lib.misc");
420       defProcStFld("dynamic-wind", "kawa.lib.misc");
421
422       r5Environment.setLocked();
423       environ = kawaEnvironment;
424  
425       defSntxStFld("define-private", "kawa.lib.prim_syntax");
426       defSntxStFld("define-constant", "kawa.lib.prim_syntax");
427
428       defSntxStFld("define-autoload",
429                    "kawa.standard.define_autoload", "define_autoload");
430       defSntxStFld("define-autoloads-from-file",
431                    "kawa.standard.define_autoload",
432                    "define_autoloads_from_file");
433
434       defProcStFld("exit", "kawa.lib.thread");
435
436       defProcStFld("arithmetic-shift", "kawa.lib.numbers");
437       defProcStFld("ash", "kawa.lib.numbers", "arithmetic$Mnshift");
438       defProcStFld("logand", "kawa.lib.numbers");
439       defProcStFld("logior", "kawa.lib.numbers");
440       defProcStFld("logxor", "kawa.lib.numbers");
441       defProcStFld("lognot", "kawa.lib.numbers");
442       defProcStFld("logop", "kawa.lib.numbers");
443       defProcStFld("logbit?", "kawa.lib.numbers");
444       defProcStFld("logtest", "kawa.lib.numbers");
445       defProcStFld("logcount", "kawa.lib.numbers");
446       defProcStFld("bit-extract", "kawa.lib.numbers");
447       defProcStFld("integer-length", "kawa.lib.numbers");
448
449       // These are from SLIB.
450
defProcStFld("string-upcase!", "kawa.lib.strings");
451       defProcStFld("string-downcase!", "kawa.lib.strings");
452       defProcStFld("string-capitalize!", "kawa.lib.strings");
453       defProcStFld("string-upcase", "kawa.lib.strings");
454       defProcStFld("string-downcase", "kawa.lib.strings");
455       defProcStFld("string-capitalize", "kawa.lib.strings");
456       defSntxStFld("primitive-virtual-method",
457                    "kawa.standard.prim_method", "virtual_method");
458       defSntxStFld("primitive-static-method",
459                    "kawa.standard.prim_method", "static_method");
460       defSntxStFld("primitive-interface-method",
461                    "kawa.standard.prim_method", "interface_method");
462       defSntxStFld("primitive-constructor", "kawa.lib.reflection");
463       defSntxStFld("primitive-op1",
464                    "kawa.standard.prim_method", "op1");
465       defSntxStFld("primitive-get-field", "kawa.lib.reflection");
466       defSntxStFld("primitive-set-field", "kawa.lib.reflection");
467       defSntxStFld("primitive-get-static", "kawa.lib.reflection");
468       defSntxStFld("primitive-set-static", "kawa.lib.reflection");
469       defSntxStFld("primitive-array-new", "kawa.lib.reflection");
470       defSntxStFld("primitive-array-get", "kawa.lib.reflection");
471       defSntxStFld("primitive-array-set", "kawa.lib.reflection");
472       defSntxStFld("primitive-array-length", "kawa.lib.reflection");
473       defProcStFld("subtype?", "kawa.lib.reflection");
474       defProcStFld("primitive-throw", "kawa.standard.prim_throw", "primitiveThrow");
475       defSntxStFld("try-finally", "kawa.lib.syntax");
476       defSntxStFld("try-catch", "kawa.lib.prim_syntax");
477       defProcStFld("throw", "kawa.standard.throw_name", "throwName");
478       defProcStFld("catch", "kawa.lib.syntax");
479       defProcStFld("error", "kawa.lib.misc");
480       defProcStFld("as", "gnu.kawa.functions.Convert", "as");
481       defProcStFld("instance?", "kawa.standard.Scheme", "instanceOf");
482       defSntxStFld("synchronized", "kawa.lib.syntax");
483       defSntxStFld("object", "kawa.standard.object", "objectSyntax");
484       defSntxStFld("define-class", "kawa.standard.define_class",
485                    "define_class");
486       defSntxStFld("define-simple-class", "kawa.standard.define_class",
487                    "define_simple_class");
488       defSntxStFld("this", "kawa.standard.thisRef", "thisSyntax");
489       defProcStFld("make", "gnu.kawa.reflect.Invoke", "make");
490       defProcStFld("slot-ref", "gnu.kawa.reflect.SlotGet", "slotRef");
491       defProcStFld("slot-set!", "gnu.kawa.reflect.SlotSet", "set$Mnfield$Ex");
492       defProcStFld("field", "gnu.kawa.reflect.SlotGet");
493       defProcStFld("class-methods", "gnu.kawa.reflect.ClassMethods",
494            "classMethods");
495       defProcStFld("static-field", "gnu.kawa.reflect.SlotGet",
496            "staticField");
497       defProcStFld("invoke", "gnu.kawa.reflect.Invoke", "invoke");
498
499       defProcStFld("invoke-static", "gnu.kawa.reflect.Invoke", "invokeStatic");
500       defProcStFld("invoke-special", "gnu.kawa.reflect.Invoke", "invokeSpecial");
501
502       defSntxStFld("define-macro", "kawa.lib.syntax");
503       defSntxStFld("%define-macro", "kawa.standard.define_syntax",
504                    "define_macro");
505       defSntxStFld("syntax-case", "kawa.standard.syntax_case", "syntax_case");
506       defSntxStFld("%define-syntax", "kawa.standard.define_syntax",
507                    "define_syntax");
508       defSntxStFld("syntax", "kawa.standard.syntax", "syntax");
509       defSntxStFld("quasisyntax", "kawa.standard.syntax", "quasiSyntax");
510       defProcStFld("syntax-object->datum", "kawa.lib.std_syntax");
511       defProcStFld("datum->syntax-object", "kawa.lib.std_syntax");
512       defProcStFld("syntax->expression", "kawa.lib.prim_syntax");
513       defProcStFld("syntax-body->expression", "kawa.lib.prim_syntax");
514       defProcStFld("generate-temporaries", "kawa.lib.std_syntax");
515       defSntxStFld("with-syntax", "kawa.lib.std_syntax");
516       defProcStFld("syntax-source", "kawa.lib.syntax");
517       defProcStFld("syntax-line", "kawa.lib.syntax");
518       defProcStFld("syntax-column", "kawa.lib.syntax");
519       defSntxStFld("define-for-syntax", "kawa.lib.prim_syntax");
520       defSntxStFld("include", "kawa.lib.files");
521       defSntxStFld("include-relative", "kawa.lib.files");
522
523       defProcStFld("file-exists?", "kawa.lib.files");
524       defProcStFld("file-directory?", "kawa.lib.files");
525       defProcStFld("file-readable?", "kawa.lib.files");
526       defProcStFld("file-writable?", "kawa.lib.files");
527       defProcStFld("delete-file", "kawa.lib.files");
528       defProcStFld("system-tmpdir", "kawa.lib.files");
529       defProcStFld("make-temporary-file", "kawa.lib.files");
530       defProcStFld("rename-file", "kawa.lib.files");
531       defProcStFld("copy-file", "kawa.lib.files");
532       defProcStFld("create-directory", "kawa.lib.files");
533       defProcStFld("->pathname", "kawa.lib.files");
534       define("port-char-encoding", Boolean.TRUE);
535       define("symbol-read-case", "P");
536
537       defProcStFld("system", "kawa.lib.system");
538       defProcStFld("make-process", "kawa.lib.system");
539       defProcStFld("tokenize-string-to-string-array", "kawa.lib.system");
540       defProcStFld("tokenize-string-using-shell", "kawa.lib.system");
541       defProcStFld("command-parse", "kawa.lib.system");
542       
543       defProcStFld("record-accessor", "kawa.lib.reflection");
544       defProcStFld("record-modifier", "kawa.lib.reflection");
545       defProcStFld("record-predicate", "kawa.lib.reflection");
546       defProcStFld("record-constructor", "kawa.lib.reflection");
547       defProcStFld("make-record-type", "kawa.lib.reflection");
548       defProcStFld("record-type-descriptor", "kawa.lib.reflection");
549       defProcStFld("record-type-name", "kawa.lib.reflection");
550       defProcStFld("record-type-field-names", "kawa.lib.reflection");
551       defProcStFld("record?", "kawa.lib.reflection");
552       defSntxStFld("define-record-type", "gnu.kawa.slib.DefineRecordType");
553
554       defSntxStFld("when", "kawa.lib.syntax"); //-- (when cond exp ...)
555
defSntxStFld("unless", "kawa.lib.syntax"); //-- (unless cond exp ...)
556
defSntxStFld("fluid-let", "kawa.standard.fluid_let", "fluid_let");
557       defSntxStFld("constant-fold", "kawa.standard.constant_fold",
558                    "constant_fold");
559       defProcStFld("make-parameter", "kawa.lib.parameters");
560       defSntxStFld("parameterize", "kawa.lib.parameters");
561
562       defProcStFld("compile-file", "kawa.lib.system");
563       defProcStFld("environment-bound?", "kawa.lib.misc");
564       defProcStFld("scheme-implementation-version", "kawa.lib.misc");
565       defProcStFld("scheme-window", "kawa.lib.windows");
566       defSntxStFld("define-procedure", "kawa.lib.syntax");
567       defProcStFld("add-procedure-properties", "kawa.lib.syntax");
568       defProcStFld("make-procedure",
569                    "gnu.kawa.functions.MakeProcedure", "makeProcedure");
570       defProcStFld("procedure-property", "kawa.lib.misc");
571       defProcStFld("set-procedure-property!", "kawa.lib.misc");
572       defSntxStFld("provide", "kawa.lib.misc");
573       defSntxStFld("test-begin", "kawa.lib.misc");
574       defProcStFld("namespace", "kawa.lib.misc");
575
576       defProcStFld("quantity->number", "kawa.lib.numbers");
577       defProcStFld("quantity->unit", "kawa.lib.numbers");
578       defProcStFld("make-quantity", "kawa.lib.numbers");
579       defSntxStFld("define-namespace", "gnu.kawa.lispexpr.DefineNamespace",
580                    "define_namespace");
581       defSntxStFld("define-xml-namespace", "gnu.kawa.lispexpr.DefineNamespace",
582                    "define_xml_namespace");
583       defSntxStFld("define-private-namespace", "gnu.kawa.lispexpr.DefineNamespace",
584                    "define_private_namespace");
585       defSntxStFld("define-unit", "kawa.standard.define_unit", "define_unit");
586       defSntxStFld("define-base-unit", "kawa.standard.define_unit",
587                    "define_base_unit");
588       defProcStFld("duration", "kawa.lib.numbers");
589
590       defProcStFld("gentemp", "kawa.lib.syntax");
591       defSntxStFld("defmacro", "kawa.lib.syntax");
592       defProcStFld("setter", "gnu.kawa.functions.Setter", "setter");
593       defSntxStFld("resource-uri", "kawa.lib.files");
594
595       defProcStFld("URI", "kawa.lib.files");
596       defProcStFld("resolve-uri", "kawa.lib.files");
597       defSntxStFld("module-uri", "kawa.lib.files");
598
599       defSntxStFld("future", "kawa.lib.thread");
600       defProcStFld("sleep", "kawa.lib.thread");
601       defProcStFld("runnable", "kawa.lib.thread");
602
603       defSntxStFld("trace", "kawa.lib.trace");
604       defSntxStFld("untrace", "kawa.lib.trace");
605
606       defProcStFld("format", "gnu.kawa.functions.Format");
607       defProcStFld("parse-format", "gnu.kawa.functions.ParseFormat", "parseFormat");
608
609       defProcStFld("make-element", "gnu.kawa.xml.MakeElement", "makeElement");
610       defProcStFld("make-attribute", "gnu.kawa.xml.MakeAttribute", "makeAttribute");
611       defProcStFld("map-values", "gnu.kawa.functions.ValuesMap", "valuesMap");
612       defProcStFld("children", "gnu.kawa.xml.Children", "children");
613       defProcStFld("attributes", "gnu.kawa.xml.Attributes");
614       defProcStFld("unescaped-data", "gnu.kawa.xml.MakeUnescapedData",
615            "unescapedData");
616       defProcStFld("keyword?", "kawa.lib.keywords");
617       defProcStFld("keyword->string", "kawa.lib.keywords");
618       defProcStFld("string->keyword", "kawa.lib.keywords");
619       defSntxStFld("location", "kawa.standard.location", "location");
620       defSntxStFld("define-alias", "kawa.standard.define_alias",
621                    "define_alias");
622       defSntxStFld("define-variable", "kawa.standard.define_variable",
623                    "define_variable");
624       defSntxStFld("define-member-alias", "kawa.standard.define_member_alias",
625                    "define_member_alias");
626       defSntxStFld("require", "kawa.standard.require", "require");
627       defSntxStFld("module-name", "kawa.standard.module_name",
628                    "module_name");
629       defSntxStFld("module-extends", "kawa.standard.module_extends",
630                    "module_extends");
631       defSntxStFld("module-implements", "kawa.standard.module_implements",
632                    "module_implements");
633       defSntxStFld("module-static", "kawa.standard.module_static",
634                    "module_static");
635       defSntxStFld("module-export", "kawa.standard.export", "module_export");
636       defSntxStFld("module-compile-options",
637                    "kawa.standard.module_compile_options",
638                    "module_compile_options");
639       defSntxStFld("with-compile-options",
640                    "kawa.standard.with_compile_options",
641                    "with_compile_options");
642
643       defProcStFld("array?", "kawa.lib.arrays");
644       defProcStFld("array-rank", "kawa.lib.arrays");
645       defProcStFld("make-array", "kawa.lib.arrays");
646       defProcStFld("array", "kawa.lib.arrays");
647       defProcStFld("array-start", "kawa.lib.arrays");
648       defProcStFld("array-end", "kawa.lib.arrays");
649       defProcStFld("shape", "kawa.lib.arrays");
650       defProcStFld("array-ref", "gnu.kawa.functions.ArrayRef", "arrayRef");
651       defProcStFld("array-set!", "gnu.kawa.functions.ArraySet", "arraySet");
652       defProcStFld("share-array", "kawa.lib.arrays");
653
654       defProcStFld("s8vector?", "kawa.lib.uniform");
655       defProcStFld("make-s8vector", "kawa.lib.uniform");
656       defProcStFld("s8vector", "kawa.lib.uniform");
657       defProcStFld("s8vector-length", "kawa.lib.uniform");
658       defProcStFld("s8vector-ref", "kawa.lib.uniform");
659       defProcStFld("s8vector-set!", "kawa.lib.uniform");
660       defProcStFld("s8vector->list", "kawa.lib.uniform");
661       defProcStFld("list->s8vector", "kawa.lib.uniform");
662       defProcStFld("u8vector?", "kawa.lib.uniform");
663       defProcStFld("make-u8vector", "kawa.lib.uniform");
664       defProcStFld("u8vector", "kawa.lib.uniform");
665       defProcStFld("u8vector-length", "kawa.lib.uniform");
666       defProcStFld("u8vector-ref", "kawa.lib.uniform");
667       defProcStFld("u8vector-set!", "kawa.lib.uniform");
668       defProcStFld("u8vector->list", "kawa.lib.uniform");
669       defProcStFld("list->u8vector", "kawa.lib.uniform");
670
671       defProcStFld("s16vector?", "kawa.lib.uniform");
672       defProcStFld("make-s16vector", "kawa.lib.uniform");
673       defProcStFld("s16vector", "kawa.lib.uniform");
674       defProcStFld("s16vector-length", "kawa.lib.uniform");
675       defProcStFld("s16vector-ref", "kawa.lib.uniform");
676       defProcStFld("s16vector-set!", "kawa.lib.uniform");
677       defProcStFld("s16vector->list", "kawa.lib.uniform");
678       defProcStFld("list->s16vector", "kawa.lib.uniform");
679       defProcStFld("u16vector?", "kawa.lib.uniform");
680       defProcStFld("make-u16vector", "kawa.lib.uniform");
681       defProcStFld("u16vector", "kawa.lib.uniform");
682       defProcStFld("u16vector-length", "kawa.lib.uniform");
683       defProcStFld("u16vector-ref", "kawa.lib.uniform");
684       defProcStFld("u16vector-set!", "kawa.lib.uniform");
685       defProcStFld("u16vector->list", "kawa.lib.uniform");
686       defProcStFld("list->u16vector", "kawa.lib.uniform");
687
688       defProcStFld("s32vector?", "kawa.lib.uniform");
689       defProcStFld("make-s32vector", "kawa.lib.uniform");
690       defProcStFld("s32vector", "kawa.lib.uniform");
691       defProcStFld("s32vector-length", "kawa.lib.uniform");
692       defProcStFld("s32vector-ref", "kawa.lib.uniform");
693       defProcStFld("s32vector-set!", "kawa.lib.uniform");
694       defProcStFld("s32vector->list", "kawa.lib.uniform");
695       defProcStFld("list->s32vector", "kawa.lib.uniform");
696       defProcStFld("u32vector?", "kawa.lib.uniform");
697       defProcStFld("make-u32vector", "kawa.lib.uniform");
698       defProcStFld("u32vector", "kawa.lib.uniform");
699       defProcStFld("u32vector-length", "kawa.lib.uniform");
700       defProcStFld("u32vector-ref", "kawa.lib.uniform");
701       defProcStFld("u32vector-set!", "kawa.lib.uniform");
702       defProcStFld("u32vector->list", "kawa.lib.uniform");
703       defProcStFld("list->u32vector", "kawa.lib.uniform");
704
705       defProcStFld("s64vector?", "kawa.lib.uniform");
706       defProcStFld("make-s64vector", "kawa.lib.uniform");
707       defProcStFld("s64vector", "kawa.lib.uniform");
708       defProcStFld("s64vector-length", "kawa.lib.uniform");
709       defProcStFld("s64vector-ref", "kawa.lib.uniform");
710       defProcStFld("s64vector-set!", "kawa.lib.uniform");
711       defProcStFld("s64vector->list", "kawa.lib.uniform");
712       defProcStFld("list->s64vector", "kawa.lib.uniform");
713       defProcStFld("u64vector?", "kawa.lib.uniform");
714       defProcStFld("make-u64vector", "kawa.lib.uniform");
715       defProcStFld("u64vector", "kawa.lib.uniform");
716       defProcStFld("u64vector-length", "kawa.lib.uniform");
717       defProcStFld("u64vector-ref", "kawa.lib.uniform");
718       defProcStFld("u64vector-set!", "kawa.lib.uniform");
719       defProcStFld("u64vector->list", "kawa.lib.uniform");
720       defProcStFld("list->u64vector", "kawa.lib.uniform");
721
722       defProcStFld("f32vector?", "kawa.lib.uniform");
723       defProcStFld("make-f32vector", "kawa.lib.uniform");
724       defProcStFld("f32vector", "kawa.lib.uniform");
725       defProcStFld("f32vector-length", "kawa.lib.uniform");
726       defProcStFld("f32vector-ref", "kawa.lib.uniform");
727       defProcStFld("f32vector-set!", "kawa.lib.uniform");
728       defProcStFld("f32vector->list", "kawa.lib.uniform");
729       defProcStFld("list->f32vector", "kawa.lib.uniform");
730       defProcStFld("f64vector?", "kawa.lib.uniform");
731       defProcStFld("make-f64vector", "kawa.lib.uniform");
732       defProcStFld("f64vector", "kawa.lib.uniform");
733       defProcStFld("f64vector-length", "kawa.lib.uniform");
734       defProcStFld("f64vector-ref", "kawa.lib.uniform");
735       defProcStFld("f64vector-set!", "kawa.lib.uniform");
736       defProcStFld("f64vector->list", "kawa.lib.uniform");
737       defProcStFld("list->f64vector", "kawa.lib.uniform");
738
739       defSntxStFld("cut", "gnu.kawa.slib.cut");
740       defSntxStFld("cute", "gnu.kawa.slib.cut");
741
742       defSntxStFld("cond-expand", "kawa.lib.syntax");
743       defSntxStFld("%cond-expand", "kawa.lib.syntax");
744
745       defAliasStFld("*print-base*", "gnu.kawa.functions.DisplayFormat",
746                     "outBase");
747       defAliasStFld("*print-radix*", "gnu.kawa.functions.DisplayFormat",
748                     "outRadix");
749       defAliasStFld("*print-right-margin*",
750                     "gnu.text.PrettyWriter", "lineLengthLoc");
751       defAliasStFld("*print-miser-width*",
752                     "gnu.text.PrettyWriter", "miserWidthLoc");
753       defAliasStFld("html", "gnu.kawa.xml.XmlNamespace", "HTML");
754
755       kawaEnvironment.setLocked();
756   }
757
758   public Scheme ()
759   {
760     environ = kawaEnvironment;
761     userEnv = getNewEnvironment();
762   }
763
764   protected Scheme (Environment env)
765   {
766     environ = env;
767   }
768
769   public String JavaDoc getName()
770   {
771     return "Scheme";
772   }
773
774   public NamedLocation lookupBuiltin (Symbol name, Object JavaDoc property, int hash)
775   {
776     NamedLocation loc = super.lookupBuiltin(name, property, hash);
777     if (loc == null && property == null)
778       {
779         // Special handling for names of the form "<TYPE>". I.e. if an
780
// identifier of the form is unbound, then get a matching Type.
781
// Also, handles U$unit by doing Unit.lookup("U"). (The Scheme reader
782
// translates a quantity like 2in to (* 2 in$unit). The advantage is
783
// is that we can have clean scoping rules for unit names; the downside
784
// is that 2in is no longer a literal.)
785
String JavaDoc nam = name.getName();
786     Object JavaDoc val = null;
787     String JavaDoc uri = name.getNamespaceURI();
788         int len = nam.length();
789     if (nam.endsWith("$unit"))
790       val = Unit.lookup(nam.substring(0, nam.length()-5));
791     else if (len > 2 && nam.charAt(0) == '<' && nam.charAt(len-1) == '>')
792           {
793             String JavaDoc tname = nam.substring(1, len-1);
794             val = Scheme.string2Type(tname);
795           }
796     if (val != null)
797           {
798             loc = new PlainLocation(name, null);
799             loc.set(val);
800           }
801       }
802     return loc;
803   }
804
805   /** Evalutate Scheme expressions from string.
806    * @param string the string constaining Scheme expressions
807    * @param env the Environment to evaluate the string in
808    * @return result of last expression, or Language.voidObject if none. */

809   public static Object JavaDoc eval (String JavaDoc string, Environment env)
810   {
811     return eval (new CharArrayInPort(string), env);
812   }
813
814   /** Evalutate Scheme expressions from stream.
815    * @param port the port to read Scheme expressions from
816    * @param env the Environment to evaluate the string in
817    * @return result of last expression, or Language.voidObject if none. */

818   public static Object JavaDoc eval (InPort port, Environment env)
819   {
820     SourceMessages messages = new SourceMessages();
821     try
822       {
823     LispReader lexer = (LispReader)
824       Language.getDefaultLanguage().getLexer(port, messages);
825     Object JavaDoc body = ReaderParens.readList(lexer, 0, 1, -1);
826         if (messages.seenErrors())
827           throw new gnu.text.SyntaxException(messages);
828     return Eval.evalBody(body, env, messages);
829       }
830     catch (gnu.text.SyntaxException e)
831       {
832     // The '\n' is because a SyntaxException includes a line number,
833
// and it is better if that starts the line. FIXME OBSOLETE
834
throw new RuntimeException JavaDoc("eval: errors while compiling:\n"
835                    +e.getMessages().toString(20));
836       }
837     catch (java.io.IOException JavaDoc e)
838       {
839     throw new RuntimeException JavaDoc("eval: I/O exception: "
840                    + e.toString ());
841       }
842     catch (RuntimeException JavaDoc ex)
843       {
844     throw ex;
845       }
846     catch (Error JavaDoc ex)
847       {
848     throw ex;
849       }
850     catch (Throwable JavaDoc ex)
851       {
852     throw new WrappedException(ex);
853       }
854   }
855
856   /** Evalutate Scheme expressions from an "S expression."
857    * @param sexpr the S expression to evaluate
858    * @param env the Environment to evaluate the string in
859    * @return result of the expression. */

860   public static Object JavaDoc eval (Object JavaDoc sexpr, Environment env)
861   {
862     try
863       {
864     return Eval.eval (sexpr, env);
865       }
866     catch (RuntimeException JavaDoc ex)
867       {
868     throw ex;
869       }
870     catch (Error JavaDoc ex)
871       {
872     throw ex;
873       }
874     catch (Throwable JavaDoc ex)
875       {
876     throw new WrappedException(ex);
877       }
878   }
879
880   public static final AbstractFormat writeFormat = new DisplayFormat(true, 'S');
881   public static final AbstractFormat displayFormat = new DisplayFormat(false, 'S');
882   public AbstractFormat getFormat(boolean readable)
883   {
884     return readable ? writeFormat : displayFormat;
885   }
886
887   public int getNamespaceOf (Declaration decl)
888   {
889     return FUNCTION_NAMESPACE+VALUE_NAMESPACE;
890   }
891
892   /** If exp is a "constant" Type, return that type, otherwise return null. */
893   public static Type getTypeValue (Expression exp)
894   {
895     return getInstance().getTypeFor(exp);
896   }
897
898   static Hashtable JavaDoc types;
899
900   public static Type getNamedType (String JavaDoc name)
901   {
902     if (types == null)
903       {
904     booleanType
905       = new LangPrimType(Type.boolean_type, Scheme.getInstance());
906     types = new Hashtable JavaDoc ();
907     types.put ("void", LangPrimType.voidType);
908     types.put ("int", LangPrimType.intType);
909     types.put ("char", LangPrimType.charType);
910     types.put ("boolean", booleanType);
911     types.put ("byte", LangPrimType.byteType);
912     types.put ("short", LangPrimType.shortType);
913     types.put ("long", LangPrimType.longType);
914     types.put ("float", LangPrimType.floatType);
915     types.put ("double", LangPrimType.doubleType);
916     types.put ("never-returns", Type.neverReturnsType);
917
918     types.put ("Object", Type.pointer_type);
919     types.put ("java.lang.Object", Type.pointer_type);
920     types.put ("String", Type.tostring_type);
921
922     types.put ("object", Type.pointer_type);
923     types.put ("number", ClassType.make("gnu.math.Numeric"));
924     types.put ("quantity", ClassType.make("gnu.math.Quantity"));
925     types.put ("complex", ClassType.make("gnu.math.Complex"));
926     types.put ("real", ClassType.make("gnu.math.RealNum"));
927     types.put ("rational", ClassType.make("gnu.math.RatNum"));
928     types.put ("integer", ClassType.make("gnu.math.IntNum"));
929     types.put ("symbol", ClassType.make("java.lang.String"));
930     types.put ("keyword", ClassType.make("gnu.expr.Keyword"));
931     types.put ("list", ClassType.make("gnu.lists.LList"));
932     types.put ("pair", ClassType.make("gnu.lists.Pair"));
933     types.put ("pair-with-position",
934            ClassType.make("gnu.lists.PairWithPosition"));
935     types.put ("string", ClassType.make("gnu.lists.FString"));
936     types.put ("abstract-string", ClassType.make("gnu.lists.CharSeq"));
937     types.put ("character", ClassType.make("gnu.text.Char"));
938     types.put ("vector", ClassType.make("gnu.lists.FVector"));
939     types.put ("function", ClassType.make("gnu.mapping.Procedure"));
940     types.put ("procedure", ClassType.make("gnu.mapping.Procedure"));
941     types.put ("input-port", ClassType.make("gnu.mapping.InPort"));
942     types.put ("output-port", ClassType.make("gnu.mapping.OutPort"));
943     types.put ("string-output-port",
944                    ClassType.make("gnu.mapping.CharArrayOutPort"));
945     types.put ("record", ClassType.make("kawa.lang.Record"));
946     types.put ("type", ClassType.make("gnu.bytecode.Type"));
947     types.put ("class-type", ClassType.make("gnu.bytecode.ClassType"));
948
949         types.put ("s8vector", ClassType.make("gnu.lists.S8Vector"));
950         types.put ("u8vector", ClassType.make("gnu.lists.U8Vector"));
951         types.put ("s16vector", ClassType.make("gnu.lists.S16Vector"));
952         types.put ("u16vector", ClassType.make("gnu.lists.U16Vector"));
953         types.put ("s32vector", ClassType.make("gnu.lists.S32Vector"));
954         types.put ("u32vector", ClassType.make("gnu.lists.U32Vector"));
955         types.put ("s64vector", ClassType.make("gnu.lists.S64Vector"));
956         types.put ("u64vector", ClassType.make("gnu.lists.U64Vector"));
957         types.put ("f32vector", ClassType.make("gnu.lists.F32Vector"));
958         types.put ("f64vector", ClassType.make("gnu.lists.F64Vector"));
959         types.put ("document", ClassType.make("gnu.lists.TreeList"));
960         types.put ("readtable", ClassType.make("gnu.kawa.lispexpr.ReadTable"));
961         /* #ifdef use:java.net.URI */
962         types.put ("URI", ClassType.make("java.net.URI"));
963         /* #else */
964         // types.put ("URI", ClassType.make("java.lang.String"));
965
/* #endif */
966       }
967     Type type = (Type) types.get(name);
968     if (type == null
969     && (name.startsWith("elisp:") || name.startsWith("clisp:")))
970       {
971     int colon = name.indexOf(':');
972     Class JavaDoc clas = getNamedType(name.substring(colon+1)).getReflectClass();
973     String JavaDoc lang = name.substring(0,colon);
974     Language interp = Language.getInstance(lang);
975     if (interp == null)
976         throw new RuntimeException JavaDoc("unknown type '" + name
977                        + "' - unknown language '"
978                        + lang + '\'');
979     type = interp.getTypeFor(clas);
980     if (type != null)
981       types.put(name, type);
982       }
983     return type;
984   }
985
986   public Type getTypeFor (Class JavaDoc clas)
987   {
988     String JavaDoc name = clas.getName();
989     if (clas.isPrimitive())
990       return getNamedType(name);
991     if ("java.lang.String".equals(name))
992       return Type.tostring_type;
993     return Type.make(clas);
994   }
995
996   public static Type string2Type (String JavaDoc name)
997   {
998     Type t;
999     if (name.endsWith("[]"))
1000      {
1001    t = string2Type(name.substring(0, name.length()-2));
1002    if (t != null)
1003      t = ArrayType.make(t);
1004      }
1005    else
1006      t = getNamedType (name);
1007    if (t != null)
1008      return t;
1009    t = Language.string2Type(name);
1010    if (t != null)
1011      types.put (name, t);
1012    return t;
1013  }
1014
1015  public Type getTypeFor(String JavaDoc name)
1016  {
1017    return string2Type(name);
1018  }
1019
1020  /** Convert expression to a Type.
1021   * Allow "TYPE" or 'TYPE or <TYPE>.
1022   */

1023  public static Type exp2Type (Expression exp)
1024  {
1025    return getInstance().getTypeFor(exp);
1026  }
1027
1028  public Expression makeApply (Expression func, Expression[] args)
1029  {
1030    if (func instanceof ReferenceExp
1031        && (((ReferenceExp) func).getBinding()==getNamedPartDecl))
1032      {
1033        // FIXME don't copy the args array in makeExp ...
1034
return GetNamedPart.makeExp(args[0], args[1]);
1035      }
1036    Expression[] exps = new Expression[args.length+1];
1037    exps[0] = func;
1038    System.arraycopy(args, 0, exps, 1, args.length);
1039    return new ApplyExp(new ReferenceExp(applyFieldDecl), exps);
1040  }
1041
1042  public ReadTable createReadTable ()
1043  {
1044    ReadTable tab = ReadTable.createInitial();
1045    tab.postfixLookupOperator = ':';
1046    ReaderDispatch dispatchTable = (ReaderDispatch) tab.lookup('#');
1047    dispatchTable.set('\'', new ReaderQuote("syntax"));
1048    dispatchTable.set('`', new ReaderQuote("quasisyntax"));
1049    dispatchTable.set(',', ReaderDispatchMisc.getInstance());
1050    tab.putReaderCtorFld("URI", "kawa.lib.files", "URI");
1051    tab.putReaderCtorFld("namespace", "kawa.lib.misc", "namespace");
1052    tab.putReaderCtorFld("duration", "kawa.lib.numbers", "duration");
1053    return tab;
1054  }
1055
1056  /** The compiler insert calls to this method for applications and applets. */
1057  public static void registerEnvironment()
1058  {
1059    Language.setDefaults(getInstance());
1060  }
1061}
1062
Popular Tags