Artifact d125c44f35997b15c77cf9d7af992e0ab24f8af65b61ec1dd62696cff092021a:
- Executable file
r37/lisp/csl/jlisp/CallAs.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: 2630) [annotate] [blame] [check-ins using] [more...]
// // This file is part of the Jlisp implementation of Standard Lisp // Copyright \u00a9 (C) Codemist Ltd, 1998-2000. // import java.io.*; class CallAs extends LispFunction { LispObject body; int nargs; CallAs(int nIn, LispObject target, int nPass) { body = target; nargs = (nIn<<4) + nPass; } CallAs(int packed) { nargs = packed; } public void print() { print(0); } public void print(int fg) { Jlisp.print("#CALL" + (nargs & 0xf) + "as" + ((nargs>>4) & 0xf) + "<"); body.print(fg); Jlisp.print(">"); } public LispObject op0() throws Exception { if (((nargs>>4) & 0xf) != 0) error("Call with wrong number of arguments", body); return ((Symbol)body).fn.op0(); } public LispObject op1(LispObject a1) throws Exception { if (((nargs>>4) & 0xf) != 1) error("Call with wrong number of arguments", body); if ((nargs & 0xf) == 0) return ((Symbol)body).fn.op0(); else return ((Symbol)body).fn.op1(a1); } public LispObject op2(LispObject a1, LispObject a2) throws Exception { if (((nargs>>4) & 0xf) != 2) error("Call with wrong number of arguments", body); switch ((nargs & 0xf)) { case 0: return ((Symbol)body).fn.op0(); case 1: return ((Symbol)body).fn.op1(a1); default:return ((Symbol)body).fn.op2(a1, a2); } } public LispObject opn(LispObject [] args) throws Exception { if (((nargs>>4) & 0xf) != args.length) error("Call with wrong number of arguments", body); switch ((nargs & 0xf)) { case 0: return ((Symbol)body).fn.op0(); case 1: return ((Symbol)body).fn.op1(args[0]); case 2: return ((Symbol)body).fn.op2(args[0], args[1]); default:return ((Symbol)body).fn.opn( new LispObject [] { args[0], args[1], args[2] }); } } 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_CALLAS); Jlisp.odump.write(nargs); Jlisp.stack.push(body); } } } // End of CallAs.java