Changeset 12310


Ignore:
Timestamp:
12/28/09 13:00:31 (14 years ago)
Author:
ehuelsmann
Message:

Implement note 1 from r12306: function preloading for macros.

Location:
trunk/abcl/src/org/armedbear/lisp
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/abcl/src/org/armedbear/lisp/AutoloadedFunctionProxy.java

    r12306 r12310  
    4242public class AutoloadedFunctionProxy extends Function {
    4343
     44    public enum FunctionType
     45    {
     46        NORMAL, SETF, MACRO
     47    };
     48
    4449    final private Symbol symbol;
    4550    final private String name;
     
    4752    final private LispObject pack;
    4853    final private LispObject anonymousPackage;
    49     final private boolean isSetfFunction;
     54    final private FunctionType fType;
    5055    Function fun = null;
    5156
     
    5358                                   LispObject cache, LispObject pack,
    5459                                   LispObject anonymousPackage,
    55                                    boolean setfFunction) {
     60                                   FunctionType ft) {
    5661        super();
    5762        this.symbol = symbol;
     
    5964        this.cache = cache;
    6065        this.pack = pack;
    61         //        Debug.trace("proxying ... " + name.getStringValue());
    6266        Debug.assertTrue(! (cache instanceof Nil));
    6367        this.anonymousPackage = anonymousPackage;
    64         this.isSetfFunction = setfFunction;
     68        this.fType = ft;
    6569    }
    6670
     
    8791        }
    8892
    89         if (symbol != null) {
    90             if (isSetfFunction)
    91                 put(symbol, Symbol.SETF_FUNCTION, fun);
     93        if (symbol != null)
     94            installFunction(fType, symbol, fun);
     95
     96        return fun;
     97    }
     98
     99    final static private void installFunction(FunctionType fType,
     100                                              Symbol sym, Function fun) {
     101
     102        if (fType == FunctionType.SETF)
     103            put(sym, Symbol.SETF_FUNCTION, fun);
     104        else if (fType == FunctionType.MACRO) {
     105            if (sym.getSymbolFunction() instanceof SpecialOperator)
     106                put(sym, Symbol.MACROEXPAND_MACRO,
     107                    new MacroObject(sym, fun));
    92108            else
    93                 symbol.setSymbolFunction(fun);
    94         }
    95 
    96         return fun;
     109                sym.setSymbolFunction(new MacroObject(sym, fun));
     110        } else
     111            sym.setSymbolFunction(fun);
    97112    }
    98113
     
    215230        LispThread thread = LispThread.currentThread();
    216231        Symbol sym;
    217         LispObject fun;
    218         boolean setfFun = false;
     232        Function fun;
     233        FunctionType fType = FunctionType.NORMAL;
    219234
    220235        if (symbol instanceof Symbol)
     
    222237        else if (isValidSetfFunctionName(symbol)) {
    223238            sym = (Symbol)symbol.cadr();
    224             setfFun = true;
     239            fType = FunctionType.SETF;
     240        } else if (isValidMacroFunctionName(symbol)) {
     241            sym = (Symbol)symbol.cadr();
     242            fType = FunctionType.MACRO;
    225243        } else {
    226244            checkSymbol(symbol); // generate an error
     
    236254            fun = new AutoloadedFunctionProxy(sym, name, cache, pack,
    237255                                              Load._FASL_ANONYMOUS_PACKAGE_.symbolValue(thread),
    238                                               setfFun);
    239             if (setfFun)
    240                 put(sym, Symbol.SETF_FUNCTION, fun);
    241             else
    242                 sym.setSymbolFunction(fun);
     256                                              fType);
     257
     258            installFunction(fType, sym, fun);
    243259        }
    244260
  • trunk/abcl/src/org/armedbear/lisp/Lisp.java

    r12306 r12310  
    14781478    return false;
    14791479  }
     1480
     1481  public static final boolean isValidMacroFunctionName(LispObject obj)
     1482  {
     1483    if (obj instanceof Cons)
     1484      {
     1485        Cons cons = (Cons) obj;
     1486        if (cons.car == Symbol.MACRO_FUNCTION && cons.cdr instanceof Cons)
     1487          {
     1488            Cons cdr = (Cons) cons.cdr;
     1489            return (cdr.car instanceof Symbol && cdr.cdr == NIL);
     1490          }
     1491      }
     1492    return false;
     1493  }
     1494
    14801495
    14811496  public static final LispObject FUNCTION_NAME =
  • trunk/abcl/src/org/armedbear/lisp/compile-file.lisp

    r12306 r12310  
    225225                             `(put ',name 'macroexpand-macro
    226226                                   (make-macro ',name
    227                                                (load-compiled-function
     227                                               (proxy-preloaded-function
     228                                                '(macro-function ,name)
    228229                                                ,(file-namestring classfile))))
    229230                             `(fset ',name
    230231                                    (make-macro ',name
    231                                                 (load-compiled-function
     232                                                (proxy-preloaded-function
     233                                                 '(macro-function ,name)
    232234                                                 ,(file-namestring classfile)))
    233235                                    ,*source-position*
Note: See TracChangeset for help on using the changeset viewer.