Skip to content

Instantly share code, notes, and snippets.

@timmc
Created March 13, 2017 21:45
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save timmc/bef7b066ebdd54eb26dc04431cbe66f6 to your computer and use it in GitHub Desktop.
Save timmc/bef7b066ebdd54eb26dc04431cbe66f6 to your computer and use it in GitHub Desktop.
(= 5 2)
freenode/#clojure on 2014-04-21:
amalloy sets 5 to be 2 using reflection, probably in PM with clojurebot:
(let [field (nth (.getDeclaredFields Long) 3)] (.setAccessible field true) (.set field 5 2))
19:10 < amalloy> justin_smith: i think ''lovecraft should contain (alter-var-root #'defmacro (constantly (fn [& args] `(quote ~(rand-nth '#{various lovecraftian horrors|)))))
19:11 < justin_smith> ouch
19:11 < amalloy> or something like it, anyawy
19:11 < justin_smith> yeah
19:11 < justin_smith> maybe ''necronomicon would be the better name for it
19:13 < amalloy> or you could mutate one of the interned Number instances
19:13 < amalloy> really there are a lot of deep horrors you could put into a lovecraft library
19:14 < justin_smith> indeed
19:16 < justin_smith> stack traces generated using https://github.com/prismofeverything/zalgo
19:17 < rasmusto> forgive me: z̷̼͖̰̜̣͛̂̚͟ạ̶̹͔็l̀̄͌̈̐ͫg̉̊̐͑ͮͦȏ̉̏̿̿ͩ̓ï̞̗͓̮̮͙̃̄̚z̞̗͍̃͆̐͆͊̄̚e͗ͣ̔ͣ
19:17 < arrdem> justin_smith: what have you done...
19:17 < amalloy> huh. clojurebot's sandbox allows you to actually do what i just said
19:17 < amalloy> ,5
19:17 < clojurebot> 2
19:17 < justin_smith> woah...
19:17 < amalloy> i'll go put things back together now
19:18 * arrdem flees in terror
19:19 < amalloy> uhhhhhh, i can't put it back. 5 is 2 now. even if you add 1 and 4 you get 2. so there's no longer a 5 to reset 5 to
19:19 < amalloy> hopefully clojurebot's regular sandbox-resetting takes care of that
19:19 < rasmusto> ,(dec 5)
19:19 < clojurebot> 1
19:19 < arrdem> amalloy: what have you done...
19:19 < rasmusto> seems to work
19:19 < arrdem> ,(+ 3 5)
19:19 < clojurebot> 2
19:20 < justin_smith> rofl
19:20 < justin_smith> ,(= 5 2)
19:20 < clojurebot> true
19:20 < justin_smith> ROFL
19:20 < arrdem> I don't even have a gif for this level of wat...
19:20 < justin_smith> (inc amalloy)
19:20 < lazybot> ⇒ 101
19:20 < rasmusto> ,(range 6)
19:20 < clojurebot> #<IndexOutOfBoundsException java.lang.IndexOutOfBoundsException>
19:20 < arrdem> AHAHAHAHA
19:20 < rasmusto> what
19:20 < arrdem> (inc amalloy)
19:20 < lazybot> ⇒ 102
19:20 < justin_smith> lol
19:20 < justin_smith> (take 10 (range 6))
19:20 < justin_smith> ,(take 10 (range 6))
19:20 < clojurebot> #<IndexOutOfBoundsException java.lang.IndexOutOfBoundsException>
19:20 < arrdem> amalloy: I want to see the source for this...
19:20 < arrdem> ,6
19:20 < clojurebot> #<IndexOutOfBoundsException java.lang.IndexOutOfBoundsException>
19:21 < arrdem> WHAT THE hahaha
19:21 < amalloy> oh, it's not hard. (let [field (nth (.getDeclaredFields Long) 3)] (.setAccessible field true) (.set field 5 2))
19:21 < rasmusto> ,7 ;plz?
19:21 < clojurebot> #<IndexOutOfBoundsException java.lang.IndexOutOfBoundsException>
19:21 < justin_smith> ,7
19:21 < clojurebot> #<IndexOutOfBoundsException java.lang.IndexOutOfBoundsException>
19:21 < amalloy> i think i broke all the numbers when i tried to put it back together
19:21 < rasmusto> ah okay.
19:21 < arrdem> wow.. that crowbar usage...
19:21 < danlamanna> it seems if an nREPL command (in emacs) isn't responding, there's no way to just C-c C-c out of it, huh?
19:22 < rasmusto> C-c C-b iirc
19:22 < justin_smith> clearly the 'adams ns will turn every number up to N into 42
19:22 < justin_smith> danlamanna: sometimes it takes a while, but for me C-c C-c works
19:22 < amalloy> you can try C-g too, in case it's client-side emacs code that's not responding
19:23 < btcNeverSleeps> re all... I read a comment here previously about Emacs and stack traces "inside" cider: <technomancy> amalloy: you have to turn on "actually display stack traces" for whatever reason, which is dumb. but once you do that it's ok.
19:24 < btcNeverSleeps> Can someone tell me how you turn on "actually display stack traces"?
19:25 < amalloy> hiredman: is clojurebot's auto-reload going to reload java.lang as well, or just clojurey bits?
19:26 < Xe> How do you import functions from another clojure file?
19:26 < Xe> Say I have main.clj and foo.clj
19:26 < gtrak> Xe: namespaces
19:26 < technomancy> btcNeverSleeps: M-x apropos-variable cider.*stacktrace
19:27 < hiredman> amalloy: that is an interesting question
19:27 < Xe> gtrak: How do I use it once I have a namespace?
19:27 < gtrak> Xe: the (ns ..) form and (require ..)
19:28 < Xe> so it would be
19:28 < gtrak> http://clojuredocs.org/clojure_core/1.2.0/clojure.core/ns
19:28 < hiredman> instead of trying to answer it I killed the evaluator service, and it got restarted, so *shrug*
19:28 < arrdem> iiinteresting. tbaldridge, can I get a DL on the other accepted Lean Clojure project? we seem to be going for the same thing, unless his is atop the existing Java compiler.
19:28 < gtrak> Xe: here it uses :require [clojure.string :as str] http://clojuredocs.org/clojure_core/1.2.0/clojure.core/ns#example_527
19:32 < dbasch> gtrak: as str… pretty unfortunate example
19:32 < gtrak> dbasch: still works :-)
19:32 < gtrak> (str ) is str, str/ is the ns
19:32 < arrdem> you didn't really want clojure.core/str anyway :P
19:33 < gtrak> doesn't it?
19:33 < justin_smith> :as [str] will not make str unusable
19:33 < Xe> gtrak: what am I doing wrong? https://gist.github.com/2309529ee383916f2e7b
19:33 < arrdem> ,(require '[clojure.string :as str])
19:33 < clojurebot> nil
19:33 < arrdem> ,(str 1 2 3)
19:33 < clojurebot> "123"
19:33 < gtrak> Xe: I can't tell what that's supposed to do.
19:33 < arrdem> ,(str/capitalize "a")
19:33 < clojurebot> "A"
19:34 < rasmusto> ,(str 5)
19:34 < clojurebot> "5"
19:34 < Xe> gtrak: import the functions in constellation.atheme
19:34 < gtrak> your require looks fine but weird.
19:34 < Xe> well it doesn't work
19:34 < gtrak> Xe: ah, you'll want to alias the ns, that's what :as is for.
19:34 < justin_smith> Xe: that is not how you do unqualified import
19:34 < gtrak> :refer :all will import all the symbols, if that's what you need.
19:34 < justin_smith> also unqualified import is bad
19:34 < Xe> justin_smith: then how am I supposed to do it?
19:35 < gtrak> [constellation.atheme :refer :all]
19:35 < justin_smith> which is bad
19:35 < justin_smith> :P
19:35 < btcNeverSleeps> technomancy: thanks
19:35 < gtrak> hey, I'm just handing out guns..
19:35 < gtrak> footguns
19:35 < justin_smith> heh
19:35 < gtrak> I need to make a lib called that..
19:36 < justin_smith> it makes me imagine a foot with arms coming out (said arms having oversized biceps)
19:36 < gtrak> footgun - a utility library
19:36 < arrdem> gtrak: you already have knr what more do you need
19:36 < gtrak> yea, exactly.
19:36 < arrdem> gtrak: knr is footgun
19:37 < arrdem> gtrak: thinking of which... why the hell did you build knr
19:37 < gtrak> I was satisfied with building it once I successfully crashed the JVM. but ztellman's vertigo is a completion of the idea.
19:37 < arrdem> gtrak: I's cute and I enjoyed reading it... but what the hell
19:37 < Xe> gtrak: I see now, thanks
19:37 < gtrak> arrdem: he also said the unsafe isn't much faster than bytebuffers..
19:38 < arrdem> oooh boy
19:38 < arrdem> part of me wants to start using both of these libraries
19:38 < arrdem> and the rest of me likes not writing C
19:38 < gtrak> knr doesn't actually work... I'm making a note on the githubs :-)
19:38 < gtrak> it's half-completed
19:39 < justin_smith> hey, half-complete knr, complete footgun, who would know the difference except for a few symbols and filenames?
19:39 < amalloy> gtrak: 1/2 completed is the same as 1/5 completed, actually
19:39 < arrdem> vertigo is evil. I love it...
19:39 < arrdem> amalloy: quiet you
19:39 < justin_smith> lol
19:40 < jwm> is it safe to do a for on a nil object?
19:40 < justin_smith> ,(for [a nil] a)
19:40 < clojurebot> ()
19:40 < gtrak> amalloy: I think I'm missing something subtle there :-)
19:40 < gtrak> or is it 80/20?
19:40 < arrdem> also gtrak. meajure is now a thing. you're entirely to blame for the name.
19:40 < gtrak> hehe
19:40 < amalloy> gtrak: no, i was referring to my recent clojurebot hack
19:40 < justin_smith> gtrak: search up for ,(= 5 2)
19:40 < arrdem> ,(= 5 2)
19:40 < clojurebot> false
19:41 < arrdem> good. clojurebot is no longer horked
19:41 < rasmusto> ,(range 6)
19:41 < clojurebot> (0 1 2 3 4 ...)
19:41 < rasmusto> where's 5????
19:41 < TEttinger> rasmusto: ##(range 6)
19:41 < lazybot> ⇒ (0 1 2 3 4 5)
19:41 < justin_smith> ,5
19:41 < clojurebot> 5
19:41 < rasmusto> :)
19:41 < TEttinger> one of the bots trims output
19:42 < justin_smith> we were just kind of worried about 5 and hoping 5 was OK
19:42 < rasmusto> TEttinger: gotcha, was making a reference to ,(= (dec 5) 1) earlier
19:42 < TEttinger> heh wha
19:43 < justin_smith> probably the best clojure wat I have seen so far
19:43 < amalloy> i figured out how i broke clojurebot the second time
19:43 < justinholguin> ,(= (dec 5) 1)
19:43 < clojurebot> false
19:43 < justinholguin> phew
19:43 < amalloy> i was trying to set 5 back to 5, but instead i set 2 to 5. so looking up the third item in an array caused you to look up the sixth item instead. thus all the ArrayIndexOutOfBoundsException problems
19:44 < gtrak> how'd you do that in the first place? I didn't see it in the scroll-up
19:44 < TEttinger> ,(def 5 4)
19:44 < clojurebot> #<CompilerException java.lang.RuntimeException: First argument to def must be a Symbol, compiling:(NO_SOURCE_PATH:0:0)>
19:44 < justin_smith> another good name for an intentionaly messed up lib would be angkor (named for the world's biggest Wat)
19:44 < amalloy> gtrak: it's not hard. (let [field (nth (.getDeclaredFields Long) 3)] (.setAccessible field true) (.set field 5 2))
19:44 < justin_smith> gtrak: amalloy pasted it, by setting some properties of Long I think
19:44 < justinholguin> (inc justin_smith)
19:44 < lazybot> ⇒ 34
19:44 < justin_smith> oh, there it is again
19:45 < gtrak> ah, ye old integer cache
19:45 < justin_smith> probably will call for some new sandbox rules
19:45 * nDuff has a core.async mix, and is getting apparently nondeterministic behavior around whether the last item added to it is delivered, though the put to the mix *should* be happening before any associated close!, and all involved channels were constructed unbuffered
19:45 < TEttinger> (let [field (nth (.getDeclaredFields Long) 3)] (.setAccessible field true) (.set field (rand-int 100) 101))
19:45 < TEttinger> ,(let [field (nth (.getDeclaredFields Long) 3)] (.setAccessible field true) (.set field (rand-int 100) 101))
19:45 < clojurebot> #<IllegalArgumentException java.lang.IllegalArgumentException: Can not set final long field java.lang.Long.value to java.lang.Integer>
19:45 < TEttinger> aw
19:45 < rasmusto> justin_smith: glad someone else shares my taste for puns
19:46 < amalloy> iit turns out you have to do a bit more work to set it back
19:46 < amalloy> (let [five (long (int (+ (int 1) (int 4)))), field (nth (.getDeclaredFields Long) 3)] (.setAccessible field true) (.set field five (int (+ (int 1) (int 4))))) ;; actually worked to recover my repl
19:46 < rasmusto> amalloy: is this idiomatic code?
19:47 < rasmusto> er, does it at least show how to use java interop properly?
19:47 < TEttinger> there's nothing proper here
19:47 < arrdem> rasmusto: do you see that crowbar? do you see it?
19:47 < arrdem> rasmusto: that's almost as [good|bad] as the reader macros with crowbars hack
19:47 < amalloy> sure, just like carrying a chainsaw with you at all times is the idiomatic way to get into doors you really shouldn't be getting into
19:48 < gtrak> arrdem: I also take credit for the name 'reagent'
19:49 < rasmusto> hrm, trying to grok the long/int thing
19:49 < hiredman> http://bldgblog.blogspot.com/2010/01/nakatomi-space.html
Some time later:
14:20 < amalloy> compilers are more gullible than any human being
14:20 < gfredericks> ,(def three 4)
14:20 < clojurebot> #'sandbox/three
14:20 < gfredericks> lol he just believed me
14:20 < amalloy> (def largest-prime 85) ;; sure, okay
14:21 < gfredericks> ,(def _ "underscore")
14:21 < clojurebot> #'sandbox/_
14:21 < llasram> clojurebot is a he?
14:21 < amalloy> gfredericks: were you around when i broke clojurebot by redefining 5 to be 2?
14:22 * llasram would like to see that...
14:22 < amalloy> llasram: it's not super-hard. you use reflection to modify the .value field of (Long/valueOf 5)
14:23 < technomancy> isn't this something we make fun of ruby for making possible?
14:23 < technomancy> I'll have to update my Tome of Mockery
14:25 < llasram> amalloy: Ah. Yeah, ok. IMHO using reflection to stomp on private final (I assume?) fields is basically the same as memcpy()ing
14:25 < llasram> So I'm somewhat less impressed :-)
14:26 < gfredericks> amalloy: no way that's nutso
14:26 < TimMc> :-(
14:27 < gfredericks> Tim does not like it
14:31 < llasram> Well, unless someone re-defined TimMc's smiley face to use ":-("
14:31 < llasram> At this point we have no real way of knowing
14:34 < hyPiRion> It's hard to know anything when everything is relative and changing.
14:35 < gfredericks> except the undeniable objective fact that it's hard to know anything when everything is relative and changing
14:37 < TimMc> amalloy: How's that?
14:37 < amalloy> how's what?
14:37 < TimMc> I did (.setAccessible (.getDeclaredField Long "value") true) but then this errors: (.setLong (.getDeclaredField Long "value") 5 2)
14:38 < hyPiRion> gfredericks: but then it's not hard to know anything, it's hard to know anything with the exception of that statement
14:38 < amalloy> TimMc: setAccessible mutates the Field object you have. you can't re-get the Field object
14:38 < TimMc> Oh! Point.
14:38 < amalloy> (doto (.getDeclaredField Long "value") (.setAccessible true) (.setLong 5 2)) or something
14:39 < ystael> amalloy: does that break just one five or all the fives?
14:39 < amalloy> all the (boxed) fives
14:39 < llasram> Oh, language
14:39 < amalloy> and since clojure boxes everything, that's all of them
14:39 < TimMc> ,(let [f (.getDeclaredField Long "value"), subject 5] (.setAccessible f true) (.setLong f subject 2) subject)
14:39 < clojurebot> 2
14:39 < TimMc> D-:
14:39 < hyPiRion> amalloy: not all the boxed fives?
14:39 < amalloy> TimMc: ugh, don't do it to clojurebot again
14:39 < llasram> ,(+ 5 5)
14:39 < clojurebot> 4
14:39 < hyPiRion> ,(Long. "5")
14:39 < clojurebot> 5
14:39 < TimMc> oops
14:40 < amalloy> hyPiRion: true. all the ones boxed via Long/valueOf
14:40 < TimMc> I should have use a bigger 5.
14:40 < arrdem> ,(+ 2 2)
14:40 < clojurebot> 4
14:40 < arrdem> ,(+ 5 5)
14:40 < clojurebot> 4
14:40 < ystael> is there a numerical threshold above which boxed instances are not cached and shared?
14:40 < jcromartie> wow, nice
14:40 < TimMc> ,(let [f (.getDeclaredField Long "value"), subject 5] (.setAccessible f true) (.setLong f subject 5) subject) ;; fixed?
14:40 < clojurebot> 2
14:40 < hyPiRion> ystael: 128 or 256 I think
14:40 < llasram> ,(+ 5 5)
14:40 < clojurebot> 4
14:40 < amalloy> ystael: +/- 128
14:40 < TimMc> hahaha
14:40 < amalloy> well, -128 to 127
14:40 < llasram> ,(let [f (.getDeclaredField Long "value"), subject 5] (.setAccessible f true) (.setLong f subject (Long. "5") subject))
14:40 < clojurebot> #<IllegalArgumentException java.lang.IllegalArgumentException: No matching method found: setLong for class java.lang.reflect.Field>
14:41 < arrdem> http://i0.kym-cdn.com/photos/images/newsfeed/000/613/012/2fa.gif
14:41 < hyPiRion> TimMc: You have seen nothing yet
14:41 < llasram> ,(let [f (.getDeclaredField Long "value"), subject 5] (.setAccessible f true) (.setLong f subject (Long. "5")) subject)
14:41 < clojurebot> 5
14:41 < TimMc> It restarts every 12 minutes, right?
14:41 < llasram> ,(+ 5 5)
14:41 < clojurebot> #<IndexOutOfBoundsException java.lang.IndexOutOfBoundsException>
14:41 < TimMc> And by 12, I mean 12.
14:41 < llasram> Hmm
14:42 < amalloy> llasram: that's the way i tried to fix it the first time
14:42 < amalloy> but you made the same mistake i did
14:42 < amalloy> instead of defining 5 back to 5, you defined 2 to 5
14:42 < llasram> Oh, right
14:42 < llasram> hah!
14:42 < hyPiRion> hahah
14:42 < amalloy> so now like every array access breaks
14:42 < TimMc> I <3 FORTRAN.
14:43 < amalloy> we never did find out if clojurebot's auto-restart actually fixes this problem
14:43 < llasram> *amazing*
14:43 < amalloy> hiredman gave it a manual hard-reset before waiting for that
14:43 < arrdem> amalloy: one way to find out...
14:45 < TimMc> ,(let [f (.getDeclaredField Long "value"), subject 0] (.setAccessible f true) (.setLong f subject 42) subject) ;; if it will even run...
14:45 < clojurebot> #<IndexOutOfBoundsException java.lang.IndexOutOfBoundsException>
14:45 < TimMc> ,(.getDeclaredField Long "value")
14:45 < clojurebot> #<IndexOutOfBoundsException java.lang.IndexOutOfBoundsException>
14:45 < TimMc> Amazing.
14:45 < amalloy> TimMc: right, it's too late i think. you can no longer eval anything
14:45 < dans> do most people really work with plain SQL migrations for big projects? nothing that generates SQL from some models defined in some clojure data structure?
14:45 < amalloy> because eval uses the number 2 in an array somewhere
14:45 < amalloy> ,1
14:45 < clojurebot> #<IndexOutOfBoundsException java.lang.IndexOutOfBoundsException>
14:46 < TimMc> Got it.
14:46 < arrdem> hahaha
14:46 < hyPiRion> ,'1
14:46 < clojurebot> #<IndexOutOfBoundsException java.lang.IndexOutOfBoundsException>
14:46 < arrdem> (inc TimMc)
14:46 < lazybot> ⇒ 58
14:46 < TimMc> Only 28 points!
14:46 < TimMc> I thought I had more.
14:47 < hyPiRion> TimMc: well, since 2 is 5 and 5 is 2
14:47 < gfredericks> wait we can prove a contradiction with this right? and then derive anything?
14:47 < gfredericks> let's derive bugfixes
14:47 < arrdem> gfredericks: quick prove P!=NP then we can keep our jobs forever
14:48 < TimMc> amalloy: Do you know any way to get ahold of that interned 5?
14:48 < ystael> TimMc: it's no longer a number ... it's a free man now
14:49 < amalloy> TimMc: what do you mean?
14:49 < gfredericks> arrdem: or P = NP but only for galactic algorithms
14:49 < TimMc> Well, I'm trying to restore my REPL's notion of small numbers.
14:49 < arrdem> gfredericks: this is also an acceptable outcome.
14:49 < amalloy> i don't think you can do it if you've gone to the second level of broken like llasram did
14:50 < amalloy> but if you've only broken it one level, it is reversible
14:50 < TimMc> Just one level of fail.
14:50 < amalloy> iirc this works: (let [five (long (int (+ (int 1) (int 4)))), field (nth (.getDeclaredFields Long) 3)] (.setAccessible field true) (.set field five (int (+ (int 1) (int 4)))))
14:51 < TimMc> I'm having trouble figuring out what's going on here: https://www.refheap.com/85696
14:52 < amalloy> fiddling with (Long. "5") doesn't help, because that's not the interned version
14:52 < TimMc> Oh! Right-o.
14:52 < llasram> Wouldn't (Long/valueOf "5") work? Or does the compiler do funny things?
14:52 < amalloy> &(identical? (Long/valueOf "5") 5)
14:52 < lazybot> ⇒ false
14:52 < llasram> Oh, interesting
14:52 < amalloy> &(identical? (Long/valueOf 5) 5)
14:53 < lazybot> ⇒ true
14:53 < llasram> That makes sense of course
14:53 < amalloy> i don't know *why*, but apparently the string version bypasses interning
14:53 < amalloy> llasram: does it? it should parse it as a long, then use the intern cache to get a Long
14:53 < TimMc> valueOf probably just shortcuts, right?
14:54 < amalloy> incidentally, three cheers for repl history: i just searched it for setAccessible to find this fix; i probably wouldn't have remembered it on my own
14:55 < llasram> amalloy: Eh. It's not really clear to me why it should use the cache for the result of string parsing. Not saying it shouldn't -- it just doesn't seem unreasonable for it to not
14:55 < hyPiRion> TimMc: Oh hey, if you find this sort of stuff funny, you should see this one: https://www.refheap.com/85697
14:56 < hyPiRion> That one segfaults or makes your JVM spin up an infinite loop
14:57 < amalloy> hyPiRion: do you really have to remove its FINAL modifier? once you make it accessible i think you can already write to it
14:57 < amalloy> just like for Long
14:57 < amalloy> maybe you're doing something weird i don't see there
14:59 < hyPiRion> amalloy: it's static, which makes it a bit different IIRC
14:59 < hyPiRion> at least I just checked, and it doesn't work with just .setAccessible
15:00 < TimMc> ,(+(*)(*)(*)(*)(*))
15:00 < clojurebot> 5
15:00 < TimMc> It's back!
15:00 < llasram> ,(+ 5 5)
15:01 < clojurebot> 10
15:01 < llasram> Yay!
15:07 < TimMc> amalloy: I was able to fix it in my REPL by using "subject (+ 2 3)", but when I tried again with "subject 5" nREPL quit with an NPE. :-P
15:07 < ystael> When building a custom coercion matcher in Prismatic/schema, if I'm trying to coerce into a multi-level record structure, it's supposed to recurse into coercing into the sub-schemas automatically, right?
15:07 < amalloy> TimMc: my suggested fix didn't work?
15:08 < TimMc> I didn't try it, since I was able to fix it a different way.
15:09 < TimMc> "Bye for now!" https://www.refheap.com/85699
15:10 < sdegutis> Related: https://medium.com/message/81e5f33a24e1
15:10 < amalloy> TimMc: yeah, that's setting 2 to 5 again
15:10 < amalloy> which really is a lot more disruptive than setting 5 to 2
Much later:
13:48 < justin_smith> ,(let [field (nth (.getDeclaredFields Long) 3)] (.setAccessible field true) (.set field 5 2))
13:48 < clojurebot> nil
13:48 < justin_smith> ,(inc 5)
13:48 < clojurebot> 3
13:48 < andyf> You can break the JVM's 5, but Plato's 5 is safe in the world of forms
13:48 < justin_smith> haha
13:48 < gfredericks> ~5 is the set of all sets with 5 elements
13:49 < clojurebot> Ik begrijp
13:49 < bbloom_> , (.getDeclaredFields Long) 3)
13:49 < clojurebot> #<Field[] [Ljava.lang.reflect.Field;@5753b0>
13:49 < bbloom_> ,(.getName (.getDeclaredFields Long) 3))
13:49 < clojurebot> #<IllegalArgumentException java.lang.IllegalArgumentException: No matching method found: getName for class [Ljava.lang.reflect.Field;>
13:49 < bbloom_> ,(.name (.getDeclaredFields Long) 3))
13:49 < clojurebot> #<IllegalArgumentException java.lang.IllegalArgumentException: No matching method found: name for class [Ljava.lang.reflect.Field;>
13:49 < bbloom_> ,(clojure.reflect/reflect (.getDeclaredFields Long) 3))
13:49 < clojurebot> #<ClassNotFoundException java.lang.ClassNotFoundException: clojure.reflect>
13:49 < bbloom_> ,(require 'clojure.reflect)
13:49 < clojurebot> nil
13:49 < bbloom_> eh wahtever... how do i get the name of a field?
13:49 < gfredericks> .getName?
13:49 < bbloom_> i tried that
13:49 < bbloom_> oh dur it's an array
13:49 < gfredericks> with 3?
13:50 < bbloom_> ,(.name (nth (.getDeclaredFields Long) 3))
13:50 < clojurebot> #<IllegalArgumentException java.lang.IllegalArgumentException: No matching field found: name for class java.lang.reflect.Field>
13:50 < bbloom_> i suck
13:50 < bbloom_> ,(.getName (nth (.getDeclaredFields Long) 3))
13:50 < clojurebot> "value"
13:50 < andyf> The world of forms: Bringing you real immutability since 348 BC
13:50 < bbloom_> ah ok i gotcha. boxed small numbers are interned
13:51 < justin_smith> , (nth (.getDeclaredFields Long) 3)
13:51 < clojurebot> #<Field private final long java.lang.Long.value>
13:51 < justin_smith> ,(.getName (nth (.getDeclaredFields Long) 3))
13:51 < clojurebot> "value"
13:51 < bbloom_> andyf: https://en.wikipedia.org/wiki/348_BC <- i was hoping you knew the actual year
13:51 < justin_smith> bbloom_: ^
13:51 < bbloom_> justin_smith: i got there eventually :-P
13:52 < justin_smith> bbloom_: aha, I missed it while I was finding it in my own repl
13:52 < andyf> Sorry, I don't know when he wrote about it first, so I approximated by the year Plato died.
13:53 < justin_smith> ,(= 5 3)
13:53 < clojurebot> false
13:53 < justin_smith> ,(= 5 2)
13:53 < clojurebot> true
13:53 < justin_smith> ,(let [field (nth (.getDeclaredFields Long) 3)] (.setAccessible field true) (.set field 5 (inc 4)))
13:53 < clojurebot> nil
13:53 < justin_smith> ,(= 5 2)
13:53 < clojurebot> true
13:53 < justin_smith> I thought I fixed that...
13:54 < justin_smith> ,(let [field (nth (.getDeclaredFields Long) 3)] (.setAccessible field true) (.set field (inc 4) (inc 4)))
13:54 < clojurebot> nil
13:54 < justin_smith> ,(= 5 2)
13:54 < clojurebot> true
13:54 < justin_smith> ,(inc 2)
13:54 < clojurebot> 3
13:54 < justin_smith> ,(inc 5)
13:54 < clojurebot> 3
13:54 < mearnsh> this is why we can't have nice things
13:54 < AeroNotix> ,(inc (+ 3 2))
13:54 < clojurebot> 6
13:54 < justin_smith> :( I forgot how to fix it
13:54 < AeroNotix> ,(inc 5)
13:54 < clojurebot> 3
13:54 < AeroNotix> 5
13:55 < AeroNotix> ,5
13:55 < clojurebot> 2
13:55 < justin_smith> ,(let [five (long (int (+ (int 1) (int 4)))), field (nth (.getDeclaredFields Long) 3)] (.setAccessible field true) (.set field five (int (+ (int 1) (int 4)))))
13:55 < clojurebot> nil
13:55 < andyf> Once you make 5 equal to something else, the JVM extrapolates and is able to prove that all numbers are simultaneously equal to, and not equal to, all others.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment