| 415 | } |
| 416 | |
| 417 | static class DefExpr implements Expr{ |
| 418 | public final Var var; |
| 419 | public final Expr init; |
| 420 | public final Expr meta; |
| 421 | public final boolean initProvided; |
| 422 | public final boolean isDynamic; |
| 423 | public final String source; |
| 424 | public final int line; |
| 425 | public final int column; |
| 426 | final static Method bindRootMethod = Method.getMethod("void bindRoot(Object)"); |
| 427 | final static Method setTagMethod = Method.getMethod("void setTag(clojure.lang.Symbol)"); |
| 428 | final static Method setMetaMethod = Method.getMethod("void setMeta(clojure.lang.IPersistentMap)"); |
| 429 | final static Method setDynamicMethod = Method.getMethod("clojure.lang.Var setDynamic(boolean)"); |
| 430 | final static Method symintern = Method.getMethod("clojure.lang.Symbol intern(String, String)"); |
| 431 | |
| 432 | public DefExpr(String source, int line, int column, Var var, Expr init, Expr meta, boolean initProvided, boolean isDynamic){ |
| 433 | this.source = source; |
| 434 | this.line = line; |
| 435 | this.column = column; |
| 436 | this.var = var; |
| 437 | this.init = init; |
| 438 | this.meta = meta; |
| 439 | this.isDynamic = isDynamic; |
| 440 | this.initProvided = initProvided; |
| 441 | } |
| 442 | |
| 443 | private boolean includesExplicitMetadata(MapExpr expr) { |
| 444 | for(int i=0; i < expr.keyvals.count(); i += 2) |
| 445 | { |
| 446 | Keyword k = ((KeywordExpr) expr.keyvals.nth(i)).k; |
| 447 | if ((k != RT.FILE_KEY) && |
| 448 | (k != RT.DECLARED_KEY) && |
| 449 | (k != RT.LINE_KEY) && |
| 450 | (k != RT.COLUMN_KEY)) |
| 451 | return true; |
| 452 | } |
| 453 | return false; |
| 454 | } |
| 455 | |
| 456 | public Object eval() { |
| 457 | try |
| 458 | { |
| 459 | if(initProvided) |
| 460 | { |
| 461 | // if(init instanceof FnExpr && ((FnExpr) init).closes.count()==0) |
| 462 | // var.bindRoot(new FnLoaderThunk((FnExpr) init,var)); |
| 463 | // else |
| 464 | var.bindRoot(init.eval()); |
| 465 | } |
| 466 | if(meta != null) |
| 467 | { |
| 468 | IPersistentMap metaMap = (IPersistentMap) meta.eval(); |
| 469 | if (initProvided || true)//includesExplicitMetadata((MapExpr) meta)) |
| 470 | var.setMeta(metaMap); |
| 471 | } |
| 472 | return var.setDynamic(isDynamic); |
| 473 | } |
| 474 | catch(Throwable e) |