Artifact d52c34042610bc59b04195f534809483d7b7cf7e4759d1fb4ac023336666d962:
- Executable file
r37/lisp/csl/jlisp/Macro.java
— part of check-in
[f2fda60abd]
at
2011-09-02 18:13:33
on branch master
— Some historical releases purely for archival purposes
git-svn-id: https://svn.code.sf.net/p/reduce-algebra/code/trunk/historical@1375 2bfe0521-f11c-4a00-b80e-6202646ff360 (user: arthurcnorman@users.sourceforge.net, size: 2755) [annotate] [blame] [check-ins using] [more...]
// // This file is part of the Jlisp implementation of Standard Lisp // Copyright \u00a9 (C) Codemist Ltd, 1998-2000. // // A Lisp macro is really very much like an ordinary // function with exactly one argument. It is the way that the // interpreted processes it that makes it different. Well actually because // of views on Common Lisp compatibility the function that is a macro // has one essential argument and one optional one (which I never use!) import java.io.*; class Macro extends LispFunction { LispObject body; void iprint() { if ((currentFlags & noLineBreak) == 0 && currentOutput.column + 7 > currentOutput.lineLength) currentOutput.println(); currentOutput.print("[Macro:"); body.blankprint(); if ((currentFlags & noLineBreak) == 0 && currentOutput.column + 1 > currentOutput.lineLength) currentOutput.println(); currentOutput.print("]"); } void blankprint() { if ((currentFlags & noLineBreak) == 0 && currentOutput.column + 7 >= currentOutput.lineLength) currentOutput.println(); else currentOutput.print(" "); currentOutput.print("[Macro:"); body.blankprint(); if ((currentFlags & noLineBreak) == 0 && currentOutput.column + 1 > currentOutput.lineLength) currentOutput.println(); currentOutput.print("]"); } Macro() { } Macro(LispObject def) throws Exception { body = new Cons(Jlisp.lit[Lit.lambda], def); } void scan() { if (Jlisp.objects.contains(this)) // seen before? { if (!Jlisp.repeatedObjects.containsKey(this)) { Jlisp.repeatedObjects.put( this, Jlisp.nil); // value is junk at this stage } } else Jlisp.objects.add(this); Jlisp.stack.push(body); } void dump() throws IOException { Object w = Jlisp.repeatedObjects.get(this); if (w != null && w instanceof Integer) putSharedRef(w); // processed before else { if (w != null) // will be used again sometime { Jlisp.repeatedObjects.put( this, new Integer(Jlisp.sharedIndex++)); Jlisp.odump.write(X_STORE); } Jlisp.odump.write(X_MACRO); Jlisp.stack.push(body); } } public LispObject op1(LispObject arg1) throws Exception { Fns.args[0] = arg1; return Fns.applyInner(body, 1); } public LispObject op2(LispObject arg1, LispObject arg2) throws Exception { Fns.args[0] = arg1; Fns.args[1] = arg2; return Fns.applyInner(body, 2); } } // End of Macro.java