private static int checkSingleArgument( String subroutineName, Class expectedType, ArgumentsList arguments, List<LispObject> args, int argsCounter, int i) { try { if (!(expectedType.isInstance(args.get(argsCounter)))) { if (expectedType.equals(LispList.class) && args.get(argsCounter).equals(LispSymbol.ourNil)) { arguments.setValue(i, LispList.list()); return argsCounter + 1; } if (expectedType.equals(LispSymbol.class) && args.get(argsCounter).equals(LispSymbol.ourNil)) { arguments.setValue(i, LispSymbol.ourNil); return argsCounter + 1; } if (arguments.isOptional(i)) return -1; throw new WrongTypeArgumentException(expectedType.getSimpleName(), args.get(argsCounter)); } arguments.setValue(i, args.get(argsCounter)); return argsCounter + 1; } catch (IndexOutOfBoundsException e) { if (arguments.isOptional(i)) return -1; throw new WrongNumberOfArgumentsException(subroutineName, i); } }
private static int checkArray( Class expectedType, ArgumentsList arguments, List<LispObject> args, int argsCounter, int i) { Class componentType = expectedType.getComponentType(); ArrayList<LispObject> array = new ArrayList<>(); while (argsCounter != args.size()) { if (!componentType.isInstance(args.get(argsCounter))) throw new WrongTypeArgumentException(componentType.toString(), args.get(argsCounter)); array.add(args.get(argsCounter)); ++argsCounter; } arguments.setValue(i, customizeArrayList(componentType, array)); return argsCounter; }