Changeset 8104 for trunk/j/src
- Timestamp:
- 11/04/04 17:19:31 (19 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/j/src/org/armedbear/lisp/Lisp.java
r8101 r8104 3 3 * 4 4 * Copyright (C) 2002-2004 Peter Graves 5 * $Id: Lisp.java,v 1.29 3 2004-11-04 11:28:33piso Exp $5 * $Id: Lisp.java,v 1.294 2004-11-04 17:19:31 piso Exp $ 6 6 * 7 7 * This program is free software; you can redistribute it and/or … … 335 335 } 336 336 default: { 337 return funcall(fun, 338 evalList(obj.cdr(), env, thread), 339 thread); 337 return evalCall(fun, obj.cdr(), env, thread); 340 338 } 341 339 } 342 340 } else { 343 LispObject args = obj.cdr();344 if (!args.listp())345 return signal(new TypeError(args, "list"));346 341 if (first.car() == Symbol.LAMBDA) { 347 342 LispObject rest = first.cdr(); 348 343 Closure closure = new Closure(rest.car(), rest.cdr(), env); 349 return closure.execute(evalList( args, env, thread));344 return closure.execute(evalList(obj.cdr(), env, thread)); 350 345 } else 351 346 return signal(new ProgramError("Illegal function object: " + … … 356 351 } 357 352 358 private static final LispObject[] evalList(LispObject exps, 353 private static final LispObject eval1(LispObject obj, 354 Environment env, 355 LispThread thread) 356 throws ConditionThrowable 357 { 358 LispObject result = eval(obj, env, thread); 359 thread._values = null; 360 return result; 361 } 362 363 private static final LispObject evalCall(LispObject function, 364 LispObject args, 365 Environment env, 366 LispThread thread) 367 throws ConditionThrowable 368 { 369 if (args == NIL) 370 return thread.execute(function); 371 LispObject first = args.car(); 372 LispObject rest = args.cdr(); 373 if (rest == NIL) { 374 first = eval1(first, env, thread); 375 return thread.execute(function, first); 376 } 377 LispObject second = rest.car(); 378 rest = rest.cdr(); 379 if (rest == NIL) { 380 first = eval1(first, env, thread); 381 second = eval1(second, env, thread); 382 return thread.execute(function, first, second); 383 } 384 LispObject third = rest.car(); 385 rest = rest.cdr(); 386 if (rest == NIL) { 387 first = eval1(first, env, thread); 388 second = eval1(second, env, thread); 389 third = eval1(third, env, thread); 390 return thread.execute(function, first, second, third); 391 } 392 LispObject fourth = rest.car(); 393 rest = rest.cdr(); 394 if (rest == NIL) { 395 first = eval1(first, env, thread); 396 second = eval1(second, env, thread); 397 third = eval1(third, env, thread); 398 fourth = eval1(fourth, env, thread); 399 return thread.execute(function, first, second, third, fourth); 400 } 401 return funcall(function, 402 evalList(args, env, thread), 403 thread); 404 } 405 406 private static final LispObject[] evalList(LispObject args, 359 407 Environment env, 360 408 LispThread thread) 361 409 throws ConditionThrowable 362 410 { 363 final int length = exps.length();411 final int length = args.length(); 364 412 LispObject[] results = new LispObject[length]; 365 413 for (int i = 0; i < length; i++) { 366 results[i] = eval( exps.car(), env, thread);367 exps = exps.cdr();414 results[i] = eval(args.car(), env, thread); 415 args = args.cdr(); 368 416 } 369 417 // Ignore multiple values!
Note: See TracChangeset
for help on using the changeset viewer.