Mercurial > lasercutter
comparison src/clojure/lang/KeywordLookupSite.java @ 10:ef7dbbd6452c
added clojure source goodness
author | Robert McIntyre <rlm@mit.edu> |
---|---|
date | Sat, 21 Aug 2010 06:25:44 -0400 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
9:35cf337adfcf | 10:ef7dbbd6452c |
---|---|
1 /** | |
2 * Copyright (c) Rich Hickey. All rights reserved. | |
3 * The use and distribution terms for this software are covered by the | |
4 * Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php) | |
5 * which can be found in the file epl-v10.html at the root of this distribution. | |
6 * By using this software in any fashion, you are agreeing to be bound by | |
7 * the terms of this license. | |
8 * You must not remove this notice, or any other, from this software. | |
9 **/ | |
10 | |
11 /* rich Nov 2, 2009 */ | |
12 | |
13 package clojure.lang; | |
14 | |
15 public final class KeywordLookupSite implements ILookupSite, ILookupThunk{ | |
16 | |
17 final int n; | |
18 final Keyword k; | |
19 | |
20 public KeywordLookupSite(int n, Keyword k){ | |
21 this.n = n; | |
22 this.k = k; | |
23 } | |
24 | |
25 public Object fault(Object target, ILookupHost host){ | |
26 if(target instanceof IKeywordLookup) | |
27 { | |
28 return install(target, host); | |
29 } | |
30 else if(target instanceof ILookup) | |
31 { | |
32 host.swapThunk(n,ilookupThunk(target.getClass())); | |
33 return ((ILookup) target).valAt(k); | |
34 } | |
35 host.swapThunk(n,this); | |
36 return RT.get(target, k); | |
37 } | |
38 | |
39 public Object get(Object target){ | |
40 if(target instanceof IKeywordLookup || target instanceof ILookup) | |
41 return this; | |
42 return RT.get(target,k); | |
43 } | |
44 | |
45 private ILookupThunk ilookupThunk(final Class c){ | |
46 return new ILookupThunk(){ | |
47 public Object get(Object target){ | |
48 if(target != null && target.getClass() == c) | |
49 return ((ILookup) target).valAt(k); | |
50 return this; | |
51 } | |
52 }; | |
53 } | |
54 | |
55 private Object install(Object target, ILookupHost host){ | |
56 ILookupThunk t = ((IKeywordLookup)target).getLookupThunk(k); | |
57 if(t != null) | |
58 { | |
59 host.swapThunk(n,t); | |
60 return t.get(target); | |
61 } | |
62 host.swapThunk(n,ilookupThunk(target.getClass())); | |
63 return ((ILookup) target).valAt(k); | |
64 } | |
65 } |