| 1 package gnu.commonlisp.lang; 2 import gnu.mapping.*; 3 import gnu.expr.*; 4 import gnu.lists.*; 5 import kawa.lang.*; 6 7 public class function extends Syntax 8 { 9 Syntax lambda; 10 11 public function(Syntax lambda) 12 { 13 this.lambda = lambda; 14 } 15 16 public Expression rewriteForm (Pair form, Translator tr) 17 { 18 Object obj = form.cdr; 19 if (obj instanceof Pair) 20 { 21 Pair pair = (Pair) obj; 22 if (pair.cdr != LList.Empty) 23 return tr.syntaxError("too many forms after 'function'"); 24 Object name = pair.car; 25 if (name instanceof String || name instanceof Symbol) 26 { 27 ReferenceExp rexp = new ReferenceExp(name); 28 rexp.setProcedureName(true); 29 rexp.setFlag(ReferenceExp.PREFER_BINDING2); 30 return rexp; 31 } 32 if (name instanceof Pair) 33 { 34 pair = (Pair) name; 35 name = pair.car; 36 if (name instanceof String ? "lambda".equals(name) 37 : (name instanceof Symbol 38 && "lambda".equals(((Symbol) name).getName()))) 39 return lambda.rewriteForm(pair, tr); 40 } 41 } 42 return tr.syntaxError("function must be followed by name or lambda expression"); 43 } 44 } 45 | Popular Tags |