public void VerifyISeqRestMaintainsMeta(ISeq s) { IPersistentMap meta = ((IMeta)s).meta(); for (; s.rest() != null; s = s.rest()) Expect(((IMeta)s.rest()).meta(), EqualTo(meta)); }
/// <summary> /// Create a <see cref="PersistentHashSet">PersistentHashSet</see> initialized from an <see cref="ISeq">ISeq</see> of items. /// </summary> /// <param name="items">An <see cref="ISeq">ISeq</see> of items</param> /// <returns>A <see cref="PersistentHashSet">PersistentHashSet</see>.</returns> public static PersistentHashSet create(ISeq items) { PersistentHashSet ret = EMPTY; for (; items != null; items = items.rest()) ret = (PersistentHashSet)ret.cons(items.first()); return ret; }
public void VerifyISeqContents(ISeq s, IList<object> values) { int i=0; for (; s != null; s = s.rest(), i++) Expect(s.first(), EqualTo(values[i])); Expect(i, EqualTo(values.Count)); }
/// <summary> /// Create a struct from a struct definition and values (in order) for the fixed keys. /// </summary> /// <param name="def">A struct definition</param> /// <param name="valseq">A sequence of values for the fixed keys (in definition order).</param> /// <returns>A <see cref="PersistentStructMap">PersistentStructMap</see>.</returns> public static PersistentStructMap construct(Def def, ISeq valseq) { object[] vals = new object[def.Keyslots.count()]; IPersistentMap ext = PersistentHashMap.EMPTY; for (int i = 0; i < vals.Length && valseq != null; valseq = valseq.rest(), i++) { vals[i] = valseq.first(); } if (valseq != null) throw new ArgumentException("Too many arguments to struct constructor"); return new PersistentStructMap(null, def, vals, ext); }
private static ISeq sqExpandList(ISeq seq) { IPersistentVector ret = PersistentVector.EMPTY; for (; seq != null; seq = seq.rest()) { Object item = seq.first(); //if (item is Unquote) // ret = ret.cons(RT.list(LIST, ((Unquote)item).Obj)); // REV 1184 if (isUnquote(item)) ret = ret.cons(RT.list(LIST, RT.second(item))); else if (isUnquoteSplicing(item)) ret = ret.cons(RT.second(item)); else ret = ret.cons(RT.list(LIST, syntaxQuote(item))); } return ret.seq(); }
public void VerifyISeqRestTypes(ISeq s, Type type) { for ( ; s.rest() != null; s = s.rest()) Expect(s.rest(), InstanceOfType(type)); }
/// <summary> /// Create a <see cref="PersistentTreeMap">PersistentTreeMap</see> from a comparison method /// an <see cref="ISeq">ISeq</see> of alternating keys and values. /// </summary> /// <param name="comp">A comparison method.</param> /// <param name="items">The <see cref="ISeq">ISeq</see> of alternating keys and values.</param> /// <returns>A <see cref="PersistentTreeMap">PersistentTreeMap</see>.</returns> public static PersistentTreeMap create(IComparer comp, ISeq items) { IPersistentMap ret = new PersistentTreeMap(comp); for (; items != null; items = items.rest().rest()) { if (items.rest() == null) throw new ArgumentException(string.Format("No value supplied for key: %s", items.first())); ret = ret.assoc(items.first(), items.rest().first()); } return (PersistentTreeMap)ret; }
public static object ApplyToHelper(IFn ifn, ISeq arglist) { switch (RT.BoundedLength(arglist, 20)) { case 0: return ifn.invoke(); case 1: return ifn.invoke(arglist.first()); case 2: return ifn.invoke(arglist.first() , (arglist = arglist.rest()).first() ); case 3: return ifn.invoke(arglist.first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() ); case 4: return ifn.invoke(arglist.first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() ); case 5: return ifn.invoke(arglist.first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() ); case 6: return ifn.invoke(arglist.first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() ); case 7: return ifn.invoke(arglist.first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() ); case 8: return ifn.invoke(arglist.first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() ); case 9: return ifn.invoke(arglist.first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() ); case 10: return ifn.invoke(arglist.first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() ); case 11: return ifn.invoke(arglist.first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() ); case 12: return ifn.invoke(arglist.first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() ); case 13: return ifn.invoke(arglist.first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() ); case 14: return ifn.invoke(arglist.first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() ); case 15: return ifn.invoke(arglist.first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() ); case 16: return ifn.invoke(arglist.first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() ); case 17: return ifn.invoke(arglist.first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() ); case 18: return ifn.invoke(arglist.first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() ); case 19: return ifn.invoke(arglist.first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() ); case 20: return ifn.invoke(arglist.first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() ); default: return ifn.invoke(arglist.first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , (arglist = arglist.rest()).first() , RT.SeqToArray<object>(arglist.rest())); } }
// Don't do what I did the first time: Evaluate the forms/assignments sequentially. // Need to evaluate all the forms, then assign them. private static Expression GenerateRecurExpr(ISeq form) { IPersistentVector loopLocals = (IPersistentVector) LOOP_LOCALS.deref(); if ( IN_TAIL_POSITION.deref() == null || loopLocals == null ) throw new InvalidOperationException("Can only recur from tail position"); if (IN_CATCH_FINALLY.deref() != null) throw new InvalidOperationException("Cannot recur from catch/finally."); IPersistentVector args = PersistentVector.EMPTY; for ( ISeq s = form.rest(); s != null; s = s.rest() ) args = args.cons(Generate(s.first())); if ( args.count() != loopLocals.count()) throw new ArgumentException(string.Format("Mismatched argument count to recur, expected: {0} args, got {1}",loopLocals.count(),args.count())); LabelTarget loopLabel = (LabelTarget)LOOP_LABEL.deref(); if (loopLabel == null) throw new InvalidOperationException("Recur not in proper context."); int argCount = args.count(); List<ParameterExpression> tempVars = new List<ParameterExpression>(argCount); List<Expression> tempAssigns = new List<Expression>(2 * argCount+1); List<Expression> finalAssigns = new List<Expression>(argCount); // Evaluate all the init forms into local variables. for ( int i=0; i<loopLocals.count(); i++ ) { LocalBinding b = (LocalBinding)loopLocals.nth(i); ParameterExpression tempVar = Expression.Parameter(b.ParamExpression.Type, "local" + i); //asdf-tag Expression arg = (Expression) args.nth(i); tempVars.Add(tempVar); if ( tempVar.Type == typeof(Object) ) tempAssigns.Add(Expression.Assign(tempVar,MaybeBox(arg))); else tempAssigns.Add(Expression.Assign(tempVar, Expression.Convert(arg, tempVar.Type))); //asdf-tag finalAssigns.Add(Expression.Assign(b.ParamExpression, tempVar)); //asdf-tag } List<Expression> exprs = tempAssigns; exprs.AddRange(finalAssigns); exprs.Add(Expression.Goto(loopLabel)); // need to do this to get a return value in the type inferencing -- else can't use this in a then or else clause. exprs.Add(Expression.Constant(null)); return Expression.Block(tempVars,exprs); }
public override object applyTo(ISeq args) { if (RT.BoundedLength(args, _reqArity) <= _reqArity) return base.applyTo(args); switch (_reqArity) { case 0: return doInvoke(args); case 1: return doInvoke(args.first() , args.rest()); case 2: return doInvoke(args.first() , (args = args.rest()).first() , args.rest()); case 3: return doInvoke(args.first() , (args = args.rest()).first() , (args = args.rest()).first() , args.rest()); case 4: return doInvoke(args.first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , args.rest()); case 5: return doInvoke(args.first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , args.rest()); case 6: return doInvoke(args.first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , args.rest()); case 7: return doInvoke(args.first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , args.rest()); case 8: return doInvoke(args.first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , args.rest()); case 9: return doInvoke(args.first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , args.rest()); case 10: return doInvoke(args.first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , args.rest()); case 11: return doInvoke(args.first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , args.rest()); case 12: return doInvoke(args.first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , args.rest()); case 13: return doInvoke(args.first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , args.rest()); case 14: return doInvoke(args.first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , args.rest()); case 15: return doInvoke(args.first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , args.rest()); case 16: return doInvoke(args.first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , args.rest()); case 17: return doInvoke(args.first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , args.rest()); case 18: return doInvoke(args.first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , args.rest()); case 19: return doInvoke(args.first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , args.rest()); case 20: return doInvoke(args.first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , (args = args.rest()).first() , args.rest()); } throw WrongArityException(); }
// do we need this? protected static ISeq FindKey(object key, ISeq args) { while (args != null) { if (key == args.first()) return args.rest(); args = RT.rest(args); args = RT.rest(args); } return null; }
/// <summary> /// Create a <see cref="PersistentHashMap">PersistentHashMap</see> initialized from /// an <see cref="ISeq">ISeq</see> of alternating keys and values. /// </summary> /// <param name="items">An <see cref="ISeq">ISeq</see> of alternating keys and values.</param> /// <returns>A <see cref="PersistentHashMap">PersistentHashMap</see>.</returns> public static PersistentHashMap create(ISeq items) { IPersistentMap ret = EMPTY; for ( ; items != null; items = items.rest().rest() ) { if ( items.rest() == null ) throw new ArgumentException(String.Format("No value supplied for key: {0}", items.first())); ret = ret.assoc(items.first(), items.rest().first() ); } return (PersistentHashMap)ret; }
private static Expression GenerateInvoke(ISeq form) { Expression fn = Generate(form.first()); fn = Expression.Convert(fn,typeof(IFn)); ISeq s = RT.seq(form.rest()); int n = s == null ? 0 : s.count(); Expression[] args = new Expression[n]; for (int i = 0; s != null; s = s.rest(), i++) args[i] = MaybeBox(Generate(s.first())); Type returnType = ComputeInvocationReturnType(form.first(), form); Expression call = GenerateInvocation(returnType, fn, args); return call; }
internal void ComputeNames(ISeq form) { MethodDef enclosingMethod = (MethodDef)METHODS.deref(); string baseName = enclosingMethod != null ? (enclosingMethod.Fn.Name + "$") : (munge(CurrentNamespace.Name.Name) + "$"); if (form.rest().first() is Symbol) _thisName = ((Symbol)form.rest().first()).Name; _simpleName = (_thisName == null ? "fn" : munge(_thisName).Replace(".","_DOT_")); _name = baseName + _simpleName; _internalName = _name.Replace('.','/'); // fn.fntype = Type.getObjectType(fn.internalName) -- JAVA }
private static object MacroexpandSeq1(ISeq form) { object op = RT.first(form); if (Compiler.isSpecial(op)) return form; // macro expansion Var v = IsMacro(op); if (v != null) { try { Var.pushThreadBindings(RT.map(RT.MACRO_META, RT.meta(form))); return v.applyTo(form.rest()); } finally { Var.popThreadBindings(); } } else { if (op is Symbol) { Symbol sym = (Symbol)op; string sname = sym.Name; // (.substring s 2 5) => (. x substring 2 5) if (sname[0] == '.') { if (form.count() < 2) throw new ArgumentException("Malformed member expression, expecting (.member target ...)"); Symbol method = Symbol.intern(sname.Substring(1)); // TODO: Figure out why the following change made in Java Rev 1158 breaks ants.clj // Note on that revision: force instance member interpretation of (.method ClassName), e.g. (.getMethods String) works // However, when I do this, it makes ants.clj choke on: (def white-brush (new SolidBrush (.White Color))) //object target = Second(form); //if (MaybeType(target, false) != null) // target = RT.list(Compiler.IDENTITY, target); //return RT.listStar(Compiler.DOT, target, method, form.rest().rest()); return RT.listStar(Compiler.DOT, RT.second(form), method, form.rest().rest()); } else if (NamesStaticMember(sym)) { Symbol target = Symbol.intern(sym.Namespace); Type t = MaybeType(target, false); if (t != null) { Symbol method = Symbol.intern(sym.Name); return RT.listStar(Compiler.DOT, target, method, form.rest()); } } else { // (x.substring 2 5) => (. s substring 2 5) int index = sname.LastIndexOf('.'); if (index == sname.Length - 1) return RT.listStar(Compiler.NEW, Symbol.intern(sname.Substring(0, index)), form.rest()); } } } return form; }
// DLR TryStatement has void type, so we must wrap it in a scope // that has a target to return to. private static Expression GenerateTryExpr(ISeq form) { // (try try-expr* catch-expr* finall-expr?) // catch-expr: (catch classname sym expr*) // finally-expr: (finally expr*) IPersistentVector body = PersistentVector.EMPTY; List<CatchBlock> catches = new List<CatchBlock>(); Expression finallyExpr = null; bool caught = false; for ( ISeq fs = form.rest(); fs != null; fs = fs.rest() ) { object f = fs.first(); object op = (f is ISeq) ? ((ISeq)f).first() : null; if (!Compiler.CATCH.Equals(op) && !Compiler.FINALLY.Equals(op)) { if ( caught ) throw new Exception("Only catch or finally clause can follow catch in try expression"); body = body.cons(f); } else { if (Compiler.CATCH.Equals(op)) { ISeq f1 = f as ISeq; Type t = MaybeType(RT.second(f1),false); if ( t == null ) throw new ArgumentException("Unable to resolve classname: " + RT.second(form)); if ( ! (RT.third(f1) is Symbol )) throw new ArgumentException("Bad binding form, expected symbol, got: " + RT.third(f1)); Symbol sym = (Symbol) RT.third(f1); if ( sym.Namespace != null ) throw new Exception("Can't bind qualified name: " + sym); IPersistentMap dynamicBindings = RT.map( LOCAL_ENV, LOCAL_ENV.deref(), IN_CATCH_FINALLY, RT.T); try { Var.pushThreadBindings(dynamicBindings); LocalBinding lb = RegisterLocal(sym, (Symbol)(RT.second(f1) is Symbol ? RT.second(f1) : null), null); ParameterExpression exParam = Expression.Parameter(typeof(object),sym.Name); //asdf-tag lb.ParamExpression = exParam; Expression handler = GenerateBodyExpr(f1.rest().rest().rest()); catches.Add(Expression.Catch(t, exParam, handler)); } finally { Var.popThreadBindings(); } caught = true; } else // finally { if ( fs.rest() != null ) throw new Exception("finally clause must be last in try expression"); try { Var.pushThreadBindings(RT.map(IN_CATCH_FINALLY,RT.T)); finallyExpr = GenerateBodyExpr(RT.rest(f)); } finally { Var.popThreadBindings(); } } } } Expression basicBody = GenerateBodyExpr(body.seq()); // Wrap the basic body, a Comma, in a return to a label LabelTarget target = Expression.Label(basicBody.Type, "ret_label"); Expression tryBody = Expression.Return(target, basicBody); TryExpression tryStmt = finallyExpr == null ? Expression.TryCatch(tryBody,catches.ToArray()) : Expression.TryCatchFinally(tryBody, finallyExpr, catches.ToArray()); // TODO: What if basicBody.Type is typeof(void)? What if Enum? //Expression defaultValue = basicBody.Type.IsValueType ? Expression.Constant(0, basicBody.Type) : Expression.Null(basicBody.Type); Expression defaultValue = Expression.Default(basicBody.Type); Expression whole = Expression.Block(tryStmt, Expression.Label(target, defaultValue)); return whole; }
/// <summary> /// Create a struct from a struct definition and a sequence of alternating keys and values. /// </summary> /// <param name="def">The struct definition</param> /// <param name="keyvals">A sequence of alternating keys and values.</param> /// <returns>A <see cref="PersistentStructMap">PersistentStructMap</see>.</returns> public static PersistentStructMap create(Def def, ISeq keyvals) { object[] vals = new object[def.Keyslots.count()]; IPersistentMap ext = PersistentHashMap.EMPTY; for (; keyvals != null; keyvals = keyvals.rest().rest()) { if (keyvals.rest() == null) throw new ArgumentException(String.Format("No value supplied for key: {0}", keyvals.first())); object k = keyvals.first(); object v = keyvals.rest().first(); IMapEntry me = def.Keyslots.entryAt(k); if (me != null) vals[Util.ConvertToInt(me.val())] = v; else ext = ext.assoc(k, v); } return new PersistentStructMap(null, def, vals, ext); }
private static Expression GenerateQuoteExpr(ISeq form) { object v = form.rest().first(); return v == null ? GenerateNilExpr() : GenerateConstExpr(v); }