* @return LogicObject
   */
  public static LogicObject callDefobject(Cons arguments) {
    { Cons definition = Cons.cons(Logic.SYM_LOGIC_DEFOBJECT, arguments.concatenate(Stella.NIL, Stella.NIL));
      Symbol name = null;
      Cons options = Stella.NIL;
      Stella_Object term = null;

      { Object old$Termsourcebeingparsed$000 = Logic.$TERMSOURCEBEINGPARSED$.get();

        try {
          Native.setSpecial(Logic.$TERMSOURCEBEINGPARSED$, Native.stringify(definition));
          arguments = Logic.normalizeDefobjectArguments(arguments);
          options = arguments.rest;
          if (Stella_Object.consP(arguments.value)) {
            name = Symbol.internSymbol(Native.stringify(arguments.value));
            term = Logic.conceiveTerm(arguments.value);
            if (term == null) {
              { OutputStringStream stream000 = OutputStringStream.newOutputStringStream();

                { Object old$PrintreadablyP$000 = Stella.$PRINTREADABLYp$.get();

                  try {
                    Native.setBooleanSpecial(Stella.$PRINTREADABLYp$, true);
                    stream000.nativeStream.println("ERROR: Illegal object name or term: `" + name + "'.");
                    Logic.helpSignalPropositionError(stream000, Logic.KWD_ERROR);

                  } finally {
                    Stella.$PRINTREADABLYp$.set(old$PrintreadablyP$000);
                  }
                }
                throw ((PropositionError)(PropositionError.newPropositionError(stream000.theStringReader()).fillInStackTrace()));
              }
            }
          }
          else {
            name = ((Symbol)(arguments.value));
            Logic.internLogicObjectSurrogate(name);
            term = Logic.createLogicInstance(null, null);
          }
          if (Surrogate.subtypeOfP(Stella_Object.safePrimaryType(term), Logic.SGT_LOGIC_LOGIC_OBJECT)) {
            { LogicObject term000 = ((LogicObject)(term));

              Logic.stringifiedSourceSetter(term000, ((String)(Logic.$TERMSOURCEBEINGPARSED$.get())));
              Logic.bindLogicObjectToSurrogate(name, term000);
              term000.processDefinitionOptions(options);
              Logic.registerUnfinalizedObject(term000);
            }
          }
          else {
            Logic.bindLogicObjectToSurrogate(name, term);
            { Stella_Object key = null;
              Stella_Object value = null;
              Cons iter000 = Stella_Object.vetOptions(options, null).thePlist;

              for (;!(iter000 == Stella.NIL); iter000 = iter000.rest.rest) {
                key = iter000.value;
                value = iter000.rest.value;
                Logic.assertKeywordAxiom(term, name, ((Keyword)(key)), value);
              }
            }
          }
          return (((LogicObject)(term)));

        } finally {
          Logic.$TERMSOURCEBEINGPARSED$.set(old$Termsourcebeingparsed$000);
        }
      }
    }
  }