1 21 22 package org.armedbear.lisp; 23 24 public final class AutoloadMacro extends Autoload 25 { 26 private AutoloadMacro(Symbol symbol) 27 { 28 super(symbol); 29 } 30 31 private AutoloadMacro(Symbol symbol, String fileName) 32 { 33 super(symbol, fileName, null); 34 } 35 36 private static void installAutoloadMacro(Symbol symbol, String fileName) 37 throws ConditionThrowable 38 { 39 AutoloadMacro am = new AutoloadMacro(symbol, fileName); 40 if (symbol.getSymbolFunction() instanceof SpecialOperator) 41 put(symbol, Symbol.MACROEXPAND_MACRO, am); 42 else 43 symbol.setSymbolFunction(am); 44 } 45 46 public void load() throws ConditionThrowable 47 { 48 Load.loadSystemFile(getFileName(), true); 49 } 50 51 public String writeToString() throws ConditionThrowable 52 { 53 StringBuffer sb = new StringBuffer ("#<AUTOLOAD-MACRO "); 54 sb.append(getSymbol().writeToString()); 55 sb.append(" \""); 56 sb.append(getFileName()); 57 sb.append("\">"); 58 return sb.toString(); 59 } 60 61 private static final Primitive AUTOLOAD_MACRO = 63 new Primitive("autoload-macro", PACKAGE_EXT, true) 64 { 65 public LispObject execute(LispObject first) throws ConditionThrowable 66 { 67 if (first instanceof Symbol) { 68 Symbol symbol = (Symbol) first; 69 installAutoloadMacro(symbol, null); 70 return T; 71 } 72 if (first instanceof Cons) { 73 for (LispObject list = first; list != NIL; list = list.cdr()) { 74 Symbol symbol = checkSymbol(list.car()); 75 installAutoloadMacro(symbol, null); 76 } 77 return T; 78 } 79 return signal(new TypeError(first)); 80 } 81 public LispObject execute(LispObject first, LispObject second) 82 throws ConditionThrowable 83 { 84 final String fileName = second.getStringValue(); 85 if (first instanceof Symbol) { 86 Symbol symbol = (Symbol) first; 87 installAutoloadMacro(symbol, fileName); 88 return T; 89 } 90 if (first instanceof Cons) { 91 for (LispObject list = first; list != NIL; list = list.cdr()) { 92 Symbol symbol = checkSymbol(list.car()); 93 installAutoloadMacro(symbol, fileName); 94 } 95 return T; 96 } 97 return signal(new TypeError(first)); 98 } 99 }; 100 } 101 | Popular Tags |