#clojure log - Apr 14 2011

The Joy of Clojure
Main Clojure site
Google Group
IRC
List of all logged dates

0:00 Raynes: mefesto: I just realized that I forgot all about the interactive tutorial stuff you added to tryclj. I'm working on getting it live now.

0:08 technomancy: weird; the extra newline seems to only happen on my machine

0:18 mec: I've got a nested-for macro which returns a nested version of for ;p and I want to add a transform function to apply to each level, wheres a good place to pass this into the macro? https://gist.github.com/901895

0:23 amalloy: mec: isn't that just ##(for [x (range 5) :while (< x 3)] (for [y (range 5) :when (odd? y)] [x y]))

0:23 sexpbot: ⟹ (([0 1] [0 3]) ([1 1] [1 3]) ([2 1] [2 3]))

0:23 clojurebot: regular expressions is http://www.regular-expressions.info/tutorial.html

0:23 mec: unforntunatly not, if the nested for is empty you get something like ([1 2] () [1 3] ())

0:25 amalloy: okay...and that's not desired behavior for some reason?

0:26 mec: im trying to remember why that was necesary :x

0:26 amalloy: &(for [x (range 5) :when (odd? x)] (for [y (range 5) :when (odd? y)] [x y]))

0:26 sexpbot: ⟹ (([1 1] [1 3]) ([3 1] [3 3]))

0:27 amalloy: &(for [x (range 5) :when (odd? x)] (for [y (range 5) :when (= 10 y)] [x y]))

0:27 sexpbot: ⟹ (() ())

0:29 amalloy: mec: anyway, it seems like "filtering out empty sublists" is a pretty small goal that doesn't merit a reinvention of the for macro

0:30 mec: &(for [x (range 5) :when (odd? x) y (range 5) :when (= 10 y)] [x y])

0:30 sexpbot: ⟹ ()

0:30 mec: for doesnt put in nils so i wanted to parallel it, just nested

0:31 amalloy: that was a bunch of words with no particular meaning afaict. what do you "wish" for did in this case?

0:32 mec: i wanted it to be as if I did some partitions, which wouldnt add empty lists

0:56 dnolen: ad-hoc logic rules are the new type hints and other nutty notions, https://github.com/swannodette/match/wiki/Crazy-Ideas

1:00 mec: how do you overload [[] v] and [[a & r] v]

1:00 amalloy: mec: you don't overload them

1:00 mec: ^ for dnolen

1:01 amalloy: heh. i was about to refer to him since it looked like pattern-matching

1:01 dnolen: that's not possible at all currently. this what I'm thinking about...

1:01 well it's actually that works in Logos just fine.

1:02 mec: i guess you could just combine them all and cond on the guards

1:03 dnolen: mec: cond is too slow. The logic system can prove things and use case when possible.

1:04 goal is something 6-10X faster than multimethods, but more general.

1:14 carllerche: Is there a way to return a java class from a function and then initialize it?

1:15 Havvy: So, I want to sum up rand-int done an arbitrary amount of times. I have so far "reduce + ..." but I have no clue how to create the list. Repeat doesn't work since (repeat 5 (rand-int 5)) gives (4 4 4 4 4).

1:16 amalloy: carllerche: yes, but no good ways

1:16 Havvy: ##(reduce + (repeatedly 4 #(rand-int 5)))

1:16 sexpbot: ⟹ 6

1:22 Derander: does clojuredocs.org have a more recent db dump than oct 19, 2010?

1:22 going to a competition soon where api references are allowed but internet access is not

1:26 amalloy: Derander: you have to print it or something? or can you just bring your repl and use (doc bar)

1:26 Derander: amalloy: I want the examples :-)

1:27 slime can do doc no problem

1:33 mec: if I have a vector of [key val key val ...] how might I dissoc a certain key val

1:35 Havvy: amalloy: Thanks, once more. XD

1:41 amalloy: mec: by not using vectors

1:45 mec: ah hah, array-map

1:51 amalloy: mec: hearing you mention array-map in the context of dissocing from a vector worries me. i can't think of any good reason to call array-map directly

1:51 mec: order matters in this map

1:51 amalloy: then don't use an array-map :P

1:52 &(dissoc (apply array-map (range 100 200)) 150)

1:52 sexpbot: ⟹ {100 101, 102 103, 104 105, 106 107, 108 109, 110 111, 112 113, 114 115, 116 117, 118 119, 120 121, 122 123, 124 125, 126 127, 128 129, 130 131, 132 133, 134 135, 136 137, 138 139, 140 141, 142 143, 144 145, 146 147, 148 149, 152 153, 154 155, 156 157, 158 159, 160 1... http://gist.github.com/918953

1:52 amalloy: &(class dissoc (apply array-map (range 100 200)) 150))

1:52 sexpbot: java.lang.IllegalArgumentException: Wrong number of args (3) passed to: core$class

1:52 amalloy: &(class (dissoc (apply array-map (range 100 200)) 150))

1:52 sexpbot: ⟹ clojure.lang.PersistentArrayMap

1:52 amalloy: hm. it stays as an array-map. i don't think that's guaranteed, is all

1:53 Havvy: A string is a number. How do you tell clojure that?

1:53 amalloy: &(class (conj (apply array-map (range 100 200)) 300 301))

1:53 sexpbot: java.lang.IllegalArgumentException: Don't know how to create ISeq from: java.lang.Integer

1:53 amalloy: &(class (conj (apply array-map (range 100 200)) [300 301]))

1:53 sexpbot: ⟹ clojure.lang.PersistentHashMap

1:54 amalloy: mec: ^

1:54 Havvy: wut

1:55 mec: anything more than 16 turns an array map into a hashmap

1:55 Havvy: &(class "6")

1:55 sexpbot: ⟹ java.lang.String

1:55 Havvy: &(class 6)

1:55 sexpbot: ⟹ java.lang.Integer

1:55 mec: (Integer. "6")

1:56 Havvy: mec: There is no wrapper around that function?

1:56 *clojure wrapper

1:56 mec: or if it could be large ##(bigint "6")

1:56 sexpbot: ⟹ 6

1:56 amalloy: mec: do nott rely on ordering of any kind for any kind of map (array or otherwise) unless you create the map with (sorted-map)

1:57 mec: well then im back to having to remove the key/val from a vector

1:57 Havvy: Well, it could theoretically be big, and performance doesn't matter in this case, so bigint it is.

1:58 amalloy: mec: at least store them as single [key value] elements

1:59 not two unconnected key value entries

2:03 mec: it looks like array-map guarantees itself as long as you dont assoc more than 16 values total, but dissoc will not change type

2:03 seancorfield: technomancy: saw your note about 1.5.2 - how long before we can expect lein upgrade to pick that up?

2:04 * seancorfield just tried lein upgrade and it fetch 1.5.1 (and overwrote my local, patched version of 1.5.1)

2:04 amalloy: mec: guarantees!?! the source may look that way now, but where is it in the contract that this won't change when rich decides that it's more efficient to make the switch at 8, or finds out that array-maps are less efficient for any size at all

2:06 mec: ok ill accept that, the API says it will maintain order as long as it is unmodified

2:17 hiredman: erm, it's immutable, you can't modify it

2:29 amalloy: hiredman: please save me here by (a) figuring out what mec *actually* wants, and (b) suggesting a better way to do it than messing with array-map

2:29 mec: hiredman: assoc/dissoc "modifying" may create a new type on return

2:30 i receive a vector of key vals that need to maintain order. I need to check if a certain key exists, if so get its value and remake the vector without it

2:34 amalloy: mec: i keep telling you, keep [[k1 v1] [k2 v2]], not [k1 v1 k2 v2]. makes everything easier

2:34 mec: ok thats easy enough but how do i remove

2:35 amalloy: &(into [] (remove (comp #{:bad} key) [[:good 1] [:bad 2]]))

2:35 sexpbot: java.lang.ClassCastException: clojure.lang.PersistentVector cannot be cast to java.util.Map$Entry

2:35 amalloy: &(into [] (remove (comp #{:bad} first) [[:good 1] [:bad 2]]))

2:35 sexpbot: ⟹ [[:good 1]]

2:36 amalloy: skip the into step if you don't need it as a vector, whatever

2:36 mec: ah ok thanks

2:39 amalloy: and if you do a lot of operations like this, you don't need it as a vector. mess around with it as a lazy-seq for a while, and turn it into a vector for the rare cases where you need frequent random access

2:42 mec: good idea

3:16 joshua__: Finally got lein working again now that I'm back home. I had to wipe my repository folder and re-install lein. I think my lein deps and lein upgrade while on the schools network corrupted the downloads or something. Every checksum would fail.

4:01 Derander: joshua__: I've had all kinds of amazing fuckups caused by the proxy on my high school's network

4:02 joshua__: it lets some kinds of traffic through and blocks other kinds in random ways

4:02 sometimes it blackholes the traffic, sometimes it reroutes it, sometimes it does things that I can't even diagnose

4:59 Cope: hello

5:02 hoeck: morning Cope

5:06 Cope: ello - i'm completey new to clojure, but have used ruby and python, so not a programming novice; I want to write a simple binary decision tree that plays a game like '20 questions' - can someone point me to a good place to start hacking?

5:07 this is purely for fun, to learn the language

5:10 clgv: Cope: reading "Programming Clojure" or "Practical Clojure" might get you started fast

5:11 Cope: and I think 20Q is more than a binary decision tree, but you can do a simple version that is only a binary tree

5:12 Cope: yes the game i want to play is really 'let me guess your animal'

5:12 which is simpler

5:12 i think

5:12 you dn't need to compress the tree

5:12 well its less critical

5:15 ordnungswidrig: hi, how can I enumerate the fields of a deftype?

5:19 clgv: ordnungswidrig: you can't with clojure afaik. maybe you can do it with java reflection

5:20 ordnungswidrig: clgv: ok, I think I opt for wrapping deftype in a macro and adding this information as metadata to the instance

5:20 clgv: ordnungswidrig: I already did that. wait I can post it

5:21 which gist do you like?

5:22 ordnungswidrig: theres deftype+ on clojars as well

5:24 clgv: which gist?

5:29 clgv: ordnungswidrig: thats what I use to inspect deftypes http://pastebin.com/0fnkhWdk

5:29 raek: gist.github.com has syntax highlighting for clojure

5:30 clgv: ordnungswidrig: for using it you just have to do (inspect-type-setup MyDefType) before (deftype MyDefType ...)

5:33 ups I am missing a definition in it

5:34 ordnungswidrig: here it is -> http://pastebin.com/kzGGRDip

5:45 ordnungswidrig: clgv: thanks!

5:50 AWizzArd: nice

7:20 matthias__: there's no java program running except swank. or whatever swank runs that is java. the java process is using 500mb ram.

7:20 ive ran a program a couple times, but its not running right now.

7:20 whats going on? :(

7:31 clgv: Is it not supported to use variable argument lists via "& options" in a parameter list of a defprotocol?

7:32 clojure fails at this: (defprotocol IBlubb (get-lala [this & options])) (deftype Blubb [lala] IBlubb (get-lala [this & options] lala)) (get-lala (Blubb. "haha!"))

7:32 with "No single method: get_lala of interface: user.IBlubb found for function: get-lala of protocol: IBlubb"

7:36 manutter: clgv: does it work if you give it a fixed argument list?

7:36 (I don't know much about protocols, but it does sound like variable args might be a problem)

7:37 clgv: sure. it's pretty default usecase then ;)

7:38 Kototama: variadic arguments are not supported for protocols

7:38 you can create a variadic function that wraps the call to the protocol

7:39 clgv: oh ok. then it should fail in the protocol or type definition. it's really strange that both of them dont throw any error because of this

7:41 Kototama: seems & is recognized like a variable name in this case

7:41 (defrecord B [] IBlub (do [this & options] (prn "& =") (prn &)))

7:41 (do (B.) "titi")

7:41 => "titi"

7:43 clgv: oh ok. thats pretty buggy I'd say

7:43 Kototama: i don't like it neither

7:43 clgv: but I have no clue where to report it or where to look if it is already reported

7:46 Kototama: i think tickets are managed on assembla but maybe it's on github, not sure

7:46 clgv: well they should tidy that up.

7:49 fogus`away: Tickets are at http://dev.clojure.org/jira/browse/CLJ

7:53 clgv: thx

7:55 but It seems I cant create a ticket

7:58 matthias__: so does slime keep around the stuff that the program has in ram? i keep starting the program with (start), but of course if im just using a repl, its not actually quitting the program. i think

7:58 so, how do i avoid filling up the ram?

7:59 maybe penumbra has a memory leak somehow

7:59 cemerick: clgv, Kototama: it's not a bug; records and protocols do not support rest args

8:00 clgv: cemerick: well than they should throw an error at me and not pretend to be successful ;)

8:02 cemerick: not failing on unsupported parameter specification is the bug I wanted to report

8:03 cemerick: clgv: It's not unsupported -- '& is just-another-symbol in that context, though we're into semantics re: supported/error. You could suggest that '& be disallowed as an arg name there.

8:04 clgv: cemerick: ok forbidding '& would work as well. but since "& options" has its semantic for "normal" functions, there should be something done to make clear that this semantic isnt supported by protocols

8:05 cemerick: Perhaps, yes.

8:05 Either that, or rest arg support will arrive for protocols and records.

8:05 That could be hairy tho.

8:06 clgv: doesnt java have a vararg semantic as well? I know C# does

8:06 cemerick: Yes, but it's purely a fiction of javac.

8:07 clgv: ok

8:07 cemerick: Which is why calling a vararg method from Clojure requires (.someMethod obj (into-array [your args]))

8:08 fogus`: javac is delusional

8:09 clgv: hmm finally found a good decompiler to look at what clojure does: jd-gui :)

9:33 edw: Anyone here use swank autoconnect? <https://github.com/juergenhoetzel/lein-swank-autoconnect> Not sure how to make it, umm, auto-connect.

9:37 leafw: hi all. I've just seen the commit on "get rid of checked exceptions". I am curious: what is there to gain by having or not having the "throw Exception" tag on all those java methods?

9:39 markoman: how do you make a for i loop with clojure? say (for i = 0, i < 10 (println i))

9:40 edw: markoman: (dorun (map #(write %) (range 10)))

9:41 s/write/println

9:41 sexpbot: <edw> markoman: (dorun (map #(println %) (range 10)))

9:42 edw: Does that answer your question, markoman?

9:43 markoman: well for simple println version yes, and thats what i asked, lol. thanks. i need to see, if it applies to inside my function

9:44 TimMc: markoman: (doseq [i (range 10)] (println i))

9:44 markoman: i get confuced because there is a map and i cant access i variable

9:45 edw: Do you have a paste/gist?

9:45 markoman: sure

9:46 i should include other design problem on same paste

9:46 edw: TimMc: Oh, I need to rummage through those built-ins more.

9:48 It sounds like you're trying to write C--or worse, PHP--in Clojure, which is sort of beyond the scope of my available time, aside from pointing you to Manning's "The Joy of Clojure."

9:50 ejackson: markoman: TimMc is on the money

9:52 markoman: just a moment, i have a bin prepared if you want to check. yes, i have coded more half of my life with php, so thats where i start, but i know, its different here. i hope to learn alternative and better ways to do things

9:53 manutter: heh, I'm sitting here coding in PHP for my day job, wishing I could re-write our app in Clojure...

9:54 markoman: http://pastebin.com/gywqw67f

9:54 ejackson: common wish

9:54 markoman: manutter: i know what you talk about

9:54 and thats what im partly prototyping on my spare time, heh

9:55 manutter: So, in your code, first thing is to use (doseq) not (for)

9:55 markoman: yes, i think doseq is right thing and easy to put there

9:55 manutter: (for) is a list comprehension, it returns a seq

9:55 TimMc: manutter: Why's that?

9:56 markoman: Is form-generate supposed to return something or print something?

9:56 markoman: return a hiccup form

9:56 TimMc: for is fine if there are no side effects

9:56 markoman: ill print that later on browser

9:57 TimMc: doseq, dorun, and doall are for side effects

9:57 markoman: hmh, i havent decided if i will use same function not just for :show but also :save form values to db

9:58 is that considered side effect?

9:58 manutter: hmm, spoke too soon--you're right about for vs doseq

9:59 sorry, was still thinking in terms of the original question about for i=1 to 10 print i

9:59 TimMc: markoman: A side effect is I/O operations or something.

9:59 markoman: ejackson: "member:TimMc is on the money" ?

9:59 ejackson: his initial comment on using for

10:00 markoman: it was far too reduced version of my problem

10:00 sorry about that

10:00 manutter: Since the function is returning a seq based on a seq, for is the correct choice.

10:00 ejackson: doseq, rather

10:03 mec: markoman: https://gist.github.com/919528

10:06 markoman: mec: oh, good point

10:07 you can use :let inside for especially?

10:08 mec: ,(for [a (range 20) :while (< a 10) :when (odd? a)] a)

10:08 clojurebot: (1 3 5 7 9)

10:09 mec: ,(for [a (range 20) :while (< a 10) :when (odd? a) :let [b (/ a 2)]] b)

10:09 clojurebot: (1/2 3/2 5/2 7/2 9/2)

10:09 markoman: heh, cool

10:10 TimMc: Oh man, I always forget about Lwhile and :when in for.

10:11 mec: equivalent to much much clearer than: ##(map #(/ % 2) (filter odd? (take-while #(< % 10) (range 20))))

10:11 sexpbot: ⟹ (1/2 3/2 5/2 7/2 9/2)

10:12 markoman: twisted must be a mind understanding those

10:14 mec: also ##(->> (range 20) (take-while #(< % 10)) (filter odd?) (map #(/ % 2))

10:14 ,(->> (range 20) (take-while #(< % 10)) (filter odd?) (map #(/ % 2)))

10:14 clojurebot: (1/2 3/2 5/2 7/2 9/2)

10:16 markoman: :) ok, im trying for in this case

10:17 Raynes: mefesto: Ping me whenever you're around.

10:17 leafw: hi all. I've just seen the commit on "get rid of checked exceptions". I am curious: what is there to gain by having or not having the "throw Exception" tag on all those java methods?

10:20 edw: This `for' macro, it seems, I don't know... Does `for' make heavily-nested higher order function invocations significantly cleaner?

10:21 mec: basically

10:21 but only when dealing with sequences

10:22 AWizzArd: edw: list comprehension is what for does. List comprehension can do mapping and filtering.

10:22 raek: i often find 'for' easier to read when compared to 'map' with an anonymous function

10:23 cemerick: leafw: then you don't have to bury yourself in mostly-useless try/catch blocks when calling clojure fns from Java.

10:23 edw: That's a resounding recommendation! I guess I need to take some of my code that has five or so nested `reduce', `map', and `filter' invocations and re-write it and see if the weird syntactic sugar improves them.

10:24 mec: cemerick: doesnt that also mean clojure fns cant call anything that might throw an exception

10:24 cemerick: mec: no

10:24 mec: edw: only thing for cant do is reduce

10:25 cemerick: mec: checked exceptions are another delusion of javac

10:26 mec: so how is clojure going to get away with not having them? isnt it compiled through javac?

10:26 cemerick: goodness no

10:27 javac compiles java source, nothing else

10:27 edw: mec: This reminds me, I wrote a macro that basically lets you chain all those together and not have to read them inside out. I should dig it up; it was pretty useful. Oh, wait, it was basically `>>`.

10:27 mec: edw: different from -> or ->> ?

10:28 leafw: cemerick: ok, but that alone doesn't sounds like it would justify such a long and thorough commit.

10:28 edw: D'oh, typo. s/>>/->>/

10:29 cemerick: leafw: He had to rip out every unnecessary throws declaration, and every corresponding wrapping of checked exceptions with a RuntimeException for consumption by Clojure fns.

10:29 As a side effect, stack traces ended up getting a lot lighter, especially for exceptions that occur within lazy seq realizations.

10:30 mec: i've got a >> which basically turns (>> %10 (+ % %) (* 5 %) inc) into (let [% 10 % (+ % %) % (* 5 %)] (inc %))

10:41 edw: mec: and why?

10:42 mec: It's interesting, but at some point I feel like we should just go create a Forth compiler for the JVM.

10:43 mec: ,(->> 10 (#(+ % %)) (* 5) inc) ;otherwise you need that nasty anon function syntax somtimes

10:43 clojurebot: 101

10:44 markoman: i got this more complicated now: (for [:let [r (:repeat {:repeat 2} 0)] i (range (if (< 1 r) 0 r) (inc r))] i)

10:45 my purpose is to get (range 0 1) or (range 1 i)

10:46 mec: markoman: can you give an example output

10:47 markoman: when repeat exists and is bigger than 0 then range is 1 to n+1

10:48 when repeat non exists, then i is 0 and there is only one iteration on loop. so is one iteration only, if repeat = 1, but with range 1 2

10:50 output is: 0 or 1 or 1, 2 or 1, 2, 3 and so forth

10:51 mec: ,(let [r (:repeat {:repeat 2} 0] (if (< r 2) r (range 1 (inc r)))

10:51 clojurebot: Unmatched delimiter: ]

10:52 mec: ,(let [r (:repeat {:repeat 2} 0)] (if (< r 2) r (range 1 (inc r)))

10:52 clojurebot: EOF while reading

10:52 markoman: i dont know how to explain clearly, basically id like to initialize i depending :repeat value and then get (range 0 1) or (range 1 i)

10:53 mec: ,(let [r (:repeat {:repeat 1} 0)] (if (< r 2) [r] (range 1 (inc r))))

10:53 clojurebot: [1]

10:53 mec: ,(let [r (:repeat {:repeat 5} 0)] (if (< r 2) [r] (range 1 (inc r))))

10:53 clojurebot: (1 2 3 4 5)

10:53 markoman: ,(let [r (:repeat {:repeat 0} 0)] (if (< r 2) [r] (range 1 (inc r))))

10:53 clojurebot: [0]

10:54 markoman: ,(let [r (:repeat {} 0)] (if (< r 2) [r] (range 1 (inc r))))

10:54 clojurebot: [0]

10:54 markoman: yes, thats what im after

10:55 choffstein: cemerick: You around? In your rummage library (which I love, by the way), you use ::sdb/id (where sdb is the name for cemerick.rummage), which resolves to :cemerick.rummage/id. I am a bit confused about the double colons and how they work. Mind explaining for a beginner?

10:55 cemerick: choffstein: :cemerick.rummage/id is a namespaced keyword, where `cemerick.rummage` is the namespace

10:56 Dual colons in front of an otherwise unqualified keyword specify a keyword with a namespace of *ns*

10:56 e.g. ##::foo

10:56 hrm

10:56 ,::foo

10:56 clojurebot: :sandbox/foo

10:56 choffstein: cemerick: Ahhh, I see.

10:57 It's messing up my marginalia docs :D

10:57 Thanks for explaining!

10:57 cemerick: In ::<foo>/some-keyword, <foo> is taken to be a namespace aliased within the current namespace.

10:58 so, you could (require '[cemerick.rummage :as rummage]) in your lib, and then use ::rummage/id to identify item names, etc.

10:58 ::sdb/id seems cleaner, tho :-)

10:58 choffstein: glad you're liking it, BTW. Any movement on that dependency craziness?

10:59 mec: cemerick: so now clojure wraps all exceptions in runtime exceptions so they dont need to be checked?

10:59 markoman: mec: works great. huh, it takes time to make functions ready, but I like the result!

10:59 choffstein: cemerick: Nope. All seems to be on this one network ...

10:59 cemerick: mec: IIRC, no – 1.3.0-alpha6 (I think?) doesn't do any more wrapping

11:00 mec: cemerick: oh maybe im still understanding it wrong. It looks like if its not a runtime exception it wraps it in one, and just passes that along

11:01 raek: mec: that's how it was done before the patch, iirc

11:01 this "checked exceptions" business is not enforced on the JVM level

11:02 mec: throw Util.runtimeException(e.getCause()); was added all over the place

11:57 carsten: moin

12:05 matthias__: hmm, isnt it supposed to be possible to change my program while it runs with slime?

12:05 i've tried recompiling a function that is being called over and over in the program, but nothing changed in the running program

12:05 Chousuke: hm

12:05 Why am I on this channel twice?

12:06 mec: matthias__: its not with recursion is it?

12:07 matthias__: no

12:07 why?

12:07 clojurebot: why not?

12:08 matthias__: how do i change a function in a running program?

12:08 i tried C- C-c

12:08 i mean C-c C-c

12:09 mec: i dont know the whys but if you put #' before the call then redefining it should work fine

12:11 raek: matthias__: reevaluating it shoud be sufficient (e.g. C-x C-e or C-M-x for thhe current form or C-c C-k for the current file)

12:11 mec: How could I simplify (if a (if b (if c d e) e) e)

12:11 matthias__: i tried C-M-x

12:12 raek: are you storing the function in a datastruture, or did you pass it as an argument to a function?

12:12 matthias__: but the cuntion isn't called by me. im trying to use penumbra, and it gets passed a map with a bunch of functions that are defined in my program

12:12 im trying to change display

12:12 yes

12:12 (im just playing with one of the penumbra example programs

12:12 raek: mec: (if (and a b c) d e)

12:13 matthias__: then you actually store the current value of the var in the datastructure. you can put the var there instead: {:foo #'foo-function}

12:14 calling a var will cal the function it points to

12:14 so when you change the var to point to a new function object (by reevaluating its defn form), penumbra will use the new one

12:14 mec: raek: what if they were nested if-let?

12:15 matthias__: ah, now it works. thanks

12:16 raek: mec: then a simple and would not do :)

12:16 mec: hmm i think I want the maybe monad ;p

12:16 raek: I've been thinking about making a macro for that

12:17 choffstein: If I am using a jetty server and serve a page that references a js file that is located in "/js/file.js" -- where should file.js be located in my code tree? Should it be in /public/js directory? Just /js?

12:17 mec: raek: ya I made a when-lets so I figured if-lets would be easy enough, but where do you put the else branch :x

12:17 raek: mec: brehaut has done some stuff related to this: http://brehaut.net/

12:19 this in particular http://brehaut.net/blog/2011/error_monads

12:22 mec: in order to do it this way I'd have to wrap all of the test exprs in functions would I?

12:24 choffstein: anyone having trouble using hiccup 0.3.4? I keep getting an error: Unable to resolve symbol: resolve-uri in this context

12:24 0.3.0 works for me

12:29 i've lean cleaned everything and even wiped my local repo. what da eff.

12:33 Ohhhhhh! Marginalia requires hiccup 0.3.0, and I want 0.3.4 in my project. THAT explains a LOT.

12:34 Is there any way to qualify which version to use when using in a namespace

12:38 Because these two seem to be clashing like a mother-bitch

12:40 mec: is there a way to tell if maybe-m returned nil from the bindings or if the expression resulted in nil?

12:40 technomancy: whichever is on the classpath first wins

12:40 choffstein: you can use :exclusions to leave out the version you don't like, though that should happen automatically

12:41 see lein help sample

12:41 choffstein: technomancy, alright, thanks.

12:43 heyyyyy, it worked!

12:47 matthias__: what would be the point of running lein compile before lein repl? doesnt repl have to compile everything too?

12:49 technomancy: matthias__: if you've changed a gen-class or something you might need to

12:50 matthias__: what's a gen-class?

12:51 mec: painful

12:55 carllerche: I'm trying to understand lazy seqs. Let's say I want to write a function that takes a lazy seq of random numbers and returns a seq of those numbers reduced until they were over five. So (1 4 3 8 5 ...) -> (5 11 5 ...), what would that look like?

12:55 tufflax: matthias__ i think it's when you implement a java class in clojure

13:02 mec: carllerche: https://gist.github.com/919923

13:03 carllerche: mec: thanks.. that's better than what I was trying to come up with :P

13:06 mec: carllerche: i think i can actually use this for something i was working on earlier :D

13:06 carllerche: heh, nice :)

13:13 mec: how do i exit the customize screen in emacs? hitting exit and then switching buffers just keeps bringing it back

13:21 devn: C-x k

13:21 mec: devn: thanks

13:21 devn: Anyone want to work on the SICP in Clojure? Have a regular book club?

13:51 mec: is there anyway to simplify this, seems like im checking too many edge cases https://gist.github.com/919923

13:55 amalloy: mec: turn if..if into cond, for one

13:57 carllerche: mec: still updating the function?

13:57 mec: trying to simplify it, i fixed the problem with it before

13:58 amalloy: but understanding your algorithm well enough to improve it non-cosmetically is beyond my interests at the moment :P

13:58 mec: carllerche: you want the bottom one: https://gist.github.com/919923

13:59 carllerche: what's the difference?

13:59 besides the lazy-loop / lazy-recur?

13:59 mec: lazy-recur is a macro from amalloy's utils

13:59 carllerche: ah

13:59 mec: err rather lazy-loop is

14:04 speaking of which, amalloy: whats the benefit if implementing lazy-loop with fn instead of just loop?

14:04 amalloy: mec: the whole point is it's not tail-recursive

14:04 you couldn't do it with a loop

14:05 mec: well duh

14:14 Saturnation: Just checking my understaning... alter takes a reference, a function and optional arguments for the function?

14:15 mec: yes and it because a call like (apply function @ref args)

14:15 s/because/becomes/

14:15 sexpbot: <mec> yes and it becomes a call like (apply function @ref args)

14:16 Saturnation: OK, not understanding why I'm getting an error along the lines of wrong number of arguments :(

14:16 mec: copypasta?

14:16 Saturnation: yeah, I always forget the url :)

14:17 (alter square-size #(Math/min width height)) where width and height are defined in the enclosing let form

14:17 opqdonut_: the #()-thing is of arity 0

14:17 since it doesn't have a % inside it

14:18 but it's getting called with one argument because that's what alter does

14:18 Saturnation: yes, am I passing any arguments???

14:18 Ah

14:18 so make a function that calls min an ignores the argument???

14:18 opqdonut_: yeah, using fn

14:18 Saturnation: cool, got it, thanks!

14:19 amalloy: wut. you guys are crazy

14:19 * Saturnation has heard that a number of times before

14:19 opqdonut_: amalloy: ?

14:19 mec: if you're doing that you should just (ref-set! square-size (Math/min width height))

14:19 amalloy: indeed, mec

14:19 Saturnation: even better, thanks

14:19 opqdonut_: yeah, true

14:19 * Saturnation doesn't really have a good model of Clojure in his head just yet...

14:20 amalloy: but you should also strongly consider not doing it that way. why is this a ref to begin with? it has various states that are not interrelated at all

14:20 refs, atoms, and the STM are intended to group several changing states under one constant identity; you seem to be using it to add mutability

14:21 Saturnation: see previous comment, just dealing with it for the moment, will eliminate it later

14:21 amalloy: opqdonut_: by the way, it's also silly to write (fn [_] some-constant-value); see ##(doc constantly)

14:21 sexpbot: ⟹ "([x]); Returns a function that takes any number of arguments and returns x."

14:21 opqdonut_: sure

14:23 Saturnation: amalloy, should really deal with it now, thanks for keeping me honest :)

14:23 and will deal with it now

14:23 amalloy: :)

14:23 Saturnation: What's the clojure job market like?

14:24 amalloy: Saturnation: we're happy to help with higher-level things: if you want to post the code you have that's doing (i allege) non-idiomatic things someone will take a look and suggest a better approach

14:25 Saturnation: thanks, trying to learn the language, read "Joy of Clojure" and produce a product all at the same time...

14:25 hiredman: clojurebot: mutability |brings| virapinama-dukkha

14:25 clojurebot: Alles klar

14:26 leafw: away Fiu!

14:29 Saturnation: crap, Lisp-1 :)

14:29 amalloy: hiredman: google tells me you misspelled viparinama

14:30 Saturnation: lisp-1 is great. i hated having to call (funcall foo)

14:30 and #'bar when i just want the function named bar

14:30 * Saturnation is used to Lisp-2

14:31 Saturnation: just remember that I'm in a Lisp-1 :)

14:31 hiredman: amalloy: as it is a transliteration from a non-ascii language spellings are ambiguous

14:31 Saturnation: I can't really put a let in a proxy, now can I?

14:32 dsop: has someone encountered NoSuchMethod error org.apache.tools.ant.util.FileUtils.getFileUtils()Lorg/apache/tools/ant/util/FileUtils; ? running leiningen 1.5.1?

14:37 Saturnation: Thank god for JVM first class functions!!!

14:38 manutter: dsop: I'm not sure if it's the same error, but leiningen 1.5.2 just came out to fix a couple bugs, you might want to try that

14:39 dsop: manutter: I have the most recent leiningen

14:39 manutter: in fact it worked with 1.4.1

14:39 manutter: but now I have this strange error. I hva eant 1.8.0

14:40 markoman: so what is list 1 and lisp 2?

14:41 mec: clojure is lisp 1, lisp 2 means functions and vars have different namespace so you could do (let [inc 5] (inc inc)) and it would work fine

14:43 but you have to do crap like (map #'inc (range 10)) to pass a function or (map #(funcall % 1) [inc dec]) to call a pass function

14:51 Saturnation: os Clojure's let like Lisp's let or let*?

14:51 * Saturnation thinks he read it as let*

14:52 opqdonut_: let*

14:52 serial plus you can shadow previous bindings from the same let

14:52 Saturnation: that eliminates that explanation :)

14:52 opqdonut_: yep

14:53 mec: CL's let is just a function call so its fairly pointless

14:53 opqdonut_: (let [x (f x) x (g x) x (h x)] x) is a nice idiom ;)

14:54 mec: I think in that case you're better of just ((comp h g f) x)

14:54 * Saturnation wonders if he can trust IntelliJ's debugging variable values...

14:54 opqdonut_: mec: I was joking

14:56 * Saturnation is doubting his ability to do infix math :)

14:56 Saturnation: prefix even

14:57 mec: once you get used to it you'll start screwing up order of precedence in infix math

14:59 Saturnation: Nah, the problem was that I was reading infix as prefix :)

15:02 technomancy: dsop: any plugins that could be interfering? IIRC autodoc bundled a version of ant at one point that was breaking things.

15:03 dsop: technomancy: yes I already commented autodoc

15:03 it broked it in the first place. technomancy nosuchmethod on ant seems strange

15:03 on an ant method

15:03 technomancy: if you haven't re-run lein deps it'll still be in lib/dev

15:05 dsop: technomancy: it happen during lein deps

15:05 technomancy: I removed lib/ and retry, tsill the same

15:06 clojure 1.2

15:06 http://pastebin.ca/2046502 << technomancy

15:07 technomancy: how about project.clj?

15:14 dsop: technomancy: sec..

15:15 http://pastebin.ca/2046505 < technomancy

15:38 technomancy: dsop: works fine here; maybe a user-level plugin or something

15:47 dsop: technomancy: okay I'll try, thanks

15:51 Saturnation: Is there any way to develop in the REPL and save the state of the REPL as an application a la Lisp?

15:51 image even

15:53 technomancy: Saturnation: no, there are no CL-style images

15:54 Saturnation: just finding the develop cycle a bit sluggish compared to Lisp

15:54 Maybe I need to compile into the REPL?!?

16:18 fliebel: dnolen: Have you seen this? Constraint solving collision detection. http://altdevblogaday.org/2011/04/11/unexpected-speculative-stability/

16:19 dnolen: fliebel: yes really cool :)

16:19 markoman: mec: ok, i think ive seen #'notation on scheme or somewhere earlier

16:22 mec: markoman: probably, in clojure i believe its a reader form for (var something)

16:28 amalloy: #' is common in common lisp, but means something different than it does in clojure. not sure what it is in scheme, but if it exists i doubt it's the same as either CL or clojure

17:01 matthias__: what would be your libraries of choice for making a 3d game in clojure?

17:01 chouser: penumbra

17:02 matthias__: im thinking maybe penumbra is too low level. maybe i could use a 3d engine that doenst have clojure bindings. or maybe i'll just stick with penumbra :>

17:02 chouser: of course I've never made a 3d game in clojure, nor used penumbra, so it would probably be best to ignore me.

17:02 matthias__: heh

17:02 chouser: matthias__: LauJensen did something with "monkeyengine" or some such.

17:03 LauJensen: JMonkeyEngine is so sweet. However I recall a news on disclojure recently where I saw that somebody had outdone me

17:03 matthias__: someone made something called clj3d. dont think the name was jaujensen though

17:03 what did you make with jmonkeyengine?

17:04 LauJensen: I had a beautiful island sitting in a troubled see, with clouds floating above and a giant sphere which you could control :)

17:04 Apage43: I've used straight JOGL for a game before

17:04 not with clojure though

17:05 my game wasn't 3d either.

17:05 matthias__: oh, you're the bestinclass guy

17:09 LauJensen: right

17:09 amalloy: hey, haven't seen LauJensen around recently

17:10 devn: heya lau

17:10 * devn tips his hat

17:10 znutar_: does JOGL give much abstraction beyond just a binding for opengl calls?

17:10 LauJensen: Hi guys

17:10 matthias__: penumbra is that much more than a wrapper for opengl either i think. well it can also draw text and open a window and get input and stuff

17:11 why did you call your website "bestinclass"? :|

17:12 LauJensen: matthias__: You're the first guy to ask me :) A decade ago I was working with the backoffice for a dell support team in Copenhagen. We grouped the individuel agents into Worst of Breed, Middle and Best In Class. I liked that predicate so much that I figured I wanted an email with that name. 6 years later I wanted to boot up a company to make some fast money and since I already had the domain, it seemed simple just to run with it... and

17:12 here we are :)

17:13 matthias__: makes you sounds a bit arrogant :p

17:13 LauJensen: matthias__: Only arrogant people read it like that actually :)

17:14 matthias__: no u r >:(

17:14 :p

17:14 devn: matthias__: are you matt g?

17:14 matthias__: no

17:14 i'm matt l

17:14 devn: nevermind! :)

17:14 matthias__: who's matt g?

17:14 devn: another cool guy, like yourself

17:19 matthias__: i've been looking at clj3d, but im not even sure if you can make games with it. seems like all it does is cisplay some shapes

17:20 LauJensen: Just hook into JMonkeyEngine directly then. Its fairly straightforward

17:21 matthias__: i'll look into it

17:21 LauJensen: I said HOOK

17:22 matthias__: :D

17:29 amalloy: matthias__: good news: complex shapes are built out of simple shapes

17:31 matthias__: it does draw complex shapes. im not sure if it does anything else though

17:31 amalloy: what more do you want from a 3d graphics engine? graphics engines draw shapes

17:32 LauJensen: matthias__: I get the sense that you're looking for something like "(defn game [] (portal2/createFromScratch))" amirite? You should check out Visual Studio Gamers Edition :)

17:33 mec: i would settle form a portal2/GiveMeAKeyRightNow

17:34 matthias__: well why would i switch to something that does less than what im using now (which is penumbra)?

17:34 im not sure if clj3d is suitable for games even. i just dont really get what it can do or not

17:35 im not even sure that i want something that does more than penumbra. just checking out all the options

17:41 devn: the reason to switch or not is revealed by attempting to switch :)

17:43 LauJensen: Good night all

17:44 matthias__: night

17:52 leeda: This is hard to search for, what does #() do?

17:55 amalloy: leeda: #(inc %) is (fn [x] (inc x))

17:55 leeda: amalloy: ah, thanks

17:55 matthias__: http://clojure.org/cheatsheet

17:55 leeda: cool

17:55 hiredman: #(inc %) is inc

17:55 amalloy: hiredman: yes, obviously

17:56 but it's an easy way to explain the syntax

17:56 leeda: you can even try macroexpanding it: ##(macroexpand '#(+ (dec %1) (* 3 %2)))

17:56 sexpbot: ⟹ (fn* [p1__19724# p2__19725#] (+ (dec p1__19724#) (* 3 p2__19725#)))

17:57 dnolen: leeda: note that you can't nest #()

17:57 leeda: cool

17:58 raek: ,(read-string "#(+ (dec %1) (* 3 %2))")

17:58 clojurebot: (fn* [p1__279# p2__280#] (+ (dec p1__279#) (* 3 p2__280#)))

17:59 raek: actually, it's done at read-time

17:59 ,'#(+ (dec %1) (* 3 %2))

17:59 clojurebot: (fn* [p1__281# p2__282#] (+ (dec p1__281#) (* 3 p2__282#)))

20:36 TimMc: $findfn \f "oo" "bar" "foobar"

20:36 sexpbot: [clojure.core/str clojure.contrib.string/as-str]

20:51 kephale00: Is there a parallel juxt?

21:20 amalloy: kephale00: juxt is a special case of map. write pjuxt with pmap, if you want

21:20 kephale00: sure, thats what i do

21:21 it just struck me as amusing

21:21 : P

21:22 err… i dont have it written as pjuxt though. i may have to poke around at that

21:30 amalloy_: interestingly enough juxt isn't written with a map though

21:41 * devn wishes he would have jumped on the ticket to fully test juxt, comp, etc.

21:42 mec: mainly for performance: (defn mjuxt [& fs] (fn [& args] (map #(apply % args fs))))

21:43 kephale00: mec: aha

21:48 mec: s/args fs)/args) fs/

21:49 aw sexybot fail

21:55 amalloy: mec: i don't think either of us has sufficient knowledge to assert that juxt isn't written with map for performance, although i agree it's likely

21:56 it might be because someone wanted to make sure that juxt wasn't lazy

21:56 mec: if all of those werent written out by hand for performance, than someone just likes to type a lot

21:57 amalloy: mec: oh, the variadic unrolling is for performance, sure

21:57 mec: ya

21:59 amalloy: mec: incidentally, if that bugs you, rich would love for someone to figure out a way to write a macro generalizing the unrolling of comp, juxt, and family

21:59 mec: challenge accepted

22:00 amalloy: i spent a while working at it but couldn't find a way to make the use of the macro less complicated than the expansion :P

22:00 kephale00: heh

22:00 amalloy: mec: sweet. you'd win my heart

22:06 has anyone been reading the "lock-free algorithms" series raymond chen is running over at the old new thing? seeing all that pain invested in inventing (atom nil) makes me love my language

22:06 mec: im thinking something that looks like (unroll num-args1 num-args2 gen-case-expr)

22:07 amalloy: mec: really? seems cleaner to me to only have num-args, and make juxt/comp use unroll twice

22:08 mec: so (def juxt (unroll [1 2 3] [0 1 2 3] (reduce #(conj %1 (apply %2 x y z args)) [] fs))

22:08 amalloy: true, they do both have the same args pattern

22:09 amalloy: but see eg (source map), which unrolls only one thing

22:12 mec: huh i wonder why doseq and for dont have helper functions

22:13 amalloy: $source for

22:13 sexpbot: for is http://is.gd/7z5P5L

22:14 * amalloy is embarrassed to never have asked that question

22:15 amalloy: or just write (defmacro doseq [& args] `(dorun (for ~@args))) :P

22:15 mec: ya pretty much

22:31 is there a way to remove with clojure.walk/postwalk

22:37 hiredman: you want zippers

22:37 clojure.zip

22:52 mec: hmm i got partial but unroll is already a nasty beast

23:10 dnolen: erg how do you get symbols in a macro macro?

23:11 hiredman: dnolen: what do you mean?

23:13 dnolen: hiredman: https://gist.github.com/921056

23:14 hiredman: uh

23:14 you only need a single level of `

23:14 dnolen: hiredman: the internal macro doesn't need the syntax quote?

23:15 hiredman: syntax quote expansion happens at read time, the reader can't tell the difference

23:15 you only have multiple levels of syntax quote when you have levals of unquote between

23:15 `~`

23:15 dnolen: hiredman: so I just need to return a list from the macro?

23:16 hiredman: (list ...)

23:17 well, actually

23:17 you are better off doing `~`

23:19 but you will need to manage gensyms your self

23:20 you could also pull the inner macro out in to a function

23:26 livingston: kinda stupid question: in ns bar I have (fn [foo] `(baz ~foo)) when I run that I get bar/baz as the first symbol I really want just baz with no ns... how do I do that?

23:27 mec: (list 'baz foo)

23:28 pdk: ,'baz

23:28 clojurebot: baz

23:28 pdk: ,`baz

23:28 clojurebot: sandbox/baz

23:28 livingston: no way to do it with the backquote because that's really convenient for building up big lists etc.

23:29 pdk: ,`'baz

23:29 clojurebot: (quote sandbox/baz)

23:29 pdk: welp

23:29 mec: ,`(~'baz ~foo)

23:29 clojurebot: java.lang.Exception: Unable to resolve symbol: foo in this context

23:29 mec: gotta be careful of symbol capture when you do that tho

23:30 livingston: what would it capture?

23:31 I actually want just plain old baz in there not it's value or anything, just the symbol

23:31 mec: ~'baz will give you the symbol in a syntax-quote

23:31 clojurebot: http://clojure.org/data_structures#toc10

23:33 livingston: that seems like all I want then.

23:34 a little extra hackery that I don't really like though kinda defeats the advantage of the backquote (in my case) if I then have to tilde quote a "plain" symbol

23:38 amalloy: livingston: why would you want baz there if you don't know what function it refers to?

23:39 livingston: amalloy: symbols are the data in my case

23:39 I just want lists of symbols

23:39 amalloy: livingston: then i'd write foo as (partial list 'baz)

23:40 livingston: amalloy: in this case foo is a gross over-simplification of what's actually going on

23:40 amalloy: heh

23:42 livingston: I do symbolic AI, so my data is things like (livingston programs-in-language clojure) or (Colorado has-capital Denver)

23:42 symbols as data is a fairly natural fit here, or at least they were when I programmed in common lisp, I'm assuming the same thing will work well here

23:44 amalloy: livingston: sure. less common but viable

23:44 livingston: so the inventors of lisp were all AI hackers, they did this all the time ;)

23:46 cemerick: livingston: why not use keywords and vectors -- if it's data you're working with, that strikes me as much more clojure-idiomatic…

23:46 mec: ^^

23:46 cemerick: I obviously don't know what you're up to :-)

23:46 amalloy: livingston: i was going to suggest vectors too, or perhaps maps

23:47 livingston: vectors / lists - I don't see that that matters much?

23:47 amalloy: i don't see any particular reason to use keywords though. maybe '(colorado :has-capital denver) - like a keyword for the structural data, symbols for the meaningful data

23:47 livingston: vectors are easier to build data out of

23:48 because they have literal syntax

23:48 cemerick: livingston: vectors evaluate to themselves, lists require quoting. Similar to how keywords evaluate to themselves, while syntax-quoted symbols interpolate *ns* as you've seen.

23:48 livingston: as far as keywords most things do actually have a ns, at least all the data it would be things like (gene/EG_182 ro/isIndirectTemplate uniprot/A23P56) ...

23:49 cemerick: keywords may be namespaced as well

23:49 amalloy: cemerick: good point about syntax-quoting symbols

23:49 cemerick: ,:gene/EG_182

23:49 clojurebot: :gene/EG_182

23:49 livingston: in RDF (semantic web representation) things have namespaces and names (sounds like symbols) ... so I'm just bringing them in that way

23:49 cemerick: er

23:49 ,(namespace :gene/EG_182)

23:49 clojurebot: "gene"

23:50 livingston: ,(name :gene/EG_182)

23:50 clojurebot: "EG_182"

23:50 amalloy: &[`[a :a] (list 'a :a))

23:50 sexpbot: ⟹ [[clojure.core/a :a] (a :a)] ; Adjusted to [(clojure.core/apply clojure.core/vector (clojure.core/seq (clojure.core/concat (clojure.core/list (quote clojure.core/a)) (clojure.core/list :a)))) (list (quote a) :a)]

23:50 livingston: oh

23:50 cemerick: Symbols are fundamentally intended to refer to things, usually vars. Keywords are "just data".

23:50 livingston: I thought it would write with a ":" somewhere in there?

23:50 cemerick: (not really, but in the scope of this conversation…)

23:50 amalloy: cemerick: "usually vars" seems like an overbid to me

23:50 cemerick: ":" is just reader syntax

23:51 amalloy:

23:51 feh

23:51 amalloy: "overbid"?

23:51 amalloy: *laugh*

23:51 cemerick: i'm a bridge player :P

23:51 cemerick: ah

23:51 "a bridge too far" perhaps :-P

23:51 amalloy: cemerick: i'll tell all your friends you write all your code with global vars, no local bindings

23:52 cemerick: ha

23:52 actually, that's true :-P

23:52 livingston: I guess I could use vectors... actually there's nothing about my code currently that would disallow it - it all uses sequences (I think?)

23:53 cemerick: amalloy: I view let-bindings as something less than interned vars. Because the name is entirely local, it's largely irrelevant.

23:53 livingston: is there any advantage to keywords? other than the non-quoting ?

23:53 cemerick: "less than" re: a lesser variety of "reference"

23:53 amalloy: livingston: people will be able to read your code

23:53 (har har)

23:54 livingston: '(far bar baz) is no less readable than [:foo :bar :baz] and arguably more so

23:54 cemerick: I find the quote character really distracting, actually.

23:54 Sitting haughtily so far above the baseline.

23:55 livingston: it's a very clear flag that we're talking data. I find the absence of one but no evaluation disturbing ;)

23:55 amalloy: not like the trusty colon, propping up the data it represents

23:56 livingston: but you're not really talking data. you're trying to interleave data with operations using syntax-quote

23:56 cemerick: Yeah, you can rely on the colon, salt of the earth as it is. It's even got built-in redundancy, so you know it'll scale.

23:56 livingston: is there anything fundamentally extra effecient for keywords vs. symbols (I'm assuming a keyword is just a symbol with more crap on it, right?)

23:57 amalloy: keywords evaluate faster and look themselves up in maps faster

23:57 because they're interned, they use identity to mean equality

23:58 &(identical? :a :a)

23:58 sexpbot: ⟹ true

23:58 amalloy: &(identical? 'a 'a)

23:58 sexpbot: ⟹ false

23:58 livingston: the reason I was using the syntax quote is things like this: `((~ice iao/IAO_0000219 ~gene) (~gene rdfs/subClassOf so/SO_0000704)) to create a list of rdf triples quickly, using a template that I have some of the values for and some come in from a function call or something

23:59 amalloy: livingston: so? [[ice :ioawhatever gene] [gene :rdfswhatever :sowhatever]]

23:59 livingston: so a quoted symbol is never interned?

23:59 chewbran1a: technomancy: ping

Logging service provided by n01se.net