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 ; 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 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 String cname = "gnu.kawa.functions.GetNamedPart"; 82 String 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 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 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 140 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 defProcStFld("not", "kawa.standard.Scheme"); 153 defProcStFld("boolean?", "kawa.lib.misc"); 154 155 defProcStFld("eq?", "kawa.standard.Scheme", "isEq"); 157 defProcStFld("eqv?", "kawa.standard.Scheme", "isEqv"); 158 defProcStFld("equal?", "kawa.standard.Scheme", "isEqual"); 159 160 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"); 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 215 defProcStFld("symbol?", "kawa.lib.misc"); 216 defProcStFld("symbol->string", "kawa.lib.misc"); 217 defProcStFld("string->symbol", "kawa.lib.misc"); 218 219 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 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 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 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 defProcStFld("vector-append", "kawa.standard.vector_append", "vectorAppend"); 340 defProcStFld("values-append", "gnu.kawa.functions.AppendValues", 341 "appendValues"); 342 343 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 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"); defProcStFld("open-input-string", "kawa.lib.ports"); defProcStFld("open-output-string", "kawa.lib.ports"); defProcStFld("get-output-string", "kawa.lib.ports"); defProcStFld("call-with-output-string", "kawa.lib.ports"); defProcStFld("force-output", "kawa.lib.ports"); 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"); 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 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"); defSntxStFld("unless", "kawa.lib.syntax"); 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 getName() 770 { 771 return "Scheme"; 772 } 773 774 public NamedLocation lookupBuiltin (Symbol name, Object property, int hash) 775 { 776 NamedLocation loc = super.lookupBuiltin(name, property, hash); 777 if (loc == null && property == null) 778 { 779 String nam = name.getName(); 786 Object val = null; 787 String 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 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 809 public static Object eval (String string, Environment env) 810 { 811 return eval (new CharArrayInPort(string), env); 812 } 813 814 818 public static Object 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 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 throw new RuntimeException ("eval: errors while compiling:\n" 835 +e.getMessages().toString(20)); 836 } 837 catch (java.io.IOException e) 838 { 839 throw new RuntimeException ("eval: I/O exception: " 840 + e.toString ()); 841 } 842 catch (RuntimeException ex) 843 { 844 throw ex; 845 } 846 catch (Error ex) 847 { 848 throw ex; 849 } 850 catch (Throwable ex) 851 { 852 throw new WrappedException(ex); 853 } 854 } 855 856 860 public static Object eval (Object sexpr, Environment env) 861 { 862 try 863 { 864 return Eval.eval (sexpr, env); 865 } 866 catch (RuntimeException ex) 867 { 868 throw ex; 869 } 870 catch (Error ex) 871 { 872 throw ex; 873 } 874 catch (Throwable 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 893 public static Type getTypeValue (Expression exp) 894 { 895 return getInstance().getTypeFor(exp); 896 } 897 898 static Hashtable types; 899 900 public static Type getNamedType (String name) 901 { 902 if (types == null) 903 { 904 booleanType 905 = new LangPrimType(Type.boolean_type, Scheme.getInstance()); 906 types = new Hashtable (); 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 962 types.put ("URI", ClassType.make("java.net.URI")); 963 964 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 clas = getNamedType(name.substring(colon+1)).getReflectClass(); 973 String lang = name.substring(0,colon); 974 Language interp = Language.getInstance(lang); 975 if (interp == null) 976 throw new RuntimeException ("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 clas) 987 { 988 String 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 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 name) 1016 { 1017 return string2Type(name); 1018 } 1019 1020 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 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 1057 public static void registerEnvironment() 1058 { 1059 Language.setDefaults(getInstance()); 1060 } 1061} 1062 | Popular Tags |