public LispObject execute(LispObject[] args) throws ConditionThrowable { if (args.length != 10) return error(new WrongNumberOfArgumentsException(this)); final String packageName = args[0].getStringValue(); LispObject nicknames = checkList(args[1]); // FIXME size is ignored // LispObject size = args[2]; LispObject shadows = checkList(args[3]); LispObject shadowingImports = checkList(args[4]); LispObject use = checkList(args[5]); LispObject imports = checkList(args[6]); LispObject interns = checkList(args[7]); LispObject exports = checkList(args[8]); // FIXME docString is ignored // LispObject docString = args[9]; Package pkg = Packages.findPackage(packageName); if (pkg != null) return pkg; if (nicknames != NIL) { LispObject list = nicknames; while (list != NIL) { String nick = javaString(list.car()); if (Packages.findPackage(nick) != null) { return error(new PackageError("A package named " + nick + " already exists.")); } list = list.cdr(); } } pkg = Packages.createPackage(packageName); while (nicknames != NIL) { LispObject string = nicknames.car().STRING(); pkg.addNickname(string.getStringValue()); nicknames = nicknames.cdr(); } while (shadows != NIL) { String symbolName = shadows.car().getStringValue(); pkg.shadow(symbolName); shadows = shadows.cdr(); } while (shadowingImports != NIL) { LispObject si = shadowingImports.car(); Package otherPkg = coerceToPackage(si.car()); LispObject symbolNames = si.cdr(); while (symbolNames != NIL) { String symbolName = symbolNames.car().getStringValue(); Symbol sym = otherPkg.findAccessibleSymbol(symbolName); if (sym != null) pkg.shadowingImport(sym); else return error( new LispError( symbolName + " not found in package " + otherPkg.getName() + ".")); symbolNames = symbolNames.cdr(); } shadowingImports = shadowingImports.cdr(); } while (use != NIL) { LispObject obj = use.car(); if (obj instanceof Package) pkg.usePackage((Package) obj); else { LispObject string = obj.STRING(); Package p = Packages.findPackage(string.getStringValue()); if (p == null) return error(new LispError(obj.writeToString() + " is not the name of a package.")); pkg.usePackage(p); } use = use.cdr(); } while (imports != NIL) { LispObject si = imports.car(); Package otherPkg = coerceToPackage(si.car()); LispObject symbolNames = si.cdr(); while (symbolNames != NIL) { String symbolName = symbolNames.car().getStringValue(); Symbol sym = otherPkg.findAccessibleSymbol(symbolName); if (sym != null) pkg.importSymbol(sym); else return error( new LispError( symbolName + " not found in package " + otherPkg.getName() + ".")); symbolNames = symbolNames.cdr(); } imports = imports.cdr(); } while (interns != NIL) { String symbolName = interns.car().getStringValue(); pkg.intern(symbolName); interns = interns.cdr(); } while (exports != NIL) { String symbolName = exports.car().getStringValue(); pkg.export(pkg.intern(symbolName)); exports = exports.cdr(); } return pkg; }