0:17 wei_: to answer the above question lein-ring takes an :init function that's great for db connections
0:24 akhudek: hm, anyone here use perforate?
0:49 tyler: is there a way to see what lib lein is trying to download a dependency for?
0:52 akhudek: lein dep :tree
0:52 shows all the deps and their dependencies
0:53 also, if you aren't using it, use lein-pedantic
0:56 tyler: akhudek: thanks
0:56 akhudek: the problem i was running into was it threw an exception before lein deps completed becuase there was o dep in clojars
0:56 so the output of :tree would have never been shown
0:57 akhudek: ah
0:58 tyler: trying to use aleph but yammer metrics jar is fuqored i think
0:59 akhudek: tyler: why not http://
1:00 tyler: akhudek: because i never heard of it before? thanks for the link
1:01 (inc akhudek)
1:06 zakwilson: Is there something like subs that can take a negative start? I know it's trivial to write.
1:07 akhudek: zakwilson: don't think so
1:08 zakwilson: And so util.clj grows.
1:36 xeqi: tyler: it wasn't printing out what was missing? can you paste a project.clj that does it?
1:36 tyler: xeqi: it was user error my bad
1:36 typo in project.clj
1:55 how do you get a new object in cljs? like a Date with an arg passed into constructor
1:57 bbloom: same was as in clojure: use the (Date. 123)
1:58 which is just shorthand for (new Date 123)
1:58 although in this case, i guess it's js/Date
1:58 tyler: ah thnx
1:58 bbloom: ,(macroexpand '(Date. 123))
1:58 clojurebot: (new Date 123)
1:59 bbloom: but you really want (js/Date. 123)
2:24 yunfan: i checked an repo and when running lein repl , the dependancies is so crazy, it require soooooooo many
2:58 tomoj: .
3:05 Lajjla: tomoj: do you till love me the most
4:16 robewald: pass
4:37 borkdude: say I've got this project.clj like here: https://
4:38 I see lib-noir uses a different clojure version, ring version etc, so how do these "conflicts" resolve?
4:38 I mostly copied these settings from a luminus project btw
4:58 kral: namaste
5:01 sirup: I keep getting an error about "Can't dynamically bind var: clojure.core/slurp" when I attempt to stub slurp with clojure.contrib.mock. Code + error here: https://
5:10 hmm.. seems to work when I directly depend on org.clojars.echo/test.mock "0.1.2" instead of clojure.contrib and include echo.test.mock
7:29 bosie: how would i test if a function is lazy
7:30 if the operation itself (to retrieve an element) is highly expensive
7:47 ucb: bosie: I'm curious as to why you need to check this?
7:47 bosie: ucb: so i know its lazy
7:47 ;)
7:47 marvin2: Hi, I've clobbered up a namespace and have made a symbol point to a non-standard value; is there any way to get the original binding back?
7:47 ucb: and what would you do with that knowledge afterwards? I guess I'm saying I'm interested in what you would do with this knowledge
7:48 bosie: ucb: i would use it accordingly. if i didn't know if map was lazy or not, i would use map very differently
7:49 ucb: hmm
7:49 bosie: ucb: since there are plenty of use cases with my function that dont require to realize the entire list
7:49 ucb: I'm wondering in what cases knowing whether an fn is lazy or not matters much
7:49 bosie: ucb: it returns a list though
7:50 so i would use it like (map #() (my-expensive-function [1 2 3]))
7:50 magnars_: ucb: I guess if map was not lazy, you would be more careful about using `take` first.
7:51 clgv: &(apropos "lazy")
7:51 lazybot: java.lang.RuntimeException: Unable to resolve symbol: apropos in this context
7:51 ucb: magnars_: indeed; I'm trouble figuring out why you shouldn't have all things being lazy to begin with
7:51 and then ... well, not bother about it
7:51 bosie: ucb: right but i dont know if my implementation is lazy or not
7:52 ucb: bosie: so, I'd say that it is if it's a combination of lazy fns
7:52 clgv: bosie: you can test the return value of a function if it is a clojure.lang.LazySeq via instance?
7:53 bosie: hm
7:53 k
7:54 clgv: &(instance? clojure.lang.LazySeq (map inc (range)))
7:54 lazybot: ⇒ true
7:55 bosie: thank you, will try
8:18 squidz: im trying to use dommy which is like hiccup for clojurescript, but am confused how I am supposed render the created html. This may be javascript specific, but if anybody could guide me, id be thankful
8:32 SonderbladeWork: why doesnt this work? (map #({:x %}) [1 2 3])
8:35 Anderken1: SonderbladeWork: because #({:x %}) means (fn [v] ({:x v})) - you're calling the map
8:44 clgv: SonderbladeWork: use #(hash-map :x %) instead
8:44 &(map #(hash-map :x %) [1 2 3])
8:44 lazybot: ⇒ ({:x 1} {:x 2} {:x 3})
8:45 SonderbladeWork: clgv: thanks
8:57 MikeSeth: for defrecord, is the recommended naming convention CamelCase or something else?
8:59 augustl: MikeSeth: CamelCase, yeah
9:00 MikeSeth: thanks
9:39 jtoy: hi all
9:51 squidz: whats are the best libs to use If I want to create a single-page-application in clojure?
10:00 g4mm4: can anyone recommend a mysql library for clojure?
10:00 clojureQL wasnt updated in a while and throws also some errors when requiring
10:01 squidz: g4mm4: korma
10:01 g4mm4: squidz: nice
10:17 clgv: squidz: ring+compojure
10:22 MikeSeth: hm, sublime repl keeps hanging
10:33 squidz: MikeSeth: use emacs
10:34 clgv: MikeSeth: I think the most supported environments are emacs, vim clojure and eclipse/counterclockwise
10:34 MikeSeth: yeah, I know
10:34 emestee@terminata:~$ wc -l .emacs
10:34 145 .emacs
10:34 :P
10:35 clgv: humm got only 122, might be because I only use it for sbcl atm ;)
10:36 llambda: stuartsierra: is this totally evil and bad? --> https://
10:36 arrdem: ^
10:37 clgv: llambda: depends what guarantees you want...
10:37 yogsototh: Hi all. I'd like to take a look at clojure by building a minimal application I'll host on heroku. Is there a standard/recommended way of doing this ?
10:40 llambda: clgv: okay, so kind of evil? :)
10:40 clgv: llambda: there are also macros that do a similar aliasing of vars from different namespaces
10:41 llambda: midje used something like that (at least until 1.4)
10:42 llambda: clgv: originally i was going to use a macro, but it didn't seem necessary
10:42 clgv: llambda: you only need a macro for that task if you want to specify the variable names you want to alias.
10:43 llambda: e.g. (alias my.ns var1 var2 ...)
10:44 stuartsierra: llambda: yes
10:44 It breaks identity of Vars.
10:45 clgv: stuartsierra: is there something preventing true "reference variables" to be used for API namespaces?
10:46 stuartsierra: clgv: I don't understand the question.
10:48 clgv: stuartsierra: I mean code like the one from llambda usually occurs when someone wants to build an API namespace that exposes all functions an external use wants to use. so in this namespace you often just want to build an alias to a function in a nested implementation namespace
10:48 *external user
10:48 stuartsierra: Why not just have one namespace?
10:50 clgv: stuartsierra: most likely to separate different concerns
10:50 stuartsierra: Namespaces are just that, a space for names. If you want the whole API available as one set of names, then it's one namespace.
10:50 clgv: I mean the implementation of those if you have a small API but larger implementations behind it
10:51 stuartsierra: I noticed that for example midje did aliasing that way to build "midje.sweet"
10:51 llambda: clgv: that's exactly why i'm doing it
10:52 stuartsierra: I can't comment on Midje, haven't used it much.
10:52 llambda: it seems like i'm "doing it wrong" tho :)
10:52 i'm coming from python, so that's probably why my brain is tainted
10:52 clgv: In my projects I did need something like such an alias only once yet. so I cannot argue that much for it.
10:53 llambda: i'm trying to avoid writing the same set of functions twice
10:53 stuartsierra: Namespaces are not equivalent to modules in the Python sense.
10:53 llambda: yeah i'm realizing that more and more, stuartsierra
10:53 stuartsierra: Clojure really doesn't have modules in that sense.
10:53 llambda: i miss my modules
10:54 stuartsierra: Namespaces are only there prevent symbols from clashing. Nothing more. How you structure your code is up to you.
10:54 llambda: stuartsierra: what if i wanted to "import" these http functions from the library i'm wrapping?
10:54 stuartsierra: Don't.
10:54 llambda: it's basically just HTTP verbs wrapped around a central "request" function (which i'm redefining)
10:55 so the best practice is to write the same set of functions twice, in this case?
10:55 stuartsierra: If you're changing the definitions to be specific to your library, then yes.
10:55 llambda: twice in my library, i mean
10:56 well i don't mean twice in the sense, once in their library, once in mine: it will happen twice in my library between the oauth1 and oauth2 namespaces
10:56 stuartsierra: If they're the same, then define them in one place and make that namespace part of your public API.
10:56 llambda: okay
10:56 e.g. if it were a "client" namespace?
10:56 the HTTP functions could live there
10:57 and then the library could be used by requiring the proper oauth namespace and the client namespace
10:57 stuartsierra: sure
10:57 llambda: all right
10:57 i can do that
10:57 gfrederi1ks: I'm having trouble with streaming JSON as a ring response
10:57 llambda: i just assumed oauth2/get oauth1/post, etc would make for a more user-friendly api
10:58 thanks for indulding my incompetence :)
11:00 stuartsierra: Your users will thank you in the long run if you keep your code as simple as possible and don't play tricks with Vars. :)
11:05 llambda: stuartsierra: that sounds like sane advice to me :)
11:10 gfrederi1ks: if I want to stream data into a ring response from another thread I have the issue of handling errors -- having already returned a 200 to the ring adapter, when something goes wrong on the streaming thread I don't know how to turn the response into a 500
11:11 pl6306: Hello, I am new clojure user. Is this the right place to ask questions on how to use it?
11:12 gfredericks: pl6306: yes
11:12 pl6306: I am looking at this function (defn log->list ...) what does "->" mean?
11:13 gfredericks: it's just a naming convention
11:13 usually A->B suggests the function converts an A to a B
11:13 -> is a legal part of the naming syntax
11:13 pl6306: got it so it just part of a name
11:13 gfredericks: yep
11:13 pl6306: Thanks!
11:13 gfredericks: np
11:21 MikeSeth: will require and friends compile the lib on the fly?
11:22 gfredericks: if they haven't been AOT'd, yes
11:24 MikeSeth: ahhh
11:25 sorry, rtfm'ing
11:30 papachan: hello
11:30 i am trying to do an import of my file into REPL
11:30 but i have a ClassNotFoundException com.clojurebook.CustomException java.net.URLClassLoader$1.run (URLClassLoader.java:366)
11:30 my start project is like this
11:30 http://
11:31 Anderken1: papachan: you did not add . to the classpath
11:31 gfredericks: papachan: your classpath doesn't include the root dir
11:32 Anderkent: I strongly recommend picking up lein so that you don't have to worry about the classpath
11:32 that or mvn, but lein is much easier to get started with
11:34 papachan: oh yes i use lein and it work
11:35 but i want to import simply my class into REPL
11:35 will try to not include .
11:36 ok
11:38 tried: java -cp ./clojure-1.4.0.jar clojure.main -r .
11:38 gfredericks: you want -cp .:./clojure-1.4.0.jar
11:41 papachan: ok i uderstance
11:43 clgv: -cp .:clojure-1.4.0.jar even ;)
11:46 Anderkent: Is there an idiom for dynamically selecting which namespace to use depending on some state? I'd rather avoid having to use protocols or multimethods, what I have is two namespaces with the same signatures, and one wrapping ns that delegates to one of these : (if (is-live?) (real-ns/do-stuff) (fake-ns/do-stuff))
11:49 noidi: Anderkent, what you probably want is protocols and polymorphism
11:49 TimMc: No, it sounds like situational polymorphism, not data polymorphism.
11:49 noidi: then you can configure which protocol implementation to use based on the state
11:50 Anderkent: eh, I was hoping I could use a ns like an object, but guess not.
11:50 TimMc: (I'm just making up jargon here.)
11:50 noidi: protocols are the closest you can get to a first-class namespace in clojure
11:51 clgv: TimMc: you do that often lately ;)
11:51 Anderkent: noidi: yes, but they're too annoying to work with, esp for such uncomplicated problem
11:51 MikeSeth: for (defrecord Foo) Foo is an internet symbol that is not a var, correct?
11:51 interned*
11:52 TimMc: clgv: It's on account of my getting old and decrepit.
11:52 Anderkent: I want dependency injection :P
11:52 clgv: TimMc: had to look up that last word - decrepit ;)
11:53 MikeSeth: it'll be a class that defrecord statement generates
11:53 papachan: thanks it work fine with my classes folder
11:53 clgv: Anderkent: first-class functions ;)
11:53 MikeSeth: clgv: ah
11:54 noidi: MikeSeth, interning means creating a var for a symbol
11:54 MikeSeth: clgv: so I need to use import if I want to use it in another namespace?
11:54 TimMc: noidi: No it doesn't.
11:54 clgv: MikeSeth: right. better use the automatically generated constructor function "->Foo"
11:54 MikeSeth: oh, that is new then
11:54 noidi: TimMc, ok, looking up or creating :) http://
11:55 clgv: clojure 1.4 (or maybe 1.3 already...)
11:55 TimMc: noidi: Oh, by "interning" you mean "using clojure.core/intern"? Sure.
11:55 MikeSeth: thanks!
11:55 TimMc: Interning in general has nothing to do with Clojure.
11:58 MikeSeth: Oh, I finally get it
11:58 * MikeSeth has a bulb moment
12:02 jtoy: if I include a namespace that has a method and then do (resolve (read-string "my_fn_from_other_ns")) it returns nil
12:02 why cant i resolve it?
12:03 gfredericks: how did you "include" it?
12:04 jtoy: gfredericks: (use 'interests.enrichments)
12:04 TimMc: 25 cents on Gilardi Scenario
12:05 gfredericks: I'll take that bet
12:05 however I don't know why it's not working
12:06 presumably it's some detail you're not mentioning because it didn't occur to you it might be a problem
12:06 TimMc: jtoy: Is this in the REPL?
12:06 jtoy: TimMc: yes
12:07 TimMc: in code I do (:use [interests.enrichments])
12:07 I think I see
12:12 TimMc: jtoy: The :use is in your ns statement?
12:26 gfredericks: would it be reasonable for a lein plugin to hook the 'jar' task and do some git introspection and write a `git-commit.sha` file to /resources?
12:27 TimMc: Sounds good.
12:28 gfredericks: But bonus points if you can create that file in the commit the jar is based on by achieving a hash collision.
12:29 gfredericks: huh; leiningen.pom/read-git-head seems to exist
12:29 technomancy_: gfredericks: you can add :filespecs to project.clj that can have arbitrary bytes or paths
12:29 see `lein help sample`
12:30 gfredericks: technomancy: I saw that recently; it's not clear to me exactly what that means or how I would use it
12:30 technomancy: yeah it's not a very good interface
12:30 will be rewritten from scratch for 3.0
12:33 Sonderblade: how do you get the first/any item in a map in clojure?
12:33 technomancy: Sonderblade: you can't
12:34 maps aren't ordered
12:34 err--you can't get first; you will get an arbitrary k/v pair using clojure.core/first
12:35 hyPiRion: ,(first (sorted-map 3 :third 1 :second 0 [:first]))
12:35 clgv: Sonderblade: since maps are seqable you can do the following, but there is no guarantee on the order ##(first {:a 1 :b 2})
12:35 lazybot: ⇒ [:a 1]
12:35 clojurebot: [0 [:first]]
12:35 hyPiRion: But I suspect you don't want the sorted-ability. Though it's nice to know about.
12:36 Sonderblade: i know maps are not ordered i just want any
12:40 dnolen: Sonderblade: first does what you want
12:41 kalasjohnny2000: &join #devops
12:41 lazybot: java.lang.RuntimeException: Unable to resolve symbol: join in this context
12:41 kalasjohnny2000: sry
12:41 hyPiRion: heheh
12:43 kalasjohnny2000: talking about it, what's the most decent way to make a git push and the branch gets into a stage environment?
12:43 like heroku does, but on my own server...
12:43 I did try with git hooks, but it feels a bit shakey.
12:45 is jenkins the way to go?
12:45 nDuff: kalasjohnny2000: *shrug*. Are you already using any ops-automation tooling?
12:45 kalasjohnny2000: ...if you're already a Pallet, Chef or Puppet shop, then it makes sense to leverage that.
12:45 kalasjohnny2000: @nDuff pallet would be the most reasonable, yes.
12:46 nDuff: ...then you can push out config changes with the same infrastructure you use for code changes.
12:46 kalasjohnny2000: that's what I want, yes. What is the best... crate... for this?
12:47 pl6306: What does "->" mean in (-> "http://
12:47 kalasjohnny2000: @pl6306 -> means "take the object coming afterwards and apply all the functions after it"
12:47 yacin_: ,(-> [[1 2] 3 4] first first)
12:48 clojurebot: 1
12:48 yacin_: ,(-> [[1 2] 3 4] first second)
12:48 clojurebot: 2
12:48 kalasjohnny2000: @pl6306 http://
12:48 pl6306: Thanks!
12:49 nDuff: kalasjohnny2000: Actually -- not in a great position to tell you, there. My personal experience is mostly with Chef; Pallet looks like 0.8 will finally be fitting the bill re: most of my use cases, but it wasn't quite baked for what I needed in the past.
12:49 dnolen: pl6306: it's important to note that -> is a macro, it just transforms the syntax
12:50 tbatchelli_m: kalasjohnny2000: you can always drop by #pallet and ask
12:51 kalasjohnny2000: thank you both of you, @nDuff and @tbatchelli_m :)
13:05 borkdude: Is there a name for apps built with ring, compojure, lib-noir and hiccup? I suggest: Hiricono apps. Say yes to Hiricono! Or Ricono if you don't use hiccup.
13:07 * jeremyheiler wonders how inebriated borkdude is.
13:09 borkdude: lol, I just made this up while biking home, sorry
13:09 jeremyheiler: lol nice
13:10 ejackson: bokdude: or orinoco
13:11 borkdude: ejackson nice
13:13 maybe Luminus should be renamed to Orinoco, I wouldn't mind ;)
13:13 unless there is some nice reasoning behind "Luminus"
13:51 gfredericks: technomancy: using the private leiningen.pom/read-git-head for getting the commit is a bad idea?
13:51 technomancy: gfredericks: the jar contains the pom with the tag; can you just get it from there?
13:53 gfredericks: from META-INF/maven/group/artifact/pom.xml?
13:54 technomancy: sure
13:54 also pom.properties if you don't feel like busting out a parser
13:54 gfredericks: you correctly guessed whether or not I felt like busting out a parser!
13:55 technomancy: I suspect you'd much rather bust out some sick rhymes about XML.
13:56 gfredericks: though to be fair, I probably would have just used a regex. I wonder how many problems I would hava had at that point.
13:56 TimMc: 7
13:56 * technomancy awkwardly segues to http://
13:58 SegFaultAX: technomancy: That's awesome.
13:58 gfredericks: technomancy: so it'd be hard to write a general lib for reading this due to having to know the group/artifact to get the path, eh?
14:00 technomancy: (be sure to visit http://
14:00 TimMc: Nedroid has quite a few of the lulz.
14:00 technomancy: gfredericks: well every lein-produced jar will have a pom.properties on the classpath, yeah
14:03 jcromartie: *phew* I just solved my JSON dilemma
14:04 create my.project.json namespace with encode and decode functions that wrap whatever lib I decide to use tomorrow :)
14:05 dakrone_: jcromartie: yes, that is always a good idea
14:05 jcromartie: I think clojure.data.json has the best API, honestly… the :key-fn and :value-fn are just about the simplest solution possible
14:05 no multimethods, or installing handlers, or maps of types to functions
14:05 functions!
14:05 what a concept ;)
14:26 patbrown: Does anyone know the significance of #_(function)? For instance in the pedestal.io user.clj file found here https://
14:26 More specifically, what's the underscore for?
14:26 arkx: It's a comment
14:26 tbaldridge: The reader drops whatever is next
14:26 SegFaultAX: patbrown: It comments out the next form.
14:26 Anderkent: patbrown: #_ is a reader macro that ignores the next form
14:27 TimMc: ,[1 #_ 2 3]
14:27 clojurebot: [1 3]
14:27 TimMc: patbrown: ^
14:27 tbaldridge: compare to:
14:28 SegFaultAX: patbrown: http://
14:28 tbaldridge: ,[1 (comment 2) 3]
14:28 clojurebot: [1 nil 3]
14:28 patbrown: So, the only reason to use it in this instance is for terseness?
14:28 TimMc: patbrown: No, the point is that those are different.
14:28 [1 nil 3] is not [1 3]
14:29 patbrown: Oh, so you use it, so you don't return a nil?
14:29 tbaldridge: patbrown: in your example from pedestal, the function now returns the result of the call to in-ns, instead of just returning null
14:29 *nil
14:29 SegFaultAX: patbrown: No. You use it when you want to comment out a form.
14:29 ,(+ 1 #_ 2 3)
14:29 clojurebot: 4
14:30 TimMc: It's pretty rare to see anyone use the comment macro.
14:30 SegFaultAX: ,(+ 1 (comment 2) 3)
14:30 clojurebot: #<NullPointerException java.lang.NullPointerException>
14:30 tbaldridge: except for Rich :-P
14:30 TimMc: What you'll sometimes see is this:
14:30 SegFaultAX: patbrown: Note that when the first of those forms is evaluated, it's like the 2 isn't even there.
14:30 TimMc: ,[1 #_(comment 2 3 4 5) 6]
14:30 clojurebot: [1 6]
14:31 TimMc: (since #_ only takes out one form)
14:31 .[1 #_2 #_3 #_4 #_5 6] is more annoying to type
14:31 ,[1 #_2 #_3 #_4 #_5 6] that is
14:31 clojurebot: [1 6]
14:31 SegFaultAX: TimMc: Although that gives me some fun ideas for code obfuscation :)
14:32 Make it as hard as possible to determine which forms are actually evaluated.
14:32 TimMc: SegFaultAX: #_ can also stack, if you want obfuscation.
14:32 ,[1 #_#_#_#_ 2 3 4 5 6]
14:32 clojurebot: [1 6]
14:33 SegFaultAX: Wow, I didn't know that.
14:33 Glenjamin: hi guys, is there a common idiom to take an input stream and read it into a byte array?
14:33 TimMc: and it does weird things to anon fn args
14:33 patbrown: I just read the definition in the linked reader page. I'm still a little lost as to the practical usage of it. I stumbled across this because I'm working on conditioning my repl for cljs development. Is there any reason why in pedestal they load up a dev namespace instead of using a function to load code into the user namespace?
14:34 SegFaultAX: patbrown: In the case of the code you linked, they probably did it that way because you don't need to actually refer to anything inside the dev namespace.
14:35 It's purely for testing or development or whatever.
14:35 patbrown: That form is commented out because they don't want to call dev/start when that dev function is run.
14:36 patbrown: Why put it in there at all then?
14:36 tbaldridge: maybe because it's alpha code?
14:37 patbrown: Just like with the clojurescript one project, the boys at relevance do things way differently than I see anyone else do them.
14:37 SegFaultAX: That code is still highly active.
14:37 patbrown: My questions have been answered, thanks. Reader macros are an interesting part of clojure I've yet to explore.
14:38 technomancy: I put in comments to do things like launching a dev jetty into production code
14:39 TimMc: patbrown: If you use #_ instead of ;; you can provide (well-formed) code samples in a way that your editor will syntax-highlight them. :-)
14:39 patbrown: That's the rub I gather.
14:39 SegFaultAX: I find ;; to be mostly useless.
14:40 TimMc: It's also a way to comment out a multiple-line expression.
14:40 hyPiRion: ,(let [a 10] (inc a) #_=> 11) ;)
14:40 clojurebot: 11
14:40 patbrown: It just looks better and it doesn't return nil, still giving you proper repl feedback
14:41 TimMc: hyPiRion: Awful/
14:41 ,(let [a 10] (inc a) #_=> 'eleventy) :-(
14:41 clojurebot: eleventy
14:41 SegFaultAX: I prefer "threeve"
14:42 jro_: when I run lein repl, I get an error: No such var: user/help, compiling:(NO_SOURCE_PATH:1:12391)
14:42 TimMc: jro_: Does that happen in just one project?
14:43 jro_: TimMc, yes, if I don't have project.clj, the error disappears
14:44 TimMc: jro_: But does it happen in multiple projects?
14:44 SegFaultAX: Is anyone here using Immutant?
14:45 TimMc: Probably.
14:45 SegFaultAX: TimMc: Are you?
14:45 patbrown: In addition, I'm using piggieback for a cljs browser repl, however when I compile, my "out/goog" directory always goes in the root of my project, instead of "resources/public/js/out/goog" Does anyone know how to set the output folder? Note: my "out/cljs" and "out/clojure" are outputted under the "public/js" path.
14:46 jro_: I've currently just one checked out. Well, if it is just (user/help), then there is no problem.
14:46 TimMc: SegFaultAX: No, then I would have said "I am". :-)
14:46 SegFaultAX: TimMc: Maybe you were just being coy. ;)
14:46 TimMc: I don't know what Immutant is. Some kind of webby thing?
14:47 SegFaultAX: Yea, it's a Clojure wrapper for JBoss AS 7
14:47 squidz: SegFaultAX: why is it useful?
14:47 SegFaultAX: Basically, torquebox for clojure (if you know what that is)
14:47 TimMc: I don't know what JBoss or torquebox is either. :-P
14:48 SegFaultAX: squidz: JBoss AS 7 or Immutant?
14:48 TimMc: Ah, from Wikipedia I gather that it is a beany webby thing.
14:48 SegFaultAX: TimMc: Yea, one of themz.
14:49 It brings together a bunch of really useful stuff all in one coherent package: hornetq, infinispan, automatic clustering, distributed transactions, etc.
14:50 From an architectural perspective it seems very attractive to have all of that already available in your stack as opposed to hacking together a bunch of disparate components (zeromq, redis, etc.)
14:50 squidz: is it worth it to integrate all that stuff into a clojure app? or wouldnt using individual packages like clojurewerkz provides?
14:51 be just as good
14:52 jcrossley3: SegFaultAX: i'm one of the immutant developers. wassup?
14:52 SegFaultAX: squidz: I guess it depends on the project. I haven't used Immutant yet, but if I had to venture a guess I'd say because someone else has already taken the time to make sure everything is functional and well integrated.
14:52 jcrossley3: I know, I've seen all your talks! Great work by the way. :)
14:52 borkdude: gfredericks about the version from pom.properties: https://
14:52 jcrossley3: SegFaultAX: thanks :)
14:53 squidz: SegFaultAX: ah right, so Immutant already did all the work to wrap everything in clojure
14:53 SegFaultAX: jcrossley3: What is unclear to me is the actual deployment aspect of Immutant. Eg, I have 5 fresh EC2 nodes, how do I bootstrap immutant on them and deploy new versions across them?
14:53 jcrossley3: And how do I do things like rolling deploys, etc.
14:53 jcrossley3: squidz: some folks like to grow their stack organically. some don't. plenty of ways to shave a yak. :)
14:53 SegFaultAX: jcrossley3: It seems like most of your talks and the documentation are geared toward the development phase and not so much on actually running in production.
14:54 squidz: Plus JBoss AS7 which is awesome all by itself.
14:54 squidz: If you're interested, checkout out jcrossley3 on InfoQ
14:54 squidz: Search for "immutant" or Jim Crossley
14:54 squidz: ill take a look thanks
14:55 jcrossley3: SegFaultAX: that is true regarding dev vs prod. the former has been our emphasis up to this point. hoping to focus more on prod during beta cycle.
14:56 jcromartie: well that was easy
14:56 (-> (ScriptEngineManager.) (.getEngineByName "JavaScript") (.eval "print(\"Hello\");"))
14:56 SegFaultAX: jcrossley3: Unfortunately I need that piece before I feel like it's worth spending the time cozying up to Immutant. Do you have any idea when more information will be available? Or do you have tips for getting started now?
14:56 jcromartie: apparently Java 6 comes with Rhino now?
14:56 jcrossley3: SegFaultAX: ec2 is rough due to lack of multicast. we're in the process of getting autoscaling to work on openshift, which is backed by ec2. once we figure that out, we'll publish that config to other native ec2 users who'd prefer not to use openshift.
14:57 SegFaultAX: jcrossley3: I'm not tied to EC2 per se. What do you recommend?
14:57 jcrossley3: (And is there documentation for production usage on it?)
14:58 jcromartie: (as of 2006 ...)
15:00 jcrossley3: SegFaultAX: folks running it production now are using homegrown solutions, e.g. scp/rsync of immutant archives. so the story is muddy at the moment.
15:00 it's on our list :)
15:01 SegFaultAX: jcrossley3: <3 I'll keep watching closely, then. Is Immutant one of your teams top projects atm?
15:02 jcrossley3: SegFaultAX: it's the primary focus of two of our team members. :)
15:07 tcrawley: SegFaultAX: you're welcome to join us in #immutant as well - it has a higher percentage of Immutant users compared to here
15:24 Raynes: gfredericks: You work at groupon?
15:25 borkdude: what is the typical way of deploying a ring webapp? uberjar, run with lein server, war?
15:30 maybe I should try immutant?
15:30 amalloy: borkdude: all of those are things that people do, yes
15:30 in fact i myself have done all of them
15:30 Raynes: I prefer using lein ring, but uberjars and wars are fine.
15:30 But the way amalloy and I run our open source stuff tends to be pretty ghetto, so might not want to listen to us.
15:31 borkdude: amalloy I actually have two simple ring apps I want to host, I don't want to configure a web server, so invoking an embedded jetty is very convenient
15:31 amalloy: so don't do it
15:32 Raynes: amalloy: But then he'll have to actually configure jetty. He needs a web server behind jetty to reverse proxy it otherwise.
15:32 No matter what he has to configure a web server.
15:32 amalloy: or just...run it on the right port from lein run
15:32 weavejester: Embedded Jetty behind an nginx stack would be my personal preference
15:32 Raynes: That's what we do.
15:33 nginx is easy to configure for a simple proxy to a jetty server.
15:33 borkdude: Raynes I have nginx running, it forwards to 8080 for one app, I can let it forward to 8081 for the second app etc
15:33 * Apage43 is running lein run with nginx reverse proxing for my ring stuff
15:33 Apage43: I was doing a separate jetty and scp'ing wars around for a while
15:34 but that required making sure I did all my setup and teardown cleanly
15:34 weavejester: I tend to use "lein ring uberjar" rather than "lein run". It's easier to deploy.
15:34 Apage43: just killing the thing was less to worry about
15:34 borkdude: weavejester what's the difference between lein ring uberjar and lein uberjar?
15:34 Apage43: actually I'm using lein ring uberjar. I'm a bit confused =P
15:35 But yeah, I didn't actually want to install lein on the prod webserver box
15:35 just java
15:35 so I can java -jar the thing
15:35 weavejester: borkdude: The former automatically adds a main method that calls the handler, integrates :init and :destroy, and adds a manifest to make the jar executable.
15:35 Apage43: borkdude: ring uberjar gives you a java -jar'able jar that runs the thing
15:35 borkdude: weavejester this is just what I need tnx
15:48 lsoa: I'm trying to read and parse a json file using clojure.data.json
15:49 I'm getting an error, presumably because there's some invalid json in there
15:49 Exception JSON error (unexpected character): clojure.data.json/-read (json.clj:222
15:49 is there a way to get the like that triggered that error?
15:50 line*
15:53 MikeSeth: idiomatic way to replace elements m to n in a vector with another value?
15:56 arohner: MikeSeth: (vector (concat (take m v) new-vals (drop n v))
15:56 maybe off-by-ones in there
15:56 MikeSeth: thanks, pondering
15:56 bbloom: arohner: you want vec, not vector
15:57 ,(vector (range 5))
15:57 clojurebot: [(0 1 2 3 4)]
15:57 bbloom: ,(vec (range 5))
15:57 clojurebot: [0 1 2 3 4]
15:57 arohner: bbloom: thanks, I always get those mixed up
15:57 pjstadig: if you know it's a vector you might just use assoc over the range of m to n with reduce or something
15:57 instead of going to a seq and back to a vector again
15:58 bbloom: arohner: here's a mnemonic: vector is longer than vec, and [(foo)] is longer than [foo]
15:58 pjstadig: that assumes the resulting length doesn't change
15:58 arohner: bbloom: meh. it's only a problem when doing IRC-based development
15:59 bbloom: arohner: what? you bothered to install lein? i do all my coding in lazybot
15:59 arohner: :-)
16:00 rkneufeld: patbrown: Hey, was your question about the dev namespace fully answered? I can provide further detail if you'd like
16:08 borkdude: MikeSeth https://
16:12 patbrown: Ryan, my man! Yeah, the use of the reader macro was well explained. Pedestal is a lot like cljs one. There is so much to it, it's hard to know where to start asking questions.
16:14 rkneufeld: Hey! I thought it might be you. Anyways, we load things through the dev function on account of some nastyness with user code. If there are any problems in your user code, it stops a REPL from opening whatsoever. We didn't have enough time to fully iron out the details in our dev code and opted to go the same route and keep the (dev) security blanket.
16:20 patbrown: rkneufeld: I've been playing around with the app and app-tools portion of pedestal. I really like the approach to handling state without atoms. What's your role been in the project?
16:21 rkneufeld: patbrown: I've spent most of my time in app as well. Taking on the role of community manager for the time being as well.
16:22 borkdude: how to change the portnr for the jetty instance, just PORT=xxxx java -jar bla?
16:24 nDuff: rkneufeld: ...ahh -- you're with Relevance? If you don't mind the asking -- do y'all have any intent to maintain Avout?
16:25 rkneufeld: nDuff: I believe that one is totally in the hands of David Liebke. He is no longer with Relevance.
16:25 * nDuff was a bit disappointed in evaluating Avout's usability recently to find some fairly big holes (ie. no transaction cancellation on thrown exceptions).
16:25 nDuff: Ahh.
16:25 Saw y'all on the copyright statement and assumed it was still a Relevance-sponsored project.
16:26 rkneufeld: No worries, doesn't hurt to ask.
16:28 borkdude: I'm editing a remote file with emacs… it works...
16:41 stuartsierra: As far as I know, no one is currently maintaining Avout.
16:42 bbloom: Bummer, since it's far more pleasant of an API than ZooKeeper... *cringe*
16:44 stuartsierra: ZooKeeper's not that bad.
16:45 bbloom: I found Netflix's ZooKeeper to be much more useful (and reminiscent of Google's internal Chubby API)
16:46 s/useful/usable/
16:46 zookeepers API is just kinda... raw
16:46 er i mean Netflix's Curaitor
16:46 thats the word i wanted
17:18 thm_prover: I'm writing a graphical REPL.
17:18 What is the right way to connect to the REPL / handle long computations?
17:19 llasram`: thm_prover: https://
17:20 thm_prover: llasram`: the word interrupt appears twice on that page, claiming nREPL has interrupt support. do you know ho the interrupt suppor towrks?
17:21 https://
17:24 llasram: thm_prover: I actually right now don't know much about nrepl outside of the basic architecture
17:25 thm_prover: llasram: thanks for the pointer; building on nREPL looks like a better solution than throwing together my own adhoc solution
17:27 technomancy: you get a lot of useful stuff for free if you build on the nrepl stack
17:54 ppppaul: anyone here using clojure and beanstalk, also how do you feel about it if you are?
17:56 nDuff: ppppaul: You mean Amazon's, or a different beanstalk?
17:59 ppppaul: aws
18:02 i'm wondering about people's experiences using it with clojure. i have no prior experience with beanstalk
18:03 jeremyheiler: ppppaul: We use it to deploy headless Clojure webapps and it seems to work well. (I wasn't the one who set it up.)
18:06 ppppaul: jeremyheiler, can you give me more information as to how you use it? do you deploy via git or war or via lein-beanstalk? does it help you with staging and development environments too?
18:08 kursion: Hi there, i'm new in Clojure's world :)
18:09 auser: hey hey kursion
18:11 kursion: Hey auser :)
18:11 ppppaul: i'm also a user
18:14 jeremyheiler: ppppaul: We deploy WAR files. For environemnts, we built a little webapp that manages the environments and allows us to click a button to deploy.
18:15 ppppaul: interesting
18:15 thanks
18:16 jeremyheiler: ppppaul: np
18:17 auser: jeremyheiler: is that open-source?
18:17 that's sexy
18:17 squidz: i'm getting a lot - Use of undeclared Var - errors while trying to import domina in my namespace. Does anybody else use Domina know what im talking about?
18:17 jeremyheiler: auser: Unfortunately no.
18:18 auser: I bet it'd be rad if it was
18:18 jeremyheiler: auser: I would be, but it's not a high priority at the moment.
18:18 It*
18:18 auser: gotcha
18:24 * gfredericks starts learning to use nrepl.el
18:24 jimkcar: does `lein repl` execute the defined -main function?
18:24 gfredericks: no
18:25 jimkcar: I have code with a database connection that throws errors when I lein repl without the database being there. I can't figure out how it is running.
18:25 what about macros?
18:26 nDuff: jimkcar: Could this code be getting executed as part of evaluating the namespace?
18:26 jimkcar: if you do a (def connection (connect-to-the-database)) at top level somewhere, that would do it.
18:26 jimkcar: yeah I assume so, but I can't find where its happening
18:26 nDuff: jimkcar: (in which case, you might consider (def connection (delay connect-to-the-database))
18:27 jimkcar: what about a defmacro .... ~(connect-to-database)
18:27 nDuff: jimkcar: Can you post your code? (refheap is a local favorite, if you don't have a preferred ad-free pastebin already)
18:27 jimkcar: macros just rewrite your code; they don't change when the rewritten code is run.
18:27 jimkcar: ok.
18:27 let me scan again, and pastebin
18:29 nDuff: ...if you can include a stack trace from a failure alongside said code, that would be helpful too.
18:29 * nDuff tries to remember if refheap supports multi-file pastes (akin to gist.github.com's support for same).
18:30 gfredericks: how does one restart the nrepl session, other than restarting emacs and nrepl-jack-in again?
18:30 * nDuff personally doesn't use nrepl-jack-in at all, and thus uses nrepl-quit and nrepl to start from emacs, and lein repl from the command line.
18:31 nDuff: ...but I'm sure there's an easier way.
18:32 kursion: Is sublimetext a good editor for clojure guys ?
18:33 technomancy: it's not OSS
18:33 so the tooling around it is not very good from what I gather
18:33 gfredericks: there's an nrepl-restart command
18:33 amalloy: gfredericks: i think there's nrepl-restart or something
18:34 well, that's my helpful advice for the day
18:35 gfredericks: technomancy: amalloy: thank you both equally
18:35 kursion: Ok technomancy
18:35 Ty
18:36 technomancy: normally I say "go with what you already know" but if you don't know any OSS editors then that's different
18:37 kursion: I find it very light and handy + lots of plugins, better than npp
18:37 amalloy: can we call the process of open-sourcing a previously closed-source app "ossifying"?
18:37 technomancy: inc by me
18:37 kursion: :D
18:38 (Going to sleep a bit, cya tomorrow)
18:38 nDuff: kursion: There are a few things pretty much critical -- paredit and nrepl support
18:39 kursion: I wouldn't seriously consider anything without solid implementations of both.
18:39 kursion: Nrepl = terminal +bash
18:39 nDuff: Not at all.
18:39 kursion: What are your editors .?
18:40 amalloy: those things are important eventually, but if you're just playing around with the language any text editor is fine
18:40 nDuff: Having editor nrepl support means your editor knows what's in your namespaces
18:40 kursion: Hum you mean like the eclipse plugin... ?
18:40 nDuff: ...so it can autocomplete functions no matter what library they're from, it can retrieve documentation straight from the live Clojure instance, it can directly run your code...
18:41 kursion: the best implementation of all these things is emacs. That said, the Eclipse plugin is working on it, and may eventually become passable.
18:41 kursion: Yeah the only IDE that support clojure is eclipse and the plugins
18:41 nDuff: kursion: Keep in mind that emacs has been editing LISPs for decades. Its tools in the area are very, very good.
18:42 kursion: What definition of "IDE" do you use wherein Emacs doesn't qualify?
18:42 kursion: Emacs is alive ? Interresting .... :)
18:42 technomancy: nDuff: everyone knows IDE is short for "editor that's good at Java"
18:42 nDuff: :)
18:43 kursion: Autocomplete + intelli at least, then snippets
18:43 technomancy: snippets are for languages that don't have macros
18:44 kursion: True point
18:44 nDuff: emacs very much has autocomplete, and that autocomplete is nrepl-assisted
18:44 and, as technomancy says, snippets are moot in Clojure.
18:44 ...If you need them, you're Doing It Wrong.
18:44 technomancy: yeah, vim has autocomplete too
18:44 * dnolen likes snippets for ns declarations
18:44 nDuff: (though yes, of course, they do exist for emacs, if you need them)
18:45 * algernon uses them for boring copyright notices
18:45 technomancy: dnolen: yes, but only because you don't have access to macros that early in the file
18:45 hyPiRion: snippets are usually for `lein new` to handle
18:45 nDuff: kursion: Take a look at the intro video for Emacs Live
18:45 __zero: what's paraedit and nrepl?
18:45 technomancy: the ns macro is not very egalitarian
18:46 kursion: Gonna redownload emacs to see this , has i said i started clojure today
18:46 dnolen: technomancy: I actually have a couple other snippets that come in handy, but it's true I do rely on them less than when I code in say JS.
18:47 nDuff: kursion: http://
18:47 kursion: Ty for your advices nDuff. I appreciated this little talk :)
18:47 hiredman: clojurescript is just a very complicated set of javascript snippets dnolen has
18:47 technomancy: haha
18:47 kursion: Ok bookmarked for tomorrow :)
18:47 dnolen: hehe
18:48 nDuff: __zero: paredit is a mode specialized for editing LISPs; basically, it makes the editor structurally aware.
18:48 ivan: ~paredit
18:48 clojurebot: paredit is not for everyone, but what you need to understand ís how to become the kind of person that paredit ís for.
18:49 technomancy: ~botsnack
18:49 clojurebot: thanks; that was delicious. (nom nom nom)
18:50 nDuff: __zero: ...and nrepl is a protocol and set of tooling for, well, networked REPLs -- with support for adding things like session support, debugging operations, and other extensions via middleware.
18:52 technomancy: ,(update-in {} [] assoc :hello "world")
18:52 clojurebot: {nil {:hello "world"}}
18:53 technomancy: ^ is that surprising to anyone else?
18:53 * nDuff is surprised
18:53 amalloy: not anymore
18:53 pjstadig: it has a logic to it
18:53 seems like maybe a bug though
18:54 technomancy: amalloy: because you're paying attention to Leiningen bug reports?
18:54 amalloy: technomancy: because i've known about it for years?
18:54 technomancy: or that
18:54 hyPiRion: how does that make sense, really?
18:55 amalloy: i doubt it will ever change; i just use my own update-in* when i care about the behavior for an empty keyseq
18:55 pjstadig: amalloy: :(
18:55 hyPiRion: ,(= (update-in {} [] assoc :a :b) (update-in {} [nil] assoc :a :b))
18:55 clojurebot: true
18:55 amalloy: hyPiRion: the contract (perhaps implicit) of update-in is that you give it a non-empty keyseq; if you give it an empty keyseq, any behavior makes sense
18:56 pjstadig: ,(doc update-in)
18:56 clojurebot: "([m [k & ks] f & args]); 'Updates' a value in a nested associative structure, where ks is a sequence of keys and f is a function that will take the old value and any supplied args and return the new value, and returns a new nested structure. If any levels do not exist, hash-maps will be created."
18:56 amalloy: whether that's a good contract i don't want to argue about, but that's the way in which it makes sense
18:56 pjstadig: not sure that's implicit
18:56 [k & ks]
18:56 technomancy: hyPiRion: when you put it that way it's gotta be a bug
18:56 possibly a documentation bug
18:56 but a bug
18:57 oh; hrm. didn't consider :arglists as part of the doc.
18:57 so anyway, it's silly but not worth the trek to jira.
18:57 hyPiRion: technomancy: well, the signature is [k & ks], where ks is a seq only. k has to be something
18:58 technomancy: yeah, I'll buy that
18:58 don't have to like it though
18:59 hyPiRion: Well, I think it should throw some Arity Exception if it follows that contract.
18:59 It would be better to have it accept [] though.
18:59 technomancy: clojure isn't really well-known for validating inputs to functions
18:59 *ahem* contains?
18:59 Apage43: it accepts it, it just doesn't do something particularly helpful
18:59 hyPiRion: well, that doesn't mean we can better on doing that
19:00 technomancy: hyPiRion: depends how you define "we" =)
19:00 hyPiRion: well, that was one interesting sentence I made.
19:00 technomancy: Clojure contributors :)
19:02 amalloy: technomancy: doesn't contains? throw an exception as of 1.5?
19:02 technomancy: whoa seriously?
19:02 hyPiRion: huh, I only thought its docstring changed.
19:02 technomancy: holy smokes
19:03 hyPiRion: ,(contains? [1 2 3] :hrrng)
19:03 clojurebot: false
19:03 technomancy: I thought that was a line drawn in the sand
19:03 amalloy: ,*clojure-version*
19:03 clojurebot: {:major 1, :minor 5, :incremental 0, :qualifier "RC6"}
19:03 amalloy: ,(contains? :a :b)
19:03 clojurebot: #<IllegalArgumentException java.lang.IllegalArgumentException: contains? not supported on type: clojure.lang.Keyword>
19:04 amalloy: &(contains? :a :b)
19:04 lazybot: ⇒ false
19:04 hyPiRion: To be fair, I was more surprised by the fact that it didn't throw there.
19:13 arrdem: anyone here used the Lexington lexer before?
19:27 rationalrevolt: would someone mind looking at a sudoku code at: https://
19:28 jimkcar: nDuff: I figured it out.
19:29 nDuff: it was a dependency doing it to me.
19:29 when I require this project, it spews log messages. https://
19:40 Apage43: rationalrevolt: at first glance it looks like it's not going to short-circuit once it finds -a- solution, but could potentially generate a lot of solutions before it finally unwinds and discards most of them
19:40 possibly finding many of them multiple times
19:42 mm ,maybe
19:42 depends on the lazy-seq behavior
19:43 rationalrevolt: you could try grabbing a stack trace at that point (throw and catch an exception) to see how far down it is when solved? is returning true
19:43 could be insightful
19:43 amalloy: you're just trying to run the same naive search in a much larger probability space when you start from a blank board. you're generating gazillions of unsolvable boards
19:44 (probably. i haven't looked too deeply, but that's one plausible explanation)
19:45 rationalrevolt: hmm, in the solved? function, i tried adding a print of the return value - and it prints true multiple times - that should mean it should break out of the solve function
19:46 i know shuffle is not lazy, but cant imagine why that will cause an infinite loop - if i remove the shuffle and start with a blank board - it completes very quickly
19:46 Apage43: you may be being bitten by chunked seqs
19:46 * nDuff was thinking just that
19:47 nDuff: ...if that's the case, the number of times it continues will be bounded at the chunk size, so it's easy to look for.
19:48 rationalrevolt: I'm positive the shuffle is causing this behavior, because solving an empty board completes immediately
19:48 without the shuffle i mean
19:49 Apage43: what's probably happening is that the un-shuffled prospective boards all short-circuit to unsolveable very quickly
19:49 where is with the shuffle it is actually going down a lot of solveable paths (due to chunked seqs)
19:49 *wheras
19:49 *whereas
19:51 rationalrevolt: try wrapping your (for …) in one of the seq1's defined in the answer here: http://
19:51 if that fixes it, then it is due to chunked seqs
19:53 jimkcar: nDuff: did you see what my problem was? I'd be interested to know if others see it too
19:55 if you create a new lein project, add [zookeeper "0.91.0"] as a dependency, lein repl, then (require '[zookeeper :as zk]) log4j messages will spew
19:55 0.9.1 rather
19:56 rationalrevolt: Apage43: I have a feeling you may be right, will check
20:02 Apage43: You were right. If i made the result of shuffle a lazy seq, it completes as expected.
20:02 nDuff: jimkcar: Sounds like a topic for a zookeeper-clj ticket. I wonder, by the way, if 0.9.1 is before https://
20:02 Apage43: interesting
20:02 nDuff: jimkcar: ...could also be a side effect of interacting with java-logging
20:03 Apage43: i guess that stops for from chunking
20:03 rationalrevolt: looks like it
20:05 jimkcar: nDuff: I've been looking through the code and don't see anywhere that would do this. If it was a side-effect of java logging, there still has to be some zk code being run to print out all the logging.
20:05 I'll submit a bug to them.
20:05 nDuff: jimkcar: Well, what's the namespace on the log messages?
20:05 jimkcar: zookeeper.ZooKeeper
20:07 nDuff: It's also possible for Zookeeper itself to be responsible.
20:09 ...static class initialization can happen pretty early.
20:09 jimkcar: yeah, they have a default console log at INFO level. I wonder if they have some log call in a static block somewhere.
20:09 ugh
20:10 I can't seem to find the log4j.properties that it uses. Probably have one hidden on my classpath somewhere...
20:14 yep. right in the static block: https://
20:28 dnolen: Simply Typed Lambda Calculus in core.logic part II http://
20:28 trying to move a bit slower than Nada's talk at Clojure/West
20:31 bbloom: dnolen: i see you moved your blog.... my blog has been somewhat stalled by my incomplete migration to a static site generator as well....
20:33 dnolen: bbloom: yeah
20:33 tieTYT: protocols dispatch on type, right? Does that mean they're only useful when you get java classes as input?
20:33 technomancy: tieTYT: unless you use records, but yeah... don't use protocols unless you have to.
20:34 tieTYT: ok I haven't learned records yet, I should look that up
20:34 technomancy: nah
20:34 bbloom: technomancy: well, i mean, records are just java types, right?
20:34 tieTYT: nah?
20:35 technomancy: tieTYT: don't bother unless you're writing performance-critical polymorphic code
20:35 which is pretty rare
20:35 bbloom: tieTYT: what technomancy means is this: many new clojure programmers come from OOP & therefore use a lot of types and records
20:35 tieTYT: don't bother with records or with prototypes?
20:35 Bronsa: protocols*
20:35 technomancy: bbloom: *hand wavy dismissal to avoid confusion around advanced topics*
20:35 tieTYT: Bronsa: right
20:35 bbloom: tieTYT: types and records are often useful, but they are most often misused. so if you are new to clojure, avoid protocols, defrecord, deftype, etc
20:36 tieTYT: i'm writing a program that dispatches based off of the domain of a url. I used multimethods for this because it didn't seem like I could use a protocol when the inputs are all strings/urls
20:36 nDuff: tieTYT: multimethods are indeed the right tool for that job
20:36 tieTYT: i need to dispatch on the value, not the type
20:36 nDuff: good to hear, thanks
20:36 technomancy: whether that's suitable for multimethods is debatable, but it's definitely not for protocols
20:36 it's likely you don't need polymorphism at all
20:38 tieTYT: well i suppose I could use a map of <string, function>
20:38 but multimethods seemed cleaner in my newbie mind
20:38 also seems to point out, "I'm dispatching on this"
20:39 nDuff: tieTYT: if a map has functions on the RHS, it's typically pretty clear that it's involved in dispatch. :)
20:40 tieTYT: i suppose that's true
20:50 Frozenlo`: Well well well... I finally made a breakthrough. It seems Googlebot is having a hard time with wrap-force-ssl. Can anyone concur?
20:55 jcromartie: is there any reason not to create a uuid for an item before inserting it in a persistent store?
20:56 ivan: Frozenlo`: you may be able to get some insight by forcing Googlebot to hit your site with webmaster tools and capturing traffic with wireshark
20:57 Frozenlo`: unpopular HTTPS servers sometimes have bugs, or use wrong options, or your certificate has some weird options Google doesn't like
20:58 you can also see if Googlebot likes an nginx/apache server you set up with the same cert
20:58 and compare that traffic to jetty (?)
21:04 Frozenlo`: ivan: I fired wireshark once last week and saw the initial handshake, but nothing beyond that. :/
21:04 dyba: I have a question about this gist --> https://
21:05 on line 19, can anyone explain what is going on with the argument to handler?
21:05 Frozenlo`: Raynes: pinnnnng. Ever had any problem with refheap's https and googlebot?
21:05 dyba: handlers take requests as arguments
21:06 so I was thinking that by writing the first argument as a map, we are using destructuring to capture the data we need
21:06 is that correct?
21:09 I noticed that {{name "name"} :params} isn't the same thing as {:params {name "name"}}
21:13 gfredericks: dyba: yeah the function takes one argument
21:13 which is assumed to be a map
21:14 and it destructures it by pulling out the :params key in particular
21:14 the value under that key is further destructured
21:14 pulling out the "name" key and binding that to the local `name`
21:16 dyba: gfredericks: thanks for the explanation! It makes sense now. :)
21:16 gfredericks: the weirdest thing about map destructuring is that the keys/values are usually the opposite of what you'd expect
21:24 noprompt: i'm a bit confused here. how do i change the behavior of ILookup when using defrecord?
21:24 gfredericks: I don't think you do. You use deftype if you want something more custom.
21:25 noprompt: gfredericks: ah, ok. that's kinda what i thought.
21:34 bbloom: noprompt: i should warn you that if you're trying to make a custom Map type, it's quite a difficult road to travel
21:34 ILookup is one thing, but map with custom lookup is quite another
21:36 MikeSeth: is it possible to create a collection that is a generator?
21:36 ahh, nvm
21:36 bbloom: MikeSeth: depends on what you mean by "generator". but mostly: yes. see ##(doc lazy-seq)
21:36 lazybot: ⇒ "Macro ([& body]); Takes a body of expressions that returns an ISeq or nil, and yields a Seqable object that will invoke the body only the first time seq is called, and will cache the result and return it on all subsequent seq calls. See also - realized?"
21:37 MikeSeth: bbloom: yeah, I sinned by not rtfm'ing, thanks
21:53 Raynos: Apparently there's a functional clojure GUI framework
21:53 one that renders "scenes" or something by taking the current thing and the previous thing and rendering an efficient diff
21:53 im trying to find it
21:54 ivan: webfui?
21:54 bbloom: Are you talking about the recently announced http://
21:54 noprompt: bbloom: yeah, i'm starting to see that.
21:55 bbloom: noprompt: see my dispatch-map for an example https://
21:55 noprompt: it's pretty tricky to get right, since there are so many interfaces/protocols/whatnot to implement
21:55 noprompt: i'm not even sure i got it 100%, what with hash codes, equality, printing, etc
21:55 noprompt: basically i want a custom type that models a CSS rule.
21:55 but acts like a map.
21:56 bbloom: noprompt: why does it need to be a custom type? why not just a CSS AST in a tree of maps?
21:56 noprompt: well i dunno.
21:56 i've take the approach of modeling the CSS like so ["selector" {:prop-1 "val" :prop-2 "val}]
21:57 but i thought it would be convenient to have Rule type that lets me lookup properties easily.
21:58 bbloom: why not just have a function of a rule map?
21:58 noprompt: can you explain what you mean?
21:59 like (defrule [selector prop-map]) ?
21:59 bbloom: describe the intended behavior of your desired ILookup implementation
22:00 Raynos: im just looking for examples of big efficient functional GUIs
22:00 noprompt: CSS rules are defined as a selector and any number of declarations.
22:00 Raynos: I cant figure out how to create large modular UI systems
22:00 noprompt: ie, div { prop: val; prop: val }
22:00 bbloom: Raynos: heh, that's a bit of an open research problem....
22:01 noprompt: i'd like the type to have a field for the selector and a field for the declaration map.
22:01 Raynos: i think webfui works
22:01 I know how to create large procedural modular UI systems
22:01 bbloom: noprompt: that's SORTA sufficient, it's worth pointing out that CSS selector rules are actually ordered maps & can have duplicate keys and what not, but 99% of the time that doesn't matter
22:01 noprompt: bbloom: right.
22:02 bbloom: noprompt: anyway, what operation are you trying to accomplish?
22:02 noprompt: so to work around that
22:02 bbloom: noprompt: you can't talk about how to model something until you talk about the operations you want to achieve on your model
22:02 noprompt: ["h1" {:prop "val"} {:prop "val}]
22:02 you can have multiple maps so you can preserve order, overwrite, etc.
22:03 bbloom: basically i wanted to make the manipulation of rules easy.
22:04 writing css in data structures is fine. but with CSS it's not as clean as hiccup.
22:04 bbloom: noprompt: do you know what types of manipulations you're making most often?
22:04 hiccup is somewhat hard to manipulate, you need to do stuff like check if the second entry in a vector is a map and then flatten seqs and what not
22:04 hiccup is optimized for expression, not for manipulation
22:05 or rather optimized for synthesis
22:05 noprompt: bbloom: right. and i think i have the synthesis part figured out pretty good. there's a few other tricks i haven't mentioned.
22:05 bbloom: but i've always wanted to have a flexible CSS that allowed you to pull apart selectors like you would a map.
22:06 bbloom: [:div.foo [:div.bar "baz"]] is easy to write & to compose construction, but if you want to manipulate them later, you're better off with {:tag "div" :attrs {:class "foo} :children { ...}}
22:06 noprompt: yeah and that's what i'm talking about. i could have it like that.
22:06 bbloom: a hiccup parser would read the vector notation and turn it in to clojure.data.xml style :tag, :attrs, :children representation
22:06 noprompt: and then write a few fn's and macros to make it easier.
22:06 bbloom: and by parser, i don't mean reader/parser like from strings
22:07 noprompt: so i guess then, in my case, {:rule {:selector "div" :declarations {}}}
22:07 bbloom: my suggestion is you try writing a function from hiccup -> xml maps (like clojure.data.xml) -> manipulation functions -> back to hiccup
22:08 this way both the synthesis and manipulation models are well known and defined for you
22:08 and you can get a feel for the design tradeoffs
22:08 then go back to designing your models for CSS
22:08 noprompt: wait, you do understand i'm trying to compose CSS not HTML right?
22:08 bbloom: consider things like add-class
22:08 or toggle-attribute
22:08 etc
22:09 yes
22:09 i'm suggesting you experiment with this in the HTML design space, since hiccup and clojure.data.xml have already have well designed models for you to play with
22:09 you'll get some insights you can apply to CSS
22:10 noprompt: bbloom: ah, right. yeah i started reading the hiccup source starting from the first commit, and slowly seeing how the library was put together.
22:10 Raynos: anyone use webfui ?
22:11 noprompt: i've pulled a lot of techniques from it.
22:11 bbloom: noprompt: if you try to write (fn toggle-class [hiccup-form] ...) vs (fn toggle-class [xml-tree] ...) you'll quickly see what i'm talking about :-)
22:11 noprompt: maybe the best thing to do is wrap up what i've got now, push up an alpha and get some input on the actual source.
22:11 bbloom: er i guess that toggle-class needs a class arg: [hiccup-form cls] etc
22:12 Raynos: noprompt: how do you avoid https://
22:12 it feels like the pattern of having `render-all ENTIRE UI` would murder performance
22:12 noprompt: Raynos: i have no clue about that stuff, sorry man.
22:12 err woman(?)
22:12 Raynos: :( sorry
22:13 bbloom: Raynos: the same way persistent data structures avoid copying everything: you share previous structure
22:13 Raynos: bbloom: that's fine, but that function returns an entire new thing
22:13 it doesn't mutate a thing
22:13 i dont understand whom you can share from
22:14 noprompt: bbloom: i'll have a look at that stuff. and like i said i'll push up the code soon and see if i can't get some better insights.
22:14 bbloom: actually i did have one other question for you regarding types.
22:14 bbloom: Raynos: like i said, functional UIs are an open reserach problem. this is tricky stuff. go look at http://
22:15 noprompt: CSS has various units. px, in, cm, em, etc.
22:15 imagine i wanted to add px and in together and get cms
22:15 (cm+ (px 40) (in 20))
22:15 akhudek: bbloom: how is your term rewriting project coming along?
22:15 Raynos: bbloom: thanks
22:16 danneu: yall know that joke about generating a random string by getting a freshman CS student to quit Vim?
22:16 well i'm a Vim user using Evil-mode that just got stuck in Emacs-mode for 10 min
22:16 bbloom: noprompt: that might be a reasonable place for a type, but it might also be a reasonable place for [40 :px]
22:17 akhudek: i published an early work in progress to https://
22:17 noprompt: bbloom: that could work, but i'm going to have to do a lot of extra checking
22:17 bbloom: noprompt: i think cssgen does custom units, no idea of the implementation is any good
22:18 noprompt: bbloom: i'll look at it
22:18 bbloom: akhudek: kovasb had asked me about UpValues in mathematica: https://
22:19 noprompt: danneu: i tried emacs with evil-mode yesterday.
22:20 was impressed at how much better the support for vim key bindings have gotten
22:21 bbloom: thanks again
22:21 cya
22:22 akhudek: bbloom: I like the configurable strategy, looks like a fun little project!
22:23 bbloom: akhudek: the piece i'm most interested in is how to combine this with computing information about the tree & then minimizing compulation when changing the tree, such that it's cheap to evolve the tree & ask questions about it over time
22:24 akhudek: bbloom: that's a really hard problem, though in my experience anytime you can save redoing rewrites is a huge win
22:26 exploring rewrites based on term size is also a massive win (e.g. knuth-bendix ordering)
22:27 * bbloom googles knuth-bendix
22:27 bbloom: akhudek: did we meet at clojure/west? i'm trying to match names to faces to IRC handles & there was much beer drank last week
22:28 akhudek: bbloom: no, I wasn't at clojure/west, though it's possible we met at the conj. I can't remember.
22:28 bbloom: akhudek: i wasn't at the conj :-P
22:28 akhudek: bbloom: ah, that answers that :-)
22:28 bbloom: random question for the room: is there a variant of (pop []) that returns nil instead of throwing an exception?
22:29 but otherwise preserves a vector
22:33 Raynes: Frozenlock: I don't think so. I wouldn't know what a problem with that looks like.
22:33 st3fan: does anyone know how to deal with multiple request params of the same name in compojure?
22:34 a request like foo?stops=a&stops=b returns "b" for (:stops params)
22:34 Raynes: Raynos: Dude. Your name is way too similar to mine.
22:35 st3fan: Raynes: nothing soundex can't fix
22:41 Raynos: Raynes: dud no u
22:41 xeqi: st3fan: compojure/handler adds ring.util.params/wrap-params, which uses https://
22:41 Raynes: Raynos: This can only be solved with fisticuffs in the courtyard. Duel at midnight!
22:41 Raynos: Raynes: https://
22:41 Raynes: Yes.
22:41 No.
22:42 IORayne
22:42 Raynos: https://
22:42 Once you get your real name on twitter
22:42 then we can duel
22:42 Raynes: I would if I could. :(
22:42 Raynos: its easy
22:42 go to SF
22:42 code at the twitter hq
22:42 wait for a good time
22:42 st3fan: xeqi: hmm i think i'll just pass them in comma separated then
22:42 Raynes: Actually, I wonder if I know anyone at twitter...
22:42 Raynos: i had to be in SF for like 6 months before I found a good time
22:42 to get my account changed to Raynos
22:43 now I need to find someone at google to give me raynos@gmail.com
22:43 xeqi: Raynes: if you do let me know, I want to stake a claim as well
22:43 Raynes: Raynos: Was there any tweets on the raynos account?
22:43 Raynos: two
22:43 from 2009
22:43 Raynes: xeqi: Yeah, the problem with the Raynes account is that there are tweets on it.
22:43 I'd have to have a really good friend to get them to give me the name.
22:49 arrdem: woah woah. Raynes AND Raynos? man gensym is fucking up tonight
22:49 Raynos: o_o;
22:54 Raynes: I feel like I've seen Raynos in other channels before.
22:55 danneu: wow
22:55 bbloom: Raynes: He's like your core.logic relational counterpart. Raynes is a function and Rayneso is the relation, but we can abbreviate Raynos
22:56 danneu: my irc client gives every name its own unique color. yet of course it gives Raynes and Raynos the same color
22:56 arrdem: ololol
22:56 Raynes: I think to think that I am Raynos's evil twin.
22:56 Raynos: Raynes: I have seen you
22:57 danneu: http://
22:57 Raynos: Raynes: do you use coffeescript?
22:57 arrdem: (inc danneu)
22:57 lazybot: ⇒ 1
22:57 arrdem: yer all green anyway on my monitor... monochrome xterm aw yeah
22:58 bbloom: danneu: haha. that sucks. i get confused when two people have the same color and are talking to each other & their names are wildly different
22:59 Raynos: danneu: :D
22:59 use a better hashing function
23:00 arrdem: gah fnparse make sense.
23:00 Raynos: it's probably the Java one TBH
23:00 Raynes: Raynos: I do not use Coffeescript at all.
23:00 arrdem: ,(.hash "Raynes")
23:00 clojurebot: #<IllegalArgumentException java.lang.IllegalArgumentException: No matching field found: hash for class java.lang.String>
23:00 Raynes: I may have wandered into the channel for one reason or another at some point.
23:00 Raynos: Raynes: then you are not my evil twin. My evil twin would use coffeescript
23:00 arrdem: ,(.hash Object "Raynes")
23:00 clojurebot: #<IllegalArgumentException java.lang.IllegalArgumentException: No matching method found: hash for class java.lang.Class>
23:00 Raynes: Fair enough.
23:00 bbloom: arrdem: hash or .hashCode
23:01 Raynes: &(hash "Raynes")(
23:01 lazybot: ⇒ -1854081710
23:01 Raynes: &(.hashCode "Raynes")
23:01 lazybot: ⇒ -1854081710
23:01 bbloom: ,(map (juxt hash #(.hashCode %)) ["Raynes" "Raynos"])
23:01 clojurebot: ([-1854081710 -1854081710] [-1854081400 -1854081400])
23:01 Raynos: I like how clojure outputs java exceptions :3
23:02 arrdem: clojure stacktraces...
23:02 * arrdem headdesks
23:04 * arrdem realizes why fnparse isn't behaving as expected
23:08 tieTYT2: my question: http://
23:09 arrdem: clj-http?
23:09 clojurebot: dakrone maintains clj-http
23:09 tieTYT2: i'm using that but i didn't see an example of how to do that
23:09 i want the image, not the html
23:10 arrdem: tieTYT2: http://
23:10 tieTYT2: nice thanks
23:11 i'm going to flag my own question as a duplicate
23:11 instead of deleting it. Might help people who search
23:11 i have another question though, I don't understand that method signature
23:12 (with-open [r (java.io.FileReader. "myfile.txt")] ...
23:12 is that assigning r to the right hand side?
23:12 how is that possible? I've never seen clojure work like that before
23:12 i mean except in a let
23:12 arrdem: so that's just a normal binding form...
23:13 we do that in let, for, doseq...
23:13 everywhere.
23:13 tieTYT2: can you do that anywhere?
23:13 arrdem: no.
23:13 tieTYT2: or are these special cases?
23:13 can i make my own function that uses this form?
23:13 this binding form
23:13 arrdem: you can build something else out of that form.
23:14 but it's the (with-open) which is creating the binding of symbol r
23:14 one could use a (let), but with-open will only execute it's body forms if the bindings were successful (no file open errors etc.)
23:17 tieTYT2: ok..
23:17 but i can't expose that let as part of my api like with-open does
23:17 right?
23:17 clojurebot: technomancy: you're right I should explain the reason. The reason is I would like to be able to call aether with an extra parameter for introducing my own :transfer-listener.
23:18 SegFaultAX: tieTYT2: What are you trying to do?
23:18 tieTYT2: SegFaultAX: nothing, just trying to understand the clojure language better
23:18 SegFaultAX: tieTYT2: What's unclear?
23:19 tieTYT2: i've seen the binding form with functions and let
23:19 but the difference with with-open is that it's exposed on the outside
23:19 SegFaultAX: tieTYT2: What do you mean exposed on the outside?
23:19 tieTYT2: and i was wondering if i can do that on functions i make
23:19 http://
23:19 the caller writes the binding form as a client
23:20 instead of the person who wrote with-open doing it on the inside
23:20 SegFaultAX: tieTYT2: You do that with lets to, though.
23:20 tieTYT2: yeah but lets are on the inside of functions
23:20 SegFaultAX: tieTYT2: And yes you can use that functionality yourself if you choose to.
23:20 tieTYT2: i can't expose them as part of the function api
23:21 wait can i do what this example does on any function I want?
23:21 i thought this was special to with-open
23:21 SegFaultAX: tieTYT2: Nothing special about it at all.
23:22 tieTYT2: Do you have a repl open?
23:22 tieTYT2: yes
23:22 xeqi: tieTYT2: you have to use a macro and transform the code, possible but rarely done
23:22 SegFaultAX: tieTYT2: True (source with-open)
23:22 Try*
23:22 tieTYT2: done
23:22 SegFaultAX: xeqi: Not that rare, really.
23:22 tieTYT2: You should see how they did it in with-open. You can use that as a template if you like.
23:23 tieTYT2: ok i want to make sure i understand this first
23:23 danneu: tieTYT2: been to the readme? lots of examples
23:23 tieTYT2: is r bound to bindings?
23:23 danneu: oh i realized i was scrolled up in chat
23:23 SegFaultAX: tieTYT2: I don't think you know what "bindings" are.
23:23 xeqi: SegFaultAX: hmm, I can't recall a similar one in clojars or lein
23:24 SegFaultAX: xeqi: A simliar what?
23:24 tieTYT2: it's destructuring right?
23:24 SegFaultAX: tieTYT2: Look at the source, it simply expands to a normal let form.
23:25 thm_prover: http://
23:25 xeqi: a defmacro that does a binding transformation into a let
23:25 tieTYT2: this source is a little advanced for me since it has a macro in it
23:26 maybe it's not a macro, but it's using ~@ and ~ and stuff
23:26 is there a simpler example I can look at?
23:27 SegFaultAX: tieTYT2: It's a macro, you can tell because it uses `defmacro`
23:27 tieTYT2: i'm just looking at this first example and wondering if two arguments are passed in or one: http://
23:27 SegFaultAX: tieTYT2: Probably safe to stay away while you're learning. Come back to it in a bit.
23:29 tieTYT2: whatever, obviously r is being BOUND to the rhs
23:29 i didn't know you could do that when you call
23:29 i thought you could only do that inside the def of a function
23:30 bbloom: odd:
23:30 (let [v [1 2 3]] (into {} [[v 1] [(seq v) 2]]))
23:30 vs
23:30 er:
23:30 ,(let [v [1 2 3]] (into {} [[v 1] [(seq v) 2]]))
23:30 clojurebot: {[1 2 3] 2}
23:30 bbloom: vs:
23:30 SegFaultAX: tieTYT2: Lets do it to (which is what with-open is using)
23:30 bbloom: ,(let [v [1 2 3]] (into {} [[(seq v) 1] [v 2]]))
23:30 clojurebot: {(1 2 3) 2}
23:30 bbloom: equiv is hard.
23:30 :-/
23:31 tieTYT2: a let is inside the def of a function
23:31 but this example is calling a function and using bindings
23:32 SegFaultAX: tieTYT2: No, it isn't.
23:32 tieTYT2: that's the thing i've never seen before
23:32 it isn't?
23:32 SegFaultAX: ,(let [a 1] a)
23:32 clojurebot: 1
23:33 tieTYT2: ok you can use it outside
23:33 is that what's going on?
23:33 SegFaultAX: ,(let [a 1] ((fn [] (inc a)))
23:33 clojurebot: #<RuntimeException java.lang.RuntimeException: EOF while reading>
23:33 danneu: you're still inside the let body
23:33 SegFaultAX: ,(let [a 1] ((fn [] (inc a))))
23:33 clojurebot: 2
23:33 tieTYT2: <tieTYT2> but this example is calling a function and using bindings as parameters
23:34 this is the the thing that's confusing me
23:34 can you show me an example doing that?
23:34 SegFaultAX: with-open isn't a function
23:35 tieTYT2: oh right
23:35 SegFaultAX: tieTYT2: It's a macro.
23:35 tieTYT2: well is that the only reason youc an do this?
23:35 SegFaultAX: tieTYT2: In this case, yes. Macros are evaluated at compile time. They're similar to functions, except their inputs are always unevaluated lisp forms and their outputs are usually also unevaluated lisp forms.
23:36 tieTYT2: They allow you to transform lisp forms from one shape to another at compile time.
23:36 tieTYT2: ok the world makes sense again
23:36 SegFaultAX: tieTYT2: In with-open's case, it's transforming the (with-open [...] ...) into a do or let form, based on the number of forms in the vector.
23:37 xeqi: &(macroexpand-1 '(with-open [r (java.io.FileReader. "myfile.txt")] r))
23:37 lazybot: ⇒ (clojure.core/let [r (java.io.FileReader. "myfile.txt")] (try (clojure.core/with-open [] r) (finally (. r clojure.core/close))))
23:37 tieTYT2: at a high level i get that it's taking that vector and saying "let myvector" when it replaces the code
23:37 SegFaultAX: tieTYT2: So if the vector is empty, it literally just becomes a normal (do ...) form.
23:37 tieTYT2: If the vector is non-empty, then it becomes (let [...] ...)
23:38 tieTYT2: ok
23:38 thanks for the help
23:39 SegFaultAX: tieTYT2: Again, I suggest deferring macros for a little while until you have a much firmer grasp on normal clojure.
23:39 tieTYT2: well i'm not trying to write them, but i come across code that uses them and it makes me question my understanding of everything else
23:43 danneu: itd be nice if slurp decompressed
23:44 ive used a few open source projects that lean on slurp and they choke on any gzipped website
23:45 Raynes: It'd be nice if people didn't use slurp as an http client. :p
23:46 bbloom: It'd be nice if stdlibs didn't try to be helpful and automatically interpret arbitrary URIs in their fopen routines!
23:46 sheesh, i had no idea that slurp would do that
23:48 tieTYT2: well it takes a URL, i thought it was meant for that
23:49 danneu: i wouldnt be surprised if you could pass it a :deflate option or something. "See clojure.java.io/reader for a complete list of supported arguments."
23:49 but i see no complete list there
23:51 tieTYT2: i'm getting this error in my repl: CompilerException java.lang.RuntimeException: Unable to resolve symbol: require in this context, compiling:(NO_SOURCE_PATH:1)
23:52 this is what I'm running: (require 'my-proj.image-site)
23:52 xeqi: tieTYT2: what namespace are you in?
23:53 tieTYT2: my-proj.image-site
23:53 wait
23:53 it worked this time
23:53 all i did is restart the repl twicew
23:59 how do I debug this exception? http://
23:59 seems like there should be a longer stack trace