annotate src/clojure/lang/Var.java @ 10:ef7dbbd6452c

added clojure source goodness
author Robert McIntyre <rlm@mit.edu>
date Sat, 21 Aug 2010 06:25:44 -0400
parents
children
rev   line source
rlm@10 1 /**
rlm@10 2 * Copyright (c) Rich Hickey. All rights reserved.
rlm@10 3 * The use and distribution terms for this software are covered by the
rlm@10 4 * Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php)
rlm@10 5 * which can be found in the file epl-v10.html at the root of this distribution.
rlm@10 6 * By using this software in any fashion, you are agreeing to be bound by
rlm@10 7 * the terms of this license.
rlm@10 8 * You must not remove this notice, or any other, from this software.
rlm@10 9 **/
rlm@10 10
rlm@10 11 /* rich Jul 31, 2007 */
rlm@10 12
rlm@10 13 package clojure.lang;
rlm@10 14
rlm@10 15 import java.util.concurrent.atomic.AtomicInteger;
rlm@10 16
rlm@10 17
rlm@10 18 public final class Var extends ARef implements IFn, IRef, Settable{
rlm@10 19
rlm@10 20
rlm@10 21 static class Frame{
rlm@10 22 //Var->Box
rlm@10 23 Associative bindings;
rlm@10 24 //Var->val
rlm@10 25 Associative frameBindings;
rlm@10 26 Frame prev;
rlm@10 27
rlm@10 28
rlm@10 29 public Frame(){
rlm@10 30 this(PersistentHashMap.EMPTY, PersistentHashMap.EMPTY, null);
rlm@10 31 }
rlm@10 32
rlm@10 33 public Frame(Associative frameBindings, Associative bindings, Frame prev){
rlm@10 34 this.frameBindings = frameBindings;
rlm@10 35 this.bindings = bindings;
rlm@10 36 this.prev = prev;
rlm@10 37 }
rlm@10 38 }
rlm@10 39
rlm@10 40 static ThreadLocal<Frame> dvals = new ThreadLocal<Frame>(){
rlm@10 41
rlm@10 42 protected Frame initialValue(){
rlm@10 43 return new Frame();
rlm@10 44 }
rlm@10 45 };
rlm@10 46
rlm@10 47 static Keyword privateKey = Keyword.intern(null, "private");
rlm@10 48 static IPersistentMap privateMeta = new PersistentArrayMap(new Object[]{privateKey, Boolean.TRUE});
rlm@10 49 static Keyword macroKey = Keyword.intern(null, "macro");
rlm@10 50 static Keyword nameKey = Keyword.intern(null, "name");
rlm@10 51 static Keyword nsKey = Keyword.intern(null, "ns");
rlm@10 52 //static Keyword tagKey = Keyword.intern(null, "tag");
rlm@10 53
rlm@10 54 volatile Object root;
rlm@10 55 transient final AtomicInteger count;
rlm@10 56 public final Symbol sym;
rlm@10 57 public final Namespace ns;
rlm@10 58
rlm@10 59 //IPersistentMap _meta;
rlm@10 60
rlm@10 61 public static Var intern(Namespace ns, Symbol sym, Object root){
rlm@10 62 return intern(ns, sym, root, true);
rlm@10 63 }
rlm@10 64
rlm@10 65 public static Var intern(Namespace ns, Symbol sym, Object root, boolean replaceRoot){
rlm@10 66 Var dvout = ns.intern(sym);
rlm@10 67 if(!dvout.hasRoot() || replaceRoot)
rlm@10 68 dvout.bindRoot(root);
rlm@10 69 return dvout;
rlm@10 70 }
rlm@10 71
rlm@10 72
rlm@10 73 public String toString(){
rlm@10 74 if(ns != null)
rlm@10 75 return "#'" + ns.name + "/" + sym;
rlm@10 76 return "#<Var: " + (sym != null ? sym.toString() : "--unnamed--") + ">";
rlm@10 77 }
rlm@10 78
rlm@10 79 public static Var find(Symbol nsQualifiedSym){
rlm@10 80 if(nsQualifiedSym.ns == null)
rlm@10 81 throw new IllegalArgumentException("Symbol must be namespace-qualified");
rlm@10 82 Namespace ns = Namespace.find(Symbol.create(nsQualifiedSym.ns));
rlm@10 83 if(ns == null)
rlm@10 84 throw new IllegalArgumentException("No such namespace: " + nsQualifiedSym.ns);
rlm@10 85 return ns.findInternedVar(Symbol.create(nsQualifiedSym.name));
rlm@10 86 }
rlm@10 87
rlm@10 88 public static Var intern(Symbol nsName, Symbol sym){
rlm@10 89 Namespace ns = Namespace.findOrCreate(nsName);
rlm@10 90 return intern(ns, sym);
rlm@10 91 }
rlm@10 92
rlm@10 93 public static Var internPrivate(String nsName, String sym){
rlm@10 94 Namespace ns = Namespace.findOrCreate(Symbol.intern(nsName));
rlm@10 95 Var ret = intern(ns, Symbol.intern(sym));
rlm@10 96 ret.setMeta(privateMeta);
rlm@10 97 return ret;
rlm@10 98 }
rlm@10 99
rlm@10 100 public static Var intern(Namespace ns, Symbol sym){
rlm@10 101 return ns.intern(sym);
rlm@10 102 }
rlm@10 103
rlm@10 104
rlm@10 105 public static Var create(){
rlm@10 106 return new Var(null, null);
rlm@10 107 }
rlm@10 108
rlm@10 109 public static Var create(Object root){
rlm@10 110 return new Var(null, null, root);
rlm@10 111 }
rlm@10 112
rlm@10 113 Var(Namespace ns, Symbol sym){
rlm@10 114 this.ns = ns;
rlm@10 115 this.sym = sym;
rlm@10 116 this.count = new AtomicInteger();
rlm@10 117 this.root = dvals; //use dvals as magic not-bound value
rlm@10 118 setMeta(PersistentHashMap.EMPTY);
rlm@10 119 }
rlm@10 120
rlm@10 121 Var(Namespace ns, Symbol sym, Object root){
rlm@10 122 this(ns, sym);
rlm@10 123 this.root = root;
rlm@10 124 }
rlm@10 125
rlm@10 126 public boolean isBound(){
rlm@10 127 return hasRoot() || (count.get() > 0 && dvals.get().bindings.containsKey(this));
rlm@10 128 }
rlm@10 129
rlm@10 130 final public Object get(){
rlm@10 131 if(count.get() == 0 && root != dvals)
rlm@10 132 return root;
rlm@10 133 return deref();
rlm@10 134 }
rlm@10 135
rlm@10 136 final public Object deref(){
rlm@10 137 Box b = getThreadBinding();
rlm@10 138 if(b != null)
rlm@10 139 return b.val;
rlm@10 140 if(hasRoot())
rlm@10 141 return root;
rlm@10 142 throw new IllegalStateException(String.format("Var %s/%s is unbound.", ns, sym));
rlm@10 143 }
rlm@10 144
rlm@10 145 public void setValidator(IFn vf){
rlm@10 146 if(hasRoot())
rlm@10 147 validate(vf, getRoot());
rlm@10 148 validator = vf;
rlm@10 149 }
rlm@10 150
rlm@10 151 public Object alter(IFn fn, ISeq args) throws Exception{
rlm@10 152 set(fn.applyTo(RT.cons(deref(), args)));
rlm@10 153 return this;
rlm@10 154 }
rlm@10 155
rlm@10 156 public Object set(Object val){
rlm@10 157 validate(getValidator(), val);
rlm@10 158 Box b = getThreadBinding();
rlm@10 159 if(b != null)
rlm@10 160 return (b.val = val);
rlm@10 161 //jury still out on this
rlm@10 162 // if(hasRoot())
rlm@10 163 // {
rlm@10 164 // bindRoot(val);
rlm@10 165 // return val;
rlm@10 166 // }
rlm@10 167 throw new IllegalStateException(String.format("Can't change/establish root binding of: %s with set", sym));
rlm@10 168 }
rlm@10 169
rlm@10 170 public Object doSet(Object val) throws Exception {
rlm@10 171 return set(val);
rlm@10 172 }
rlm@10 173
rlm@10 174 public Object doReset(Object val) throws Exception {
rlm@10 175 bindRoot(val);
rlm@10 176 return val;
rlm@10 177 }
rlm@10 178
rlm@10 179 public void setMeta(IPersistentMap m) {
rlm@10 180 //ensure these basis keys
rlm@10 181 resetMeta(m.assoc(nameKey, sym).assoc(nsKey, ns));
rlm@10 182 }
rlm@10 183
rlm@10 184 public void setMacro() {
rlm@10 185 try
rlm@10 186 {
rlm@10 187 alterMeta(assoc, RT.list(macroKey, RT.T));
rlm@10 188 }
rlm@10 189 catch (Exception e)
rlm@10 190 {
rlm@10 191 throw new RuntimeException(e);
rlm@10 192 }
rlm@10 193 }
rlm@10 194
rlm@10 195 public boolean isMacro(){
rlm@10 196 return RT.booleanCast(meta().valAt(macroKey));
rlm@10 197 }
rlm@10 198
rlm@10 199 //public void setExported(boolean state){
rlm@10 200 // _meta = _meta.assoc(privateKey, state);
rlm@10 201 //}
rlm@10 202
rlm@10 203 public boolean isPublic(){
rlm@10 204 return !RT.booleanCast(meta().valAt(privateKey));
rlm@10 205 }
rlm@10 206
rlm@10 207 public Object getRoot(){
rlm@10 208 if(hasRoot())
rlm@10 209 return root;
rlm@10 210 throw new IllegalStateException(String.format("Var %s/%s is unbound.", ns, sym));
rlm@10 211 }
rlm@10 212
rlm@10 213 public Object getRawRoot(){
rlm@10 214 return root;
rlm@10 215 }
rlm@10 216
rlm@10 217 public Object getTag(){
rlm@10 218 return meta().valAt(RT.TAG_KEY);
rlm@10 219 }
rlm@10 220
rlm@10 221 public void setTag(Symbol tag) {
rlm@10 222 try
rlm@10 223 {
rlm@10 224 alterMeta(assoc, RT.list(RT.TAG_KEY, tag));
rlm@10 225 }
rlm@10 226 catch (Exception e)
rlm@10 227 {
rlm@10 228 throw new RuntimeException(e);
rlm@10 229 }
rlm@10 230 }
rlm@10 231
rlm@10 232 final public boolean hasRoot(){
rlm@10 233 return root != dvals;
rlm@10 234 }
rlm@10 235
rlm@10 236 //binding root always clears macro flag
rlm@10 237 synchronized public void bindRoot(Object root){
rlm@10 238 validate(getValidator(), root);
rlm@10 239 Object oldroot = hasRoot()?this.root:null;
rlm@10 240 this.root = root;
rlm@10 241 try
rlm@10 242 {
rlm@10 243 alterMeta(dissoc, RT.list(macroKey));
rlm@10 244 }
rlm@10 245 catch (Exception e)
rlm@10 246 {
rlm@10 247 throw new RuntimeException(e);
rlm@10 248 }
rlm@10 249 notifyWatches(oldroot,this.root);
rlm@10 250 }
rlm@10 251
rlm@10 252 synchronized void swapRoot(Object root){
rlm@10 253 validate(getValidator(), root);
rlm@10 254 Object oldroot = hasRoot()?this.root:null;
rlm@10 255 this.root = root;
rlm@10 256 notifyWatches(oldroot,root);
rlm@10 257 }
rlm@10 258
rlm@10 259 synchronized public void unbindRoot(){
rlm@10 260 this.root = dvals;
rlm@10 261 }
rlm@10 262
rlm@10 263 synchronized public void commuteRoot(IFn fn) throws Exception{
rlm@10 264 Object newRoot = fn.invoke(root);
rlm@10 265 validate(getValidator(), newRoot);
rlm@10 266 Object oldroot = getRoot();
rlm@10 267 this.root = newRoot;
rlm@10 268 notifyWatches(oldroot,newRoot);
rlm@10 269 }
rlm@10 270
rlm@10 271 synchronized public Object alterRoot(IFn fn, ISeq args) throws Exception{
rlm@10 272 Object newRoot = fn.applyTo(RT.cons(root, args));
rlm@10 273 validate(getValidator(), newRoot);
rlm@10 274 Object oldroot = getRoot();
rlm@10 275 this.root = newRoot;
rlm@10 276 notifyWatches(oldroot,newRoot);
rlm@10 277 return newRoot;
rlm@10 278 }
rlm@10 279
rlm@10 280 public static void pushThreadBindings(Associative bindings){
rlm@10 281 Frame f = dvals.get();
rlm@10 282 Associative bmap = f.bindings;
rlm@10 283 for(ISeq bs = bindings.seq(); bs != null; bs = bs.next())
rlm@10 284 {
rlm@10 285 IMapEntry e = (IMapEntry) bs.first();
rlm@10 286 Var v = (Var) e.key();
rlm@10 287 v.validate(v.getValidator(), e.val());
rlm@10 288 v.count.incrementAndGet();
rlm@10 289 bmap = bmap.assoc(v, new Box(e.val()));
rlm@10 290 }
rlm@10 291 dvals.set(new Frame(bindings, bmap, f));
rlm@10 292 }
rlm@10 293
rlm@10 294 public static void popThreadBindings(){
rlm@10 295 Frame f = dvals.get();
rlm@10 296 if(f.prev == null)
rlm@10 297 throw new IllegalStateException("Pop without matching push");
rlm@10 298 for(ISeq bs = RT.keys(f.frameBindings); bs != null; bs = bs.next())
rlm@10 299 {
rlm@10 300 Var v = (Var) bs.first();
rlm@10 301 v.count.decrementAndGet();
rlm@10 302 }
rlm@10 303 dvals.set(f.prev);
rlm@10 304 }
rlm@10 305
rlm@10 306 public static void releaseThreadBindings(){
rlm@10 307 Frame f = dvals.get();
rlm@10 308 if(f.prev == null)
rlm@10 309 throw new IllegalStateException("Release without full unwind");
rlm@10 310 for(ISeq bs = RT.keys(f.bindings); bs != null; bs = bs.next())
rlm@10 311 {
rlm@10 312 Var v = (Var) bs.first();
rlm@10 313 v.count.decrementAndGet();
rlm@10 314 }
rlm@10 315 dvals.set(null);
rlm@10 316 }
rlm@10 317
rlm@10 318 public static Associative getThreadBindings(){
rlm@10 319 Frame f = dvals.get();
rlm@10 320 IPersistentMap ret = PersistentHashMap.EMPTY;
rlm@10 321 for(ISeq bs = f.bindings.seq(); bs != null; bs = bs.next())
rlm@10 322 {
rlm@10 323 IMapEntry e = (IMapEntry) bs.first();
rlm@10 324 Var v = (Var) e.key();
rlm@10 325 Box b = (Box) e.val();
rlm@10 326 ret = ret.assoc(v, b.val);
rlm@10 327 }
rlm@10 328 return ret;
rlm@10 329 }
rlm@10 330
rlm@10 331 public final Box getThreadBinding(){
rlm@10 332 if(count.get() > 0)
rlm@10 333 {
rlm@10 334 IMapEntry e = dvals.get().bindings.entryAt(this);
rlm@10 335 if(e != null)
rlm@10 336 return (Box) e.val();
rlm@10 337 }
rlm@10 338 return null;
rlm@10 339 }
rlm@10 340
rlm@10 341 final public IFn fn(){
rlm@10 342 return (IFn) deref();
rlm@10 343 }
rlm@10 344
rlm@10 345 public Object call() throws Exception{
rlm@10 346 return invoke();
rlm@10 347 }
rlm@10 348
rlm@10 349 public void run(){
rlm@10 350 try
rlm@10 351 {
rlm@10 352 invoke();
rlm@10 353 }
rlm@10 354 catch(Exception e)
rlm@10 355 {
rlm@10 356 throw new RuntimeException(e);
rlm@10 357 }
rlm@10 358 }
rlm@10 359
rlm@10 360 public Object invoke() throws Exception{
rlm@10 361 return fn().invoke();
rlm@10 362 }
rlm@10 363
rlm@10 364 public Object invoke(Object arg1) throws Exception{
rlm@10 365 return fn().invoke(arg1);
rlm@10 366 }
rlm@10 367
rlm@10 368 public Object invoke(Object arg1, Object arg2) throws Exception{
rlm@10 369 return fn().invoke(arg1, arg2);
rlm@10 370 }
rlm@10 371
rlm@10 372 public Object invoke(Object arg1, Object arg2, Object arg3) throws Exception{
rlm@10 373 return fn().invoke(arg1, arg2, arg3);
rlm@10 374 }
rlm@10 375
rlm@10 376 public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4) throws Exception{
rlm@10 377 return fn().invoke(arg1, arg2, arg3, arg4);
rlm@10 378 }
rlm@10 379
rlm@10 380 public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4, Object arg5) throws Exception{
rlm@10 381 return fn().invoke(arg1, arg2, arg3, arg4, arg5);
rlm@10 382 }
rlm@10 383
rlm@10 384 public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6) throws Exception{
rlm@10 385 return fn().invoke(arg1, arg2, arg3, arg4, arg5, arg6);
rlm@10 386 }
rlm@10 387
rlm@10 388 public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6, Object arg7)
rlm@10 389 throws Exception{
rlm@10 390 return fn().invoke(arg1, arg2, arg3, arg4, arg5, arg6, arg7);
rlm@10 391 }
rlm@10 392
rlm@10 393 public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6, Object arg7,
rlm@10 394 Object arg8) throws Exception{
rlm@10 395 return fn().invoke(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8);
rlm@10 396 }
rlm@10 397
rlm@10 398 public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6, Object arg7,
rlm@10 399 Object arg8, Object arg9) throws Exception{
rlm@10 400 return fn().invoke(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9);
rlm@10 401 }
rlm@10 402
rlm@10 403 public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6, Object arg7,
rlm@10 404 Object arg8, Object arg9, Object arg10) throws Exception{
rlm@10 405 return fn().invoke(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10);
rlm@10 406 }
rlm@10 407
rlm@10 408 public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6, Object arg7,
rlm@10 409 Object arg8, Object arg9, Object arg10, Object arg11) throws Exception{
rlm@10 410 return fn().invoke(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11);
rlm@10 411 }
rlm@10 412
rlm@10 413 public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6, Object arg7,
rlm@10 414 Object arg8, Object arg9, Object arg10, Object arg11, Object arg12) throws Exception{
rlm@10 415 return fn().invoke(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12);
rlm@10 416 }
rlm@10 417
rlm@10 418 public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6, Object arg7,
rlm@10 419 Object arg8, Object arg9, Object arg10, Object arg11, Object arg12, Object arg13)
rlm@10 420 throws Exception{
rlm@10 421 return fn().invoke(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13);
rlm@10 422 }
rlm@10 423
rlm@10 424 public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6, Object arg7,
rlm@10 425 Object arg8, Object arg9, Object arg10, Object arg11, Object arg12, Object arg13, Object arg14)
rlm@10 426 throws Exception{
rlm@10 427 return fn().invoke(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14);
rlm@10 428 }
rlm@10 429
rlm@10 430 public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6, Object arg7,
rlm@10 431 Object arg8, Object arg9, Object arg10, Object arg11, Object arg12, Object arg13, Object arg14,
rlm@10 432 Object arg15) throws Exception{
rlm@10 433 return fn().invoke(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15);
rlm@10 434 }
rlm@10 435
rlm@10 436 public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6, Object arg7,
rlm@10 437 Object arg8, Object arg9, Object arg10, Object arg11, Object arg12, Object arg13, Object arg14,
rlm@10 438 Object arg15, Object arg16) throws Exception{
rlm@10 439 return fn().invoke(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15,
rlm@10 440 arg16);
rlm@10 441 }
rlm@10 442
rlm@10 443 public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6, Object arg7,
rlm@10 444 Object arg8, Object arg9, Object arg10, Object arg11, Object arg12, Object arg13, Object arg14,
rlm@10 445 Object arg15, Object arg16, Object arg17) throws Exception{
rlm@10 446 return fn().invoke(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15,
rlm@10 447 arg16, arg17);
rlm@10 448 }
rlm@10 449
rlm@10 450 public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6, Object arg7,
rlm@10 451 Object arg8, Object arg9, Object arg10, Object arg11, Object arg12, Object arg13, Object arg14,
rlm@10 452 Object arg15, Object arg16, Object arg17, Object arg18) throws Exception{
rlm@10 453 return fn().invoke(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15,
rlm@10 454 arg16, arg17, arg18);
rlm@10 455 }
rlm@10 456
rlm@10 457 public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6, Object arg7,
rlm@10 458 Object arg8, Object arg9, Object arg10, Object arg11, Object arg12, Object arg13, Object arg14,
rlm@10 459 Object arg15, Object arg16, Object arg17, Object arg18, Object arg19) throws Exception{
rlm@10 460 return fn().invoke(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15,
rlm@10 461 arg16, arg17, arg18, arg19);
rlm@10 462 }
rlm@10 463
rlm@10 464 public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6, Object arg7,
rlm@10 465 Object arg8, Object arg9, Object arg10, Object arg11, Object arg12, Object arg13, Object arg14,
rlm@10 466 Object arg15, Object arg16, Object arg17, Object arg18, Object arg19, Object arg20)
rlm@10 467 throws Exception{
rlm@10 468 return fn().invoke(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15,
rlm@10 469 arg16, arg17, arg18, arg19, arg20);
rlm@10 470 }
rlm@10 471
rlm@10 472 public Object invoke(Object arg1, Object arg2, Object arg3, Object arg4, Object arg5, Object arg6, Object arg7,
rlm@10 473 Object arg8, Object arg9, Object arg10, Object arg11, Object arg12, Object arg13, Object arg14,
rlm@10 474 Object arg15, Object arg16, Object arg17, Object arg18, Object arg19, Object arg20,
rlm@10 475 Object... args)
rlm@10 476 throws Exception{
rlm@10 477 return fn().invoke(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12, arg13, arg14, arg15,
rlm@10 478 arg16, arg17, arg18, arg19, arg20, args);
rlm@10 479 }
rlm@10 480
rlm@10 481 public Object applyTo(ISeq arglist) throws Exception{
rlm@10 482 return AFn.applyToHelper(this, arglist);
rlm@10 483 }
rlm@10 484
rlm@10 485 static IFn assoc = new AFn(){
rlm@10 486 @Override
rlm@10 487 public Object invoke(Object m, Object k, Object v) throws Exception {
rlm@10 488 return RT.assoc(m, k, v);
rlm@10 489 }
rlm@10 490 };
rlm@10 491 static IFn dissoc = new AFn() {
rlm@10 492 @Override
rlm@10 493 public Object invoke(Object c, Object k) throws Exception {
rlm@10 494 return RT.dissoc(c, k);
rlm@10 495 }
rlm@10 496 };
rlm@10 497 }