Changeset 5258


Ignore:
Timestamp:
12/27/03 04:30:21 (18 years ago)
Author:
piso
Message:

_flet(): support SETF functions.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/j/src/org/armedbear/lisp/SpecialOperators.java

    r5254 r5258  
    33 *
    44 * Copyright (C) 2003 Peter Graves
    5  * $Id: SpecialOperators.java,v 1.20 2003-12-27 00:59:00 piso Exp $
     5 * $Id: SpecialOperators.java,v 1.21 2003-12-27 04:30:21 piso Exp $
    66 *
    77 * This program is free software; you can redistribute it and/or
     
    272272            Environment ext = new Environment(env);
    273273            while (defs != NIL) {
    274                 LispObject def = checkList(defs.car());
    275                 Symbol symbol = checkSymbol(def.car());
     274                final LispObject def = checkList(defs.car());
     275                final LispObject name = def.car();
     276                final Symbol symbol;
     277                if (name instanceof Symbol) {
     278                    symbol = checkSymbol(name);
     279                    if (symbol.getSymbolFunction() instanceof SpecialOperator) {
     280                        String message =
     281                            symbol.getName() + " is a special operator and may not be redefined";
     282                        return signal(new ProgramError(message));
     283                    }
     284                } else if (name instanceof Cons && name.car() == Symbol.SETF) {
     285                    symbol = checkSymbol(name.cadr());
     286                } else
     287                    return signal(new TypeError(name, "valid function name"));
    276288                LispObject rest = def.cdr();
    277289                LispObject parameters = rest.car();
     
    294306                else
    295307                    closure = new Closure(parameters, body, env);
    296                 closure.setLambdaName(list2(Symbol.FLET, symbol));
    297                 ext.bindFunctional(symbol, closure);
     308                closure.setLambdaName(list2(Symbol.FLET, name));
     309                ext.bindFunctional(name, closure);
    298310                defs = defs.cdr();
    299311            }
     
    402414                    return new Closure(arg.cadr(), arg.cddr(), env);
    403415                if (arg.car() == Symbol.SETF) {
    404                     LispObject f = get(checkSymbol(arg.cadr()),
    405                                        PACKAGE_SYS.intern("SETF-FUNCTION"));
     416                    LispObject f = env.lookupFunctional(arg);
     417                    if (f != null)
     418                        return f;
     419                    f = get(checkSymbol(arg.cadr()),
     420                            PACKAGE_SYS.intern("SETF-FUNCTION"));
    406421                    if (f != null)
    407422                        return f;
Note: See TracChangeset for help on using the changeset viewer.