Пример #1
0
 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;
 }