Esempio n. 1
0
static int_t CheckForIdentifier(FObject nam, FObject ids)
{
    FAssert(SymbolP(nam));

    while (PairP(ids))
    {
        if (SymbolP(First(ids)))
        {
            if (First(ids) == nam)
                return(1);
        }
        else
        {
            FAssert(IdentifierP(First(ids)));

            if (AsIdentifier(First(ids))->Symbol == nam)
                return(1);
        }

        ids = Rest(ids);
    }

    FAssert(ids == EmptyListObject);

    return(0);
}
Esempio n. 2
0
static FObject CheckForRename(FObject nam, FObject rlst)
{
    FAssert(SymbolP(nam));

    while (PairP(rlst))
    {
        FObject rnm = First(rlst);

        FAssert(PairP(rnm));
        FAssert(PairP(Rest(rnm)));

        if (SymbolP(First(rnm)))
        {
            FAssert(SymbolP(First(Rest(rnm))));

            if (nam == First(rnm))
                return(First(Rest(rnm)));
        }
        else
        {
            FAssert(IdentifierP(First(rnm)));
            FAssert(IdentifierP(First(Rest(rnm))));

            if (nam == AsIdentifier(First(rnm))->Symbol)
                return(AsIdentifier(First(Rest(rnm)))->Symbol);
        }

        rlst = Rest(rlst);
    }

    FAssert(rlst == EmptyListObject);

    return(NoValueObject);
}
Esempio n. 3
0
void EnvironmentImportLibrary(FObject env, FObject nam)
{
    FAssert(EnvironmentP(env));
    FAssert(AsEnvironment(env)->Interactive == TrueObject);

    FObject lib = FindLibrary(nam);
    FAssert(LibraryP(lib));

    FObject elst = AsLibrary(lib)->Exports;

    while (PairP(elst))
    {
        FAssert(PairP(First(elst)));
        FAssert(SymbolP(First(First(elst))));
        FAssert(GlobalP(Rest(First(elst))));

#ifdef FOMENT_DEBUG
        int_t ret =
#endif // FOMENT_DEBUG
        EnvironmentImportGlobal(env,
                ImportGlobal(env, First(First(elst)), Rest(First(elst))));
        FAssert(ret == 0);

        elst = Rest(elst);
    }

    FAssert(elst == EmptyListObject);
}
Esempio n. 4
0
static FObject DoOnlyOrExcept(FObject env, FObject is, int_t cfif)
{
    if (PairP(Rest(is)) == 0)
        return(NoValueObject);

    FObject ilst = DoImportSet(env, First(Rest(is)), is);
    FObject ids = Rest(Rest(is));
    while (PairP(ids))
    {
        if (IdentifierP(First(ids)) == 0 && SymbolP(First(ids)) == 0)
            return(NoValueObject);

        ids = Rest(ids);
    }

    if (ids != EmptyListObject)
        return(NoValueObject);

    FObject nlst = EmptyListObject;
    while (PairP(ilst))
    {
        FAssert(GlobalP(First(ilst)));

        if (CheckForIdentifier(AsGlobal(First(ilst))->Name, Rest(Rest(is))) == cfif)
            nlst = MakePair(First(ilst), nlst);

        ilst = Rest(ilst);
    }

    FAssert(ilst == EmptyListObject);

    return(nlst);
}
Esempio n. 5
0
// A global will be returned only if it has already be defined (or set).
FObject EnvironmentLookup(FObject env, FObject sym)
{
    FAssert(EnvironmentP(env));
    FAssert(SymbolP(sym));

    return(EqHashMapRef(AsEnvironment(env)->HashMap, sym, FalseObject));
}
Esempio n. 6
0
// If the environment is interactive, a global will be defined. Otherwise, a global will be
// defined only if it is not already defined. One will be returned if the global can't be defined.
int_t EnvironmentDefine(FObject env, FObject symid, FObject val)
{
    FAssert(EnvironmentP(env));
    FAssert(SymbolP(symid) || IdentifierP(symid));

    if (IdentifierP(symid))
        symid = AsIdentifier(symid)->Symbol;

    FObject gl = EnvironmentBind(env, symid);

    FAssert(GlobalP(gl));

    if (AsEnvironment(env)->Interactive == FalseObject)
    {
        if (AsGlobal(gl)->State != GlobalUndefined)
            return(1);
    }
    else if (AsGlobal(gl)->State == GlobalImported
            || AsGlobal(gl)->State == GlobalImportedModified)
    {
        FAssert(BoxP(AsGlobal(gl)->Box));

//        AsGlobal(gl)->Box = MakeBox(NoValueObject);
        Modify(FGlobal, gl, Box, MakeBox(NoValueObject));
    }

    FAssert(BoxP(AsGlobal(gl)->Box));

    SetBox(AsGlobal(gl)->Box, val);
//    AsGlobal(gl)->State = GlobalDefined;
    Modify(FGlobal, gl, State, GlobalDefined);

    return(0);
}
Esempio n. 7
0
static FObject CompileLibraryCode(FObject env, FObject lst)
{
    FObject body = EmptyListObject;

    while (PairP(lst))
    {
        FAssert(PairP(First(lst)));
        FAssert(IdentifierP(First(First(lst))) || SymbolP(First(First(lst))));

        FObject form = First(lst);

        if (EqualToSymbol(First(form), R.BeginSymbol)
                || EqualToSymbol(First(form), R.IncludeSymbol)
                || EqualToSymbol(First(form), R.IncludeCISymbol))
            body = CompileEvalExpr(form, env, body);
        else
        {
            FAssert(EqualToSymbol(First(form), R.ImportSymbol)
                    || EqualToSymbol(First(form), R.IncludeLibraryDeclarationsSymbol)
                    || EqualToSymbol(First(form), R.CondExpandSymbol)
                    || EqualToSymbol(First(form), R.ExportSymbol)
                    || EqualToSymbol(First(form), R.AkaSymbol));
        }

        lst = Rest(lst);
    }

    FAssert(lst == EmptyListObject);

    if (body == EmptyListObject)
        return(NoValueObject);

    return(CompileLambda(env, NoValueObject, EmptyListObject, ReverseListModify(body)));
}
Esempio n. 8
0
static Object* SymbolEval(Context* ctx) {
  Object* o = StackPop(ctx->stack);
  if(!SymbolP(o)) {
    abort(); // TODO: error
  }
  Symbol* s = ObjectGetDataPtr(o);
  return EnvironmentGet(ctx, s);
}
Esempio n. 9
0
static int_t EqualToSymbol(FObject obj, FObject sym)
{
    FAssert(SymbolP(sym));

    if (IdentifierP(obj))
        return(AsIdentifier(obj)->Symbol == sym);

    return(obj == sym);
}
Esempio n. 10
0
static Object* SymbolDelete(Context* ctx) {
  Object* o = StackPop(ctx->stack);
  if(!SymbolP(o)) {
    abort(); // TODO: return error
  }
  Symbol* s = ObjectGetDataPtr(o);
  free(s->name);
  return NULL;
}
Esempio n. 11
0
static Object* SymbolPrint(Context* ctx) {
  Object* o = StackPop(ctx->stack);
  if(!SymbolP(o)) {
    abort(); // TODO: return error
  }
  Symbol* s = ObjectGetDataPtr(o);
  fputs(s->name, stdout);
  return NULL;
}
Esempio n. 12
0
static void LibraryExportByName(FObject lib, FObject gl, FObject nam)
{
    FAssert(LibraryP(lib));
    FAssert(GlobalP(gl));
    FAssert(SymbolP(nam));
    FAssert(GlobalP(Assq(nam, AsLibrary(lib)->Exports)) == 0);

//    AsLibrary(lib)->Exports = MakePair(MakePair(nam, gl), AsLibrary(lib)->Exports);
    Modify(FLibrary, lib, Exports, MakePair(MakePair(nam, gl), AsLibrary(lib)->Exports));
}
Esempio n. 13
0
static FObject CompileTransformer(FObject obj, FObject env)
{
    if (PairP(obj) == 0 || (IdentifierP(First(obj)) == 0 && SymbolP(First(obj)) == 0))
        return(NoValueObject);

    FObject op = EnvironmentGet(env, First(obj));
    if (op == SyntaxRulesSyntax)
        return(CompileSyntaxRules(MakeSyntacticEnv(env), obj));

    return(NoValueObject);
}
Esempio n. 14
0
static FObject MakeGlobal(FObject nam, FObject mod, FObject ctv)
{
    FAssert(sizeof(FGlobal) == sizeof(GlobalFieldsC) + sizeof(FRecord));
    FAssert(SymbolP(nam));

    FGlobal * gl = (FGlobal *) MakeRecord(R.GlobalRecordType);
    gl->Box = MakeBox(NoValueObject);
    gl->Name = nam;
    gl->Module = mod;
    gl->State = GlobalUndefined;
    gl->Interactive = ctv;

    return(gl);
}
Esempio n. 15
0
// A global will always be returned.
FObject EnvironmentBind(FObject env, FObject sym)
{
    FAssert(EnvironmentP(env));
    FAssert(SymbolP(sym));

    FObject gl = EqHashMapRef(AsEnvironment(env)->HashMap, sym, FalseObject);
    if (gl == FalseObject)
    {
        gl = MakeGlobal(sym, AsEnvironment(env)->Name, AsEnvironment(env)->Interactive);
        EqHashMapSet(AsEnvironment(env)->HashMap, sym, gl);
    }

    FAssert(GlobalP(gl));
    return(gl);
}
Esempio n. 16
0
static FObject ResolvedGet(FObject env, FObject symid)
{
    FAssert(IdentifierP(symid) || SymbolP(symid));

    if (IdentifierP(symid))
    {
        while (IdentifierP(AsIdentifier(symid)->Wrapped))
        {
            env = AsSyntacticEnv(AsIdentifier(symid)->SyntacticEnv)->GlobalBindings;
            symid = AsIdentifier(symid)->Wrapped;
        }
    }

    FAssert(EnvironmentP(env));

    return(EnvironmentGet(env, symid));
}
Esempio n. 17
0
FObject EnvironmentGet(FObject env, FObject symid)
{
    if (IdentifierP(symid))
        symid = AsIdentifier(symid)->Symbol;

    FAssert(SymbolP(symid));

    FObject gl = EqHashMapRef(AsEnvironment(env)->HashMap, symid, FalseObject);
    if (GlobalP(gl))
    {
        FAssert(BoxP(AsGlobal(gl)->Box));

        return(Unbox(AsGlobal(gl)->Box));
    }

    return(NoValueObject);
}
Esempio n. 18
0
FObject LibraryName(FObject lst)
{
    FObject nlst = EmptyListObject;

    while (PairP(lst))
    {
        if (IdentifierP(First(lst)) == 0 && FixnumP(First(lst)) == 0 && SymbolP(First(lst)) == 0)
            return(NoValueObject);

        nlst = MakePair(IdentifierP(First(lst)) ? AsIdentifier(First(lst))->Symbol : First(lst),
                nlst);
        lst = Rest(lst);
    }

    if (lst != EmptyListObject)
        return(NoValueObject);

    return(ReverseListModify(nlst));
}
Esempio n. 19
0
static FObject CompileAkas(FObject env, FObject lst)
{
    FObject akalst = EmptyListObject;

    while (PairP(lst))
    {
        FAssert(PairP(First(lst)));
        FAssert(IdentifierP(First(First(lst))) || SymbolP(First(First(lst))));

        FObject form = First(lst);

        if (EqualToSymbol(First(form), R.AkaSymbol))
        {
            if (PairP(Rest(form)) == 0 || Rest(Rest(form)) != EmptyListObject)
                RaiseExceptionC(R.Syntax, "aka", "expected (aka <library-name>)", List(form));

            FObject ln = LibraryName(First(Rest(form)));
            if (PairP(ln) == 0)
                RaiseExceptionC(R.Syntax, "aka",
                        "library name must be a list of symbols and/or integers",
                        List(First(Rest(form))));

            akalst = MakePair(ln, akalst);
        }
        else
        {
            FAssert(EqualToSymbol(First(form), R.ImportSymbol)
                    || EqualToSymbol(First(form), R.ExportSymbol)
                    || EqualToSymbol(First(form), R.IncludeLibraryDeclarationsSymbol)
                    || EqualToSymbol(First(form), R.CondExpandSymbol)
                    || EqualToSymbol(First(form), R.BeginSymbol)
                    || EqualToSymbol(First(form), R.IncludeSymbol)
                    || EqualToSymbol(First(form), R.IncludeCISymbol));
        }

        lst = Rest(lst);
    }

    FAssert(lst == EmptyListObject);

    return(akalst);
}
Esempio n. 20
0
static FObject ExpandLibraryDeclarations(FObject env, FObject lst, FObject body)
{
    while (PairP(lst))
    {
        if (PairP(First(lst)) == 0 || (IdentifierP(First(First(lst))) == 0
                && SymbolP(First(First(lst))) == 0))
            RaiseExceptionC(R.Syntax, "define-library",
                    "expected a library declaration", List(First(lst)));

        FObject form = First(lst);

        if (EqualToSymbol(First(form), R.ImportSymbol))
            EnvironmentImport(env, form);
        else if (EqualToSymbol(First(form), R.IncludeLibraryDeclarationsSymbol))
            body = ExpandLibraryDeclarations(env, ReadInclude(First(form), Rest(form), 0), body);
        else if (EqualToSymbol(First(form), R.CondExpandSymbol))
        {
            FObject ce = CondExpand(MakeSyntacticEnv(R.Bedrock), form, Rest(form));
            if (ce != EmptyListObject)
                body = ExpandLibraryDeclarations(env, ce , body);
        }
        else if (EqualToSymbol(First(form), R.ExportSymbol) == 0
                && EqualToSymbol(First(form), R.AkaSymbol) == 0
                && EqualToSymbol(First(form), R.BeginSymbol) == 0
                && EqualToSymbol(First(form), R.IncludeSymbol) == 0
                && EqualToSymbol(First(form), R.IncludeCISymbol) == 0)
            RaiseExceptionC(R.Syntax, "define-library",
                    "expected a library declaration", List(First(lst)));
        else
            body = MakePair(form, body);

        lst = Rest(lst);
    }

    if (lst != EmptyListObject)
        RaiseExceptionC(R.Syntax, "define-library",
                "expected a proper list of library declarations", List(lst));

    return(body);
}
Esempio n. 21
0
// (<name1> <name2> ... <namen>) --> <dir>\<name1>\<name2>\...\<namen>.<ext>
static FObject LibraryNameDeep(FObject dir, FObject nam, FObject ext)
{
    FObject out = MakeStringOutputPort();
    WriteSimple(out, dir, 1);

    while (PairP(nam))
    {
        FAssert(SymbolP(First(nam)) || IntegerP(First(nam)));

        WriteCh(out, PathCh);
        WriteSimple(out, First(nam), 1);

        nam = Rest(nam);
    }

    FAssert(nam == EmptyListObject);

    WriteStringC(out, ".");
    WriteSimple(out, ext, 1);

    return(GetOutputString(out));
}
Esempio n. 22
0
static FObject ImportGlobal(FObject env, FObject nam, FObject gl)
{
    FAssert(sizeof(FGlobal) == sizeof(GlobalFieldsC) + sizeof(FRecord));
    FAssert(EnvironmentP(env));
    FAssert(SymbolP(nam));
    FAssert(GlobalP(gl));

    FGlobal * ngl = (FGlobal *) MakeRecord(R.GlobalRecordType);
    ngl->Box = AsGlobal(gl)->Box;
    ngl->Name = nam;
    ngl->Module =  AsEnvironment(env)->Interactive == TrueObject ? env : AsGlobal(gl)->Module;
    if (AsGlobal(gl)->State == GlobalDefined || AsGlobal(gl)->State == GlobalImported)
        ngl->State = GlobalImported;
    else
    {
        FAssert(AsGlobal(gl)->State == GlobalModified
                || AsGlobal(gl)->State == GlobalImportedModified);

        ngl->State = GlobalImportedModified;
    }

    return(ngl);
}
Esempio n. 23
0
static FObject CompileEvalExpr(FObject obj, FObject env, FObject body)
{
    if (VectorP(obj))
        return(MakePair(SyntaxToDatum(obj), body));
    else if (PairP(obj) && (IdentifierP(First(obj)) || SymbolP(First(obj))))
    {
        if (EqualToSymbol(First(obj), R.DefineLibrarySymbol))
        {
            CompileLibrary(obj);
            return(body);
        }
        else if (EqualToSymbol(First(obj), R.ImportSymbol))
        {
            EnvironmentImport(env, obj);
            if (body != EmptyListObject)
                body = MakePair(List(R.NoValuePrimitive), body);

            return(body);
        }
//        FObject op = EnvironmentGet(env, First(obj));
        FObject op = ResolvedGet(env, First(obj));

        if (op == DefineSyntax)
        {
            // (define <variable> <expression>)
            // (define <variable>)
            // (define (<variable> <formals>) <body>)
            // (define (<variable> . <formal>) <body>)

            FAssert(EnvironmentP(env));

            if (AsEnvironment(env)->Immutable == TrueObject)
                RaiseExceptionC(R.Assertion, "define",
                        "environment is immutable", List(env, obj));

            if (PairP(Rest(obj)) == 0)
                RaiseExceptionC(R.Syntax, "define",
                        "expected a variable or list beginning with a variable", List(obj));

            if (IdentifierP(First(Rest(obj))) || SymbolP(First(Rest(obj))))
            {
                if (Rest(Rest(obj)) == EmptyListObject)
                {
                    // (define <variable>)

                    if (EnvironmentDefine(env, First(Rest(obj)), NoValueObject))
                        RaiseExceptionC(R.Syntax, "define",
                                "imported variables may not be redefined in libraries",
                                List(First(Rest(obj)), obj));

                    return(body);
                }

                // (define <variable> <expression>)

                if (PairP(Rest(Rest(obj))) == 0 || Rest(Rest(Rest(obj))) != EmptyListObject)
                    RaiseExceptionC(R.Syntax, "define",
                            "expected (define <variable> <expression>)", List(obj));

                if (EnvironmentDefine(env, First(Rest(obj)), NoValueObject))
                    RaiseExceptionC(R.Syntax, "define",
                            "imported variables may not be redefined in libraries",
                            List(First(Rest(obj)), obj));

                return(MakePair(List(SetBangSyntax, First(Rest(obj)),
                        First(Rest(Rest(obj)))), body));
            }
            else
            {
                // (define (<variable> <formals>) <body>)
                // (define (<variable> . <formal>) <body>)

                if (PairP(First(Rest(obj))) == 0 || (IdentifierP(First(First(Rest(obj)))) == 0
                        && SymbolP(First(First(Rest(obj)))) == 0))
                    RaiseExceptionC(R.Syntax, "define",
                            "expected a list beginning with a variable", List(obj));

                if (EnvironmentDefine(env, First(First(Rest(obj))),
                        CompileLambda(env, First(First(Rest(obj))), Rest(First(Rest(obj))),
                        Rest(Rest(obj)))))
                    RaiseExceptionC(R.Syntax, "define",
                            "imported variables may not be redefined in libraries",
                            List(First(First(Rest(obj))), obj));

                return(body);
            }
        }
        else if (op == DefineValuesSyntax)
        {
            // (define-values (<variable> ...) <expression>)

            FAssert(EnvironmentP(env));

            if (AsEnvironment(env)->Immutable == TrueObject)
                RaiseExceptionC(R.Assertion, "define-values",
                        "environment is immutable", List(env, obj));

            if (PairP(Rest(obj)) == 0
                    || (PairP(First(Rest(obj))) == 0 && First(Rest(obj)) != EmptyListObject)
                    || PairP(Rest(Rest(obj))) == 0 || Rest(Rest(Rest(obj))) != EmptyListObject)
                RaiseExceptionC(R.Syntax, "define-values",
                        "expected (define-values (<variable> ...) <expression>)", List(obj));

            FObject lst = First(Rest(obj));
            while (PairP(lst))
            {
                if (IdentifierP(First(lst)) == 0 && SymbolP(First(lst)) == 0)
                    RaiseExceptionC(R.Syntax, "define-values",
                            "expected (define-values (<variable> ...) <expression>)",
                            List(First(lst), obj));

                if (EnvironmentDefine(env, First(lst), NoValueObject))
                    RaiseExceptionC(R.Syntax, "define-values",
                            "imported variables may not be redefined in libraries",
                            List(First(lst), obj));

                lst = Rest(lst);
            }

            if (lst != EmptyListObject)
                RaiseExceptionC(R.Syntax, "define-values", "expected a list of variables",
                        List(obj));

            return(MakePair(List(SetBangValuesSyntax, First(Rest(obj)), First(Rest(Rest(obj)))),
                    body));
        }
        else if (op == DefineSyntaxSyntax)
        {
            // (define-syntax <keyword> <expression>)

            FAssert(EnvironmentP(env));

            if (AsEnvironment(env)->Immutable == TrueObject)
                RaiseExceptionC(R.Assertion, "define",
                        "environment is immutable", List(env, obj));

            if (PairP(Rest(obj)) == 0 || PairP(Rest(Rest(obj))) == 0
                    || Rest(Rest(Rest(obj))) != EmptyListObject
                    || (IdentifierP(First(Rest(obj))) == 0 && SymbolP(First(Rest(obj))) == 0))
                RaiseExceptionC(R.Syntax, "define-syntax",
                        "expected (define-syntax <keyword> <transformer>)",
                        List(obj));

            FObject trans = CompileTransformer(First(Rest(Rest(obj))), env);
            if (SyntaxRulesP(trans) == 0)
                RaiseExceptionC(R.Syntax, "define-syntax",
                        "expected a transformer", List(trans, obj));

            if (EnvironmentDefine(env, First(Rest(obj)), trans))
                RaiseExceptionC(R.Syntax, "define",
                        "imported variables may not be redefined in libraries",
                        List(First(Rest(obj)), obj));

            return(body);
        }
        else if (SyntaxRulesP(op))
            return(CompileEvalExpr(ExpandSyntaxRules(MakeSyntacticEnv(env), op, Rest(obj)), env,
                    body));
        else if (op == BeginSyntax)
            return(CompileEvalBegin(Rest(obj), env, body, obj, BeginSyntax));
        else if (op == IncludeSyntax || op == IncludeCISyntax)
            return(CompileEvalBegin(ReadInclude(First(obj), Rest(obj), op == IncludeCISyntax), env,
                    body, obj, op));
        else if (op == CondExpandSyntax)
        {
            FObject ce = CondExpand(MakeSyntacticEnv(env), obj, Rest(obj));
            if (ce == EmptyListObject)
                return(body);
            return(CompileEvalBegin(ce, env, body, obj, op));
        }
    }

    return(MakePair(obj, body));
}
Esempio n. 24
0
static FObject CompileExports(FObject env, FObject lst)
{
    FObject elst = EmptyListObject;

    while (PairP(lst))
    {
        FAssert(PairP(First(lst)));
        FAssert(IdentifierP(First(First(lst))) || SymbolP(First(First(lst))));

        FObject form = First(lst);

        if (EqualToSymbol(First(form), R.ExportSymbol))
        {
            FObject especs = Rest(form);
            while (PairP(especs))
            {
                FObject spec = First(especs);
                if (IdentifierP(spec) == 0 && SymbolP(spec) == 0
                        && (PairP(spec) == 0
                        || PairP(Rest(spec)) == 0
                        || (IdentifierP(First(Rest(spec))) == 0 && SymbolP(First(Rest(spec))) == 0)
                        || PairP(Rest(Rest(spec))) == 0
                        || (IdentifierP(First(Rest(Rest(spec)))) == 0
                        && SymbolP(First(Rest(Rest(spec)))) == 0)
                        || Rest(Rest(Rest(spec))) != EmptyListObject
                        || EqualToSymbol(First(spec), R.RenameSymbol) == 0))
                    RaiseExceptionC(R.Syntax, "export",
                            "expected an identifier or (rename <id1> <id2>)",
                            List(spec, form));

                FObject lid = spec;
                FObject eid = spec;

                if (PairP(spec))
                {
                    lid = First(Rest(spec));
                    eid = First(Rest(Rest(spec)));
                }

                if (IdentifierP(lid))
                    lid = AsIdentifier(lid)->Symbol;
                if (IdentifierP(eid))
                    eid = AsIdentifier(eid)->Symbol;

                FObject gl = EnvironmentLookup(env, lid);
                if (GlobalP(gl) == 0)
                    RaiseExceptionC(R.Syntax, "export", "identifier is undefined",
                            List(lid, form));

                if (GlobalP(Assq(eid, elst)))
                    RaiseExceptionC(R.Syntax, "export", "identifier already exported",
                            List(eid, form));

                elst = MakePair(MakePair(eid, gl), elst);
                especs = Rest(especs);
            }

            if (especs != EmptyListObject)
                RaiseExceptionC(R.Syntax, "export", "expected a proper list of exports",
                        List(form));
        }
        else
        {
            FAssert(EqualToSymbol(First(form), R.ImportSymbol)
                    || EqualToSymbol(First(form), R.AkaSymbol)
                    || EqualToSymbol(First(form), R.IncludeLibraryDeclarationsSymbol)
                    || EqualToSymbol(First(form), R.CondExpandSymbol)
                    || EqualToSymbol(First(form), R.BeginSymbol)
                    || EqualToSymbol(First(form), R.IncludeSymbol)
                    || EqualToSymbol(First(form), R.IncludeCISymbol));
        }

        lst = Rest(lst);
    }

    FAssert(lst == EmptyListObject);

    return(elst);
}
Esempio n. 25
0
static FObject DoImportSet(FObject env, FObject is, FObject form)
{
    // <library-name>
    // (only <import-set> <identifier> ...)
    // (except <import-set> <identifier> ...)
    // (prefix <import-set> <identifier>)
    // (rename <import-set> (<identifier1> <identifier2>) ...)

    if (PairP(is) == 0 || (IdentifierP(First(is)) == 0 && SymbolP(First(is)) == 0))
        RaiseExceptionC(R.Syntax, "import", "expected a list starting with an identifier",
                List(is, form));

    if (EqualToSymbol(First(is), R.OnlySymbol))
    {
        FObject ilst = DoOnlyOrExcept(env, is, 1);
        if (ilst == NoValueObject)
            RaiseExceptionC(R.Syntax, "import",
                    "expected (only <import-set> <identifier> ...)", List(is, form));

        return(ilst);
    }
    else if (EqualToSymbol(First(is), R.ExceptSymbol))
    {
        FObject ilst = DoOnlyOrExcept(env, is, 0);
        if (ilst == NoValueObject)
            RaiseExceptionC(R.Syntax, "import",
                    "expected (except <import-set> <identifier> ...)", List(is, form));

        return(ilst);
    }
    else if (EqualToSymbol(First(is), R.PrefixSymbol))
    {
        if (PairP(Rest(is)) == 0 || PairP(Rest(Rest(is))) == 0
                || Rest(Rest(Rest(is))) != EmptyListObject ||
                (IdentifierP(First(Rest(Rest(is)))) == 0 && SymbolP(First(Rest(Rest(is)))) == 0))
            RaiseExceptionC(R.Syntax, "import",
                    "expected (prefix <import-set> <identifier>)", List(is, form));

        FObject prfx;
        if (SymbolP(First(Rest(Rest(is)))))
            prfx = AsSymbol(First(Rest(Rest(is))))->String;
        else
            prfx = AsSymbol(AsIdentifier(First(Rest(Rest(is))))->Symbol)->String;
        FObject ilst = DoImportSet(env, First(Rest(is)), is);
        FObject lst = ilst;
        while (PairP(lst))
        {
            FAssert(GlobalP(First(lst)));

//            AsGlobal(First(lst))->Name = PrefixSymbol(prfx, AsGlobal(First(lst))->Name);
            Modify(FGlobal, First(lst), Name, PrefixSymbol(prfx, AsGlobal(First(lst))->Name));
            lst = Rest(lst);
        }

        FAssert(lst == EmptyListObject);

        return(ilst);
    }
    else if (EqualToSymbol(First(is), R.RenameSymbol))
    {
        if (PairP(Rest(is)) == 0)
            RaiseExceptionC(R.Syntax, "import",
                    "expected (rename <import-set> (<identifier> <identifier>) ...)",
                    List(is, form));

        FObject ilst = DoImportSet(env, First(Rest(is)), is);
        FObject rlst = Rest(Rest(is));
        while (PairP(rlst))
        {
            FObject rnm = First(rlst);
            if (PairP(rnm) == 0 || PairP(Rest(rnm)) == 0 || Rest(Rest(rnm)) != EmptyListObject
                    || (IdentifierP(First(rnm)) == 0 && SymbolP(First(rnm)) == 0)
                    || (IdentifierP(First(Rest(rnm))) == 0 && SymbolP(First(Rest(rnm))) == 0))
                RaiseExceptionC(R.Syntax, "import",
                        "expected (rename <import-set> (<identifier> <identifier>) ...)",
                        List(is, form));

                rlst = Rest(rlst);
        }

        if (rlst != EmptyListObject)
            RaiseExceptionC(R.Syntax, "import",
                    "expected (rename <import-set> (<identifier> <identifier>) ...)",
                    List(is, form));

        FObject lst = ilst;
        while (PairP(lst))
        {
            FAssert(GlobalP(First(lst)));

            FObject nm = CheckForRename(AsGlobal(First(lst))->Name, Rest(Rest(is)));
            if (SymbolP(nm))
            {
//                AsGlobal(First(lst))->Name = nm;
                Modify(FGlobal, First(lst), Name, nm);
            }

            lst = Rest(lst);
        }

        FAssert(lst == EmptyListObject);

        return(ilst);
    }

    FObject nam = LibraryName(is);
    if (PairP(nam) == 0)
        RaiseExceptionC(R.Syntax, "import",
                "library name must be a list of symbols and/or integers", List(is));

    FObject lib = FindOrLoadLibrary(nam);

    if (LibraryP(lib) == 0)
        RaiseExceptionC(R.Syntax, "import", "library not found", List(nam, form));

    FObject ilst = EmptyListObject;
    FObject elst = AsLibrary(lib)->Exports;

    while (PairP(elst))
    {
        FAssert(PairP(First(elst)));
        FAssert(SymbolP(First(First(elst))));
        FAssert(GlobalP(Rest(First(elst))));

        ilst = MakePair(ImportGlobal(env, First(First(elst)), Rest(First(elst))), ilst);
        elst = Rest(elst);
    }

    FAssert(elst == EmptyListObject);

    return(ilst);
}