2011-11-05
| 00:01 | leo2007 | something weird happened. after quitting swank-closure, port 4005 is still occupied and preventing swank-clojure from listening on that port again. |
| 00:01 | leo2007 | ideas? |
| 00:01 | ibdknox | amalloy: can anything execute as a result of doing read-string? |
| 00:02 | scottj | leo2007: how did you start swank and how did you quit it? |
| 00:02 | leo2007 | scottj: I run the swank-clojure script and C-c to quit it |
| 00:02 | scottj | swank-clojure script? |
| 00:03 | leo2007 | scottj: http://paste.pound-python.org/show/14726 |
| 00:03 | alandipert | ibdknox, binding *read-eval* to false turns off EvalReader if that answers your question |
| 00:03 | scottj | leo2007: windows? |
| 00:03 | leo2007 | scottj: osx |
| 00:04 | scottj | leo2007: why not lein swank? |
| 00:04 | ibdknox | alandipert: basically I want a safe way to read a datastructure |
| 00:04 | leo2007 | scottj: probably because I did swank-clojure first. |
| 00:04 | alandipert | ibdknox, ok yeah, do *read-eval* false |
| 00:04 | ibdknox | alandipert: awesome, thanks |
| 00:04 | leo2007 | anyway, how to find out what's listening on port 4005 and kill it. |
| 00:05 | amalloy | &(inc #=(inc 1)) |
| 00:05 | lazybot | java.lang.IllegalStateException: clojure.lang.LispReader$ReaderException: EvalReader not allowed when *read-eval* is false. |
| 00:05 | scottj | leo2007: ps look for java with classpath including swank and kill it |
| 00:05 | amalloy | leo2007: lsof |
| 00:06 | tensorpudding | awesome, grabbing clojure-contrib fails |
| 00:06 | leo2007 | amalloy: I don't know how to use lsof |
| 00:07 | leo2007 | lsof -l |
| 00:07 | leo2007 | ? |
| 00:07 | scottj | tensorpudding: using clojure 1.3? clojure-contrib is split up |
| 00:07 | tensorpudding | i'm using 1.2 |
| 00:07 | tensorpudding | i think |
| 00:07 | tensorpudding | 1.2.1 |
| 00:07 | amalloy | lsof -i:4005 |
| 00:08 | leo2007 | that returns nil |
| 00:08 | tensorpudding | anyway |
| 00:08 | leo2007 | but I can ping localhost:4005 |
| 00:08 | tensorpudding | it's a bunch of errors with Maven or something |
| 00:09 | tensorpudding | does clojure-contrib 1.2.1 not exist? |
| 00:09 | tensorpudding | is it a wrong version? |
| 00:09 | amalloy | leo2007: you can...ping it? what does that even mean? i'm sure there's no pingserver listening on port 4005 |
| 00:10 | mdeboard | ibdknox: I'm reading the models module of your blog project, but I'm not really following on the general idea of a model in Noir. I'm used to -- for better or worse -- a model being a representation of a db table. But the models.clj code looks more like a controller (well, a view in MTV world) |
| 00:10 | amalloy | (and i *think* pings are at the IP level, not the TCP/UDP level, so they don't even have a port at all) |
| 00:10 | goodieboy | how can I get the k var to execute here? (let [k '(prn "hello")] `~k) |
| 00:10 | leo2007 | amalloy: http://paste.pound-python.org/show/14728 |
| 00:11 | amalloy | goodieboy: odds are good that's not what you want to do |
| 00:11 | ibdknox | mdeboard: I don't really tell you how to do any of that, because it's really up to you how you want to organize that studd |
| 00:11 | mdeboard | Ok thanks stud |
| 00:11 | ibdknox | mdeboard: the way I tend to organize things is in the more traditional MVC sense |
| 00:11 | mdeboard | Guess I have some learning to do then. |
| 00:11 | ibdknox | mdeboard: where the view calls the model directly |
| 00:12 | amalloy | leo2007: bet you a dollar that $ ping localhost:12345 works too? it's probably either ignoring the part after the : or doing something unrelated with it |
| 00:12 | amalloy | but ping only operates at a host level. there's no way you can ping a specific port |
| 00:12 | mdeboard | ibdknox: I don't have any experience with MVC, so this is all new territory for me |
| 00:12 | leo2007 | amalloy: you owe me a dollar. |
| 00:13 | leo2007 | amalloy: http://paste.pound-python.org/show/14729 |
| 00:13 | tensorpudding | where can i see what versions of clojure-contrib are available? |
| 00:13 | tensorpudding | where doe lein dep get its jars from? |
| 00:14 | mdeboard | tensorpudding: clojars & maven |
| 00:14 | amalloy | huh. that's pretty damn weird. you can have a dollar at the conj. but what OS and/or some crazy version of ping? |
| 00:14 | tensorpudding | is clojure-contrib at clojars or maven |
| 00:14 | tensorpudding | i can't find it at clojars |
| 00:14 | mdeboard | tensorpudding: clojure-contrib doesn't exist anymore |
| 00:14 | tensorpudding | okay |
| 00:14 | mdeboard | tensorpudding: http://dev.clojure.org/display/design/Where+Did+Clojure.Contrib+Go |
| 00:15 | tensorpudding | which versions does this apply to |
| 00:15 | tensorpudding | i'm using 1.2.1 |
| 00:15 | leo2007 | amalloy: I am on osx 10.6.8. |
| 00:16 | amalloy | ANYway a quick google search reveals that ping is not related to ports at all. so while i can't explain your actual behavior, i really wouldn't worry about the possibilitythat you have a server listening on 4005: if lsof can't find it, then it ain't there, no matter what weird shit ping is doing |
| 00:17 | tensorpudding | god, this tutorial is a dud |
| 00:17 | tensorpudding | it seems to be referencing plenty of things that don't exist |
| 00:17 | jli | does | mean something special in clojure? I was hoping to use it as the name of thrush |
| 00:18 | amalloy | jli: no, but i think it also isn't guaranteed to be a valid symbol character in the future |
| 00:19 | tensorpudding | trying to require my namespace gives me an error on line 1 |
| 00:19 | tensorpudding | "Parameter declaration set should be a vector" |
| 00:19 | leo2007 | amalloy: but the point is that swank cannot start on port 4005 any more. |
| 00:19 | tensorpudding | did ns get changed somehow |
| 00:20 | amalloy | &(fn x (set) (inc set)) |
| 00:20 | lazybot | java.lang.IllegalArgumentException: Don't know how to create ISeq from: clojure.lang.Symbol |
| 00:20 | amalloy | hm. is it only defn that does that? |
| 00:20 | tensorpudding | the boilerplate generated by lein doesn't even work |
| 00:21 | leo2007 | I have "user=> Connection opened on null port 4005." printed on the terminal. |
| 00:21 | jli | amalloy: hum, thanks |
| 00:22 | amalloy | leo2007: i dunno, man |
| 00:22 | jli | leo2007: does "netstat -anp | grep 4005" say something about TIME_WAIT? |
| 00:23 | leo2007 | somehow, ping localhost:4005 is resolved to the ip address 202.106.195.30 |
| 00:23 | leo2007 | If I pass 192.168.0.101 to slime, it can connect. |
| 00:25 | leo2007 | jli: it says "tcp4 0 0 192.168.0.101.4005 192.168.0.101.55761 TIME_WAIT" |
| 00:25 | leo2007 | -p is not supported by netstat on osx |
| 00:26 | leo2007 | so that is the result of netstat -an | grep 4005 |
| 00:26 | jli | yeah, that's fine |
| 00:26 | leo2007 | what is fine? |
| 00:26 | jli | netstat -an. -p just prints the program name. |
| 00:27 | leo2007 | jli: now netstat -an|grep 4005 prints nothing |
| 00:27 | jli | so roughly, swank-clojure didn't close the port cleanly before going away, so the OS left it hanging around. it'll become available in a little while. |
| 00:27 | jli | leo2007: okay, so swank should be able to start as normal again |
| 00:27 | amalloy | leo2007: it sounds like you have slime and swank working just fine but your system thinks localhost:4005 is the IP address of some computer in russia? |
| 00:28 | leo2007 | amalloy: looks like so |
| 00:28 | goodieboy | aye, why doesn't this print? https://gist.github.com/1341105 |
| 00:30 | leo2007 | jli: not really, localhost:4005 is resolved to an strange address |
| 00:31 | jli | what? |
| 00:31 | clojurebot | what is cells |
| 00:32 | jli | leo2007: swank-clojure should be able to start normally again. |
| 00:32 | scottj | goodieboy: I think you want (~@s#) or better ~s# |
| 00:33 | scottj | goodieboy: what you have no the let has a body of prn and "test", the last of which gets returned |
| 00:33 | amalloy | scottj: not really good enough |
| 00:33 | leo2007 | jli: you are right. I can start swank-clojure except now localhost + 4005 points to somewhere else. |
| 00:33 | amalloy | you need the let to be outside of the syntax-quote |
| 00:33 | amalloy | (defmacro run [f] (next f)) ;; this is really it |
| 00:35 | amalloy | or if you want to be really verbose about it, (defmacro run [f] (let [s (rest f)] s)) |
| 00:36 | goodieboy | scottj amalloy: thanks! I don't understand, but at least I know what I'm trying to do is possible :) |
| 00:37 | amalloy | goodieboy: ask yourself: do you want to return code that calls next on the form, or do you want to call next on the form and return that as code? |
| 00:37 | amalloy | the latter: you don't want asdf to ever appear in code that clojure tries to run |
| 00:38 | goodieboy | yeah i see |
| 00:38 | goodieboy | makes sense |
| 00:38 | toxmeister | hello dears! would anyone have some ideas how to overcome this little show-stopper? http://stackoverflow.com/questions/8018207/clojure-classpath-issue-within-an-eclipse-plugin |
| 00:40 | mdeboard | toxmeister: Would it be way too snarky to say "use emacs or vim"? |
| 00:41 | brehaut | mdeboard: yes |
| 00:41 | mdeboard | Ok, I won't then |
| 00:44 | goodieboy | so i'm trying to create a "dsl" using mostly keywords/vectors. Something like this [:or {:name "test"} {:name "this"}] would get transformed into "name:(test OR this)" -- is it possible to do this without eval? |
| 00:45 | brehaut | goodieboy: yes of course |
| 00:45 | toxmeister | mdeboard: not too much, no :) - am sure it's just a silly config issue, since obviously other people (incl. laurent) have managed building this stuff. really do need RCP on this project… |
| 00:45 | mdeboard | goodieboy: Are you building a Solr interface? |
| 00:46 | goodieboy | mdeboard: well, just experimenting yes |
| 00:46 | jli | leo2007: man, why is your computer resolving localhost:4005 into an IP? do you have something weird in your /etc/hosts? |
| 00:46 | brehaut | goodieboy: i cant imagine how even using eval would help |
| 00:46 | mdeboard | goodieboy: Nice, nice. |
| 00:47 | leo2007 | jli: I have never touched that file. The whole thing is http://paste.pound-python.org/show/14730 |
| 00:47 | goodieboy | brehaut: well, i've been using clojure.walk to transform the input vector/keywords into function calls/lists, then calling eval |
| 00:48 | amalloy | brehaut: well if i implemented my code as (constantly (quote (quote "name:(test OR this)"))) an eval would be a big help |
| 00:48 | goodieboy | it works, but something tells me this is not "normal" clojure |
| 00:48 | brehaut | amalloy: lol :P |
| 00:49 | amalloy | goodieboy: agreed, it's nuts |
| 00:49 | alandipert | sweet that it's possible, though :-) |
| 00:50 | mdeboard | goodieboy: You might actually take a cue from Hiccup here. `[:name [:or '("value1" "value2")]]` or something |
| 00:50 | mdeboard | goodieboy: I've been doing a lot of work with Solr the past 6 weeks or so, so this caught my eye |
| 00:52 | leo2007 | why doesn't this (#(%1 %2) Math/sin 3e2) work? |
| 00:52 | jli | leo2007: oh, maybe you're using some cruddy DNS server that "resolves" non-hostnames to some wacky thing |
| 00:52 | goodieboy | mdeboard: nice, solr is great |
| 00:52 | alandipert | goodieboy, have you seen http://pragprog.com/magazines/2011-07/growing-a-dsl-with-clojure? |
| 00:52 | amalloy | leo2007: Math/sin isn't a function |
| 00:52 | goodieboy | alandipert: yeah, maybe time to re-read :) |
| 00:52 | amalloy | it's a method |
| 00:53 | jli | leo2007: what's your /etc/resolv.conf ? |
| 00:53 | leo2007 | jli: nameserver 192.168.0.1 |
| 00:54 | jli | leo2007: are you in China? |
| 00:54 | leo2007 | jli: yes |
| 00:54 | alandipert | goodieboy, beginning of clojurescript compiler also good. multimethods are where the money is |
| 00:54 | goodieboy | alandipert: oh you mean the source for clojurescript? |
| 00:55 | alandipert | goodieboy, yes - https://github.com/clojure/clojurescript/blob/master/src/clj/cljs/compiler.clj in particular |
| 00:56 | leo2007 | jli: China's internet is pretty shitty. |
| 00:56 | jli | leo2007: heh, yeah. so yeah, your DNS server is resolving "localhost:4005" to the IP of some silly portal thing |
| 00:57 | goodieboy | alandipert: awesome thanks. i'll have a look |
| 00:57 | jli | if you go to the IP in a web browser, you'll see |
| 00:57 | alandipert | goodieboy, np. it's dense reading but the overall layout is what you may consider emulating |
| 00:57 | jli | (that's my best guess, at least) |
| 00:58 | leo2007 | jli: but it worked before I ran into this problem. |
| 00:58 | alandipert | and omg, the conj is next week |
| 00:58 | leo2007 | amalloy: how to replace Math/sin so that the example works? |
| 01:00 | amalloy | http://stackoverflow.com/questions/5726334/passing-functions-as-arguments-in-clojure/5726449#5726449 |
| 01:01 | jli | leo2007: what? |
| 01:01 | jli | what worked? what problem? |
| 01:02 | leo2007 | jli: a silly example (#(%1 %2) Math/sin 3e2) |
| 01:03 | jli | huh? I'm.. talking about DNS |
| 01:04 | mdeboard | amalloy: Do you know of/follow any particular style conventions in your code? e.g. line length, white space, order of imports, etc. |
| 01:04 | mdeboard | er, order of requires, etc. |
| 01:04 | leo2007 | amalloy: thanks |
| 01:05 | amalloy | mdeboard: well, the lisp/scheme indentation rules. i mostly keep lines under 80 chars, but the office guideline is 100 |
| 01:05 | brehaut | mdeboard: related: http://mumble.net/~campbell/scheme/style.txt |
| 01:06 | amalloy | personally i like to line up clauses in ns forms, but not elsewhere; i know people who prefer to line up let-bindings but not ns forms. i think i'm in the minority and most people don't line up anything |
| 01:06 | scottj | I thought stu created a clojure style guidelines |
| 01:06 | mdeboard | brehaut: perfect, thank you. |
| 01:07 | brehaut | mdeboard: not perfect ;) its a scheme reference |
| 01:07 | mdeboard | brehaut: Perfect in its fit to what I was looking for |
| 01:08 | brehaut | mdeboard: re:imports, more important than order is that you should prefer refer to use, and should never use bare use in your NS (ie, use :only) |
| 01:08 | mdeboard | I see |
| 01:09 | scottj | http://dev.clojure.org/display/design/Library+Coding+Standards but doesn't mention whitespace |
| 01:10 | amalloy | brehaut: prefer refer to use? that doesn't make sense. i could see preferring require to use, though i don't really agree |
| 01:12 | brehaut | amalloy: man what am i saying. require |
| 01:12 | brehaut | definitely require not refer |
| 01:13 | brehaut | amalloy: it might be my python background that makes me prefer require |
| 01:13 | scottj | brehaut: en/don't en/you en/get en/tired en/of en/prefixing en/your en/functions? |
| 01:13 | brehaut | scottj: no |
| 01:14 | scottj | and you have to remember whether that function is in page-helpers or form-helpers or core |
| 01:14 | brehaut | i dont use hiccup, so no, i dont have to ;) |
| 01:14 | amalloy | scottj: i was going to complain about that link to library coding style, but it's much more helpful than i remember it being |
| 01:15 | mdeboard | brehaut: Eh, I only keep a `module.method(args)` convention in modules with a lot of imports. Otherwise, unnecessary, imo, since you can `import foo as f` or what not.But that's python talk and neither here nor there |
| 01:18 | brehaut | mdeboard: you can require clojure modules as shorter names as needed to. i dont understand your point |
| 01:18 | mdeboard | brehaut: Didn't have one :) |
| 01:20 | scottj | advantages of require as: 1) you don't have to list all the functions in :only 2) immediately visible where function comes from 3) can have multiple functions with same name |
| 01:31 | jli | usually I just suck it up and list things in :only |
| 01:31 | jli | future you will thank you |
| 01:47 | amalloy | scottj: fwiw (2) is rarely an issue for me |
| 01:48 | amalloy | and you can solve (3) with a :refer/:rename, but i agree usually :require/:as is better |
| 01:55 | robear | i have a clojurescript question. anyone online that can help? |
| 01:55 | ibdknox | ~anyone |
| 01:55 | clojurebot | Just a heads up, you're more likely to get some help if you ask the question you really want the answer to, instead of "does anyone ..." |
| 01:59 | robear | i am new to clojure script and wondering what the best practices are when dealing with closure structures. specifically, if i do something like (gdom/getElementsByTagNameAndClass "div") the result is an [object NodeList]. Should I iterate through the list and put it into a clojure data structure or pass it back and deal with it as a closure data structure? what is the best way to iterate through the NodeList with clojurescript? Thanks |
| 02:00 | ibdknox | robear: I transform them into a collection |
| 02:00 | ibdknox | robear: btw, you might want to check out pinot http://github.com/ibdknox/pinot |
| 02:01 | Shinka | Has anyone here used Clojure for computational biology on some cloud service ? I'm curious about the performance you could achieve. |
| 02:05 | robear | ibdknox: thanks. i see what you did with nodelist->col in dom.cljs. thanks a lot! |
| 02:11 | mdeboard | ibdknox: Does (defpartial) support a docstring |
| 02:12 | ibdknox | mdeboard: unfortunately no, though that's likely something I should fix |
| 02:12 | mdeboard | ibdknox: k |
| 02:14 | ibdknox | mdeboard: though to be fair, your partials really shouldn't do anything complicated, so doc strings are mostly unnecessary. |
| 02:15 | mdeboard | ibdknox: Well, it's mostly as a reminder to myself :P |
| 02:15 | ibdknox | yeah, I buy that |
| 02:16 | ibdknox | unfortunately dealing with args like that is really annoying lol |
| 02:19 | leo2007 | why doesn't this work (-> 3.0 #(Math/sin %) #(Math/cos %)) ? |
| 02:23 | brehaut | ,(macroexpand '(-> 3.0 #(Math/sin %) #(Math/cos %))) |
| 02:23 | clojurebot | (fn* (clojure.core/-> 3.0 (fn* [p1__27#] (Math/sin p1__27#))) [p1__28#] (Math/cos p1__28#)) |
| 02:23 | ibdknox | ,(-> 3.0 Math/sin Math/cos) |
| 02:23 | clojurebot | 0.9900590857598653 |
| 02:26 | ambrosebs | ,(macroexpand '(-> 3.0 Math/sin Math/cos)) |
| 02:26 | clojurebot | (. Math cos (clojure.core/-> 3.0 Math/sin)) |
| 02:27 | leo2007 | I still don't where the problem is. |
| 02:28 | ambrosebs | looks like rest of the -> is being put as the first argument as fn* |
| 02:28 | ambrosebs | which should be an argument list |
| 02:28 | ambrosebs | vector |
| 02:38 | mdeboard | ibdknox: Is this gross/stupid? http://p.mattdeboard.net/gross_or_not.html |
| 02:40 | mdeboard | overly complex, etc. |
| 02:41 | brehaut | mdeboard: multimethods, just saying |
| 02:42 | mdeboard | brehaut: Yeah I started down that path but realized it's a simple enough case that cond suffices without losing extensibility |
| 02:43 | mdeboard | BTW if anyone's-- |
| 02:43 | brehaut | mdeboard: well your cond is already quite repeatitive. you could replace it with (apply str (interpost "/" [({:CSS css-path :JS js-path} (:Type fmap)) (:Filename fmap))])) |
| 02:44 | mdeboard | What the hell? technomancy wrote scpaste? |
| 02:44 | brehaut | also, campitals in keywords is surprising |
| 02:44 | brehaut | mdeboard: technomancy wrote _everything_ |
| 02:44 | brehaut | s/campitals/capitals/ |
| 02:44 | mdeboard | brehaut: I was following the example here http://clojure.org/runtime_polymorphism |
| 02:44 | brehaut | mdeboard: huh |
| 02:45 | brehaut | i guess its using it to indicate 'typeness' |
| 02:45 | brehaut | but :Type and :Filename is still weird i think |
| 02:46 | mdeboard | Yeah. |
| 02:46 | mdeboard | Sorry I'm still kind of shocked technomancy wrote scpaste. |
| 02:46 | mdeboard | singularity chat |
| 02:47 | brehaut | seriously, everything |
| 02:49 | llasram | He start a project named "everything," just to make that literally true |
| 02:49 | llasram | should, even |
| 03:02 | mdeboard | Oh yeah? Well... https://github.com/technomancy/scpaste/pull/1/files |
| 03:04 | mdeboard | 02:40 <brehaut> mdeboard: well your cond is already quite repeatitive. you could replace it with (apply str (interpost "/" [({:CSS css-path :JS js-path} (:Type fmap)) (:Filename fmap))])) |
| 03:04 | mdeboard | That strays into "unreadable" territory for me, as a newb. Decreased maintainability etc., etc., etc. |
| 03:05 | mdeboard | Just for me, I mean. I'll optimize that later. |
| 03:07 | amalloy | ibdknox: allowing docstrings is a pain, you're saying? |
| 03:08 | ibdknox | parsing optional args not at the end is, yeah |
| 03:08 | amalloy | clojure.contrib.def/name-with-attributes handled that reasonably well, though i don't think it's been ported to 1.3 formally |
| 03:09 | amalloy | though, as with anything i like, i copied it into useful |
| 03:09 | ibdknox | :) |
| 03:09 | mdeboard | god I haven't stayed up hacking like this for months |
| 03:09 | mdeboard | tight |
| 03:10 | amalloy | eg, (name-with-attributes foo "test" stuff more-stuff) returns [(with-meta foo {:doc "test"}), [stuff more-stuff]] |
| 03:11 | ibdknox | amalloy: cool, I'll take a look at that |
| 03:11 | ibdknox | I definitely feel like there's some relatively general solution to the problem |
| 03:12 | mdeboard | brehaut: Fine you win, your way is better :) |
| 03:12 | amalloy | ibdknox: aha. it made it into tools.macro |
| 03:12 | ibdknox | oo |
| 03:12 | amalloy | which useful already depends on, so i can just drop the copied impl |
| 03:12 | ibdknox | :) |
| 03:12 | mdeboard | OvO |
| 03:19 | amalloy | ibdknox: well! thanks for prodding me into looking at that again |
| 03:19 | ibdknox | amalloy: haha thanks for the solution :) |
| 03:20 | mdeboard | Damn, most productive/fun Friday hackathon I've had in like... 3 months probably. |
| 03:20 | ibdknox | mdeboard: cool |
| 03:20 | ibdknox | who isn't really? |
| 03:20 | mdeboard | Clueless fanboy |
| 03:20 | mdeboard | as all fanboys are |
| 03:20 | ibdknox | aside from amalloy, who I now have to be nice to since he found name-with-attributes for me |
| 03:21 | mdeboard | nothing worse than "Django is so amazing" fanboys who won't shut up |
| 03:21 | amalloy | indeed, i am inexplicably recalcitrant |
| 03:22 | mdeboard | stultifyingly, stupefyingly recidivist |
| 03:22 | ibdknox | amalloy: one day though, you'll wake up and all your sites will be noir :p |
| 03:22 | amalloy | i don't think it's actually *criminal* to not use noir |
| 03:22 | mdeboard | amalloy: lol |
| 03:23 | mdeboard | amalloy: 4clojure is written on top of Compojure? I can't remember and too tired/lazy to look |
| 03:23 | amalloy | though presumably there is some legislation on it, being held up by a filibuster at this very moment |
| 03:23 | amalloy | mdeboard: compojure and hiccup, yeah |
| 03:23 | amalloy | and ring, of course |
| 03:23 | mdeboard | Of course |
| 03:23 | ibdknox | lol |
| 03:23 | ibdknox | translates http into maps |
| 03:23 | ibdknox | is the short version |
| 03:43 | callen | mdeboard: HTTP middleware. |
| 03:43 | callen | mdeboard: what ibdknox said. |
| 03:44 | callen | mdeboard: the idea being that if you want to spin your own webframework, reusing Ring prevents you from instrumenting the raw HTTP interface yourself. Cf: rack, wsgi, etc. |
| 03:46 | mdeboard | Ahh |
| 03:46 | ibdknox | our good friend brehaut has the best overall description of the space, though Noir wasn't on his radar then: http://brehaut.net/blog/2011/ring_introduction |
| 03:47 | callen | mdeboard: in general, it's best to avoid being one of those cockbites that has to have his own implementation of everything. |
| 03:47 | mdeboard | callen: Hahaha, If I ever find myself implementing an HTTP API I'll stab myself. |
| 03:48 | ibdknox | yeah, it's not really fun |
| 03:49 | mdeboard | It's just one of those things that sets off my spidey sense, the "You are doing this way, way wrong" feeling. |
| 03:53 | mdeboard | what a retarded thing to say, bed time. |
| 03:56 | callen | that's the most self-aware thing I've ever seen said on IRC |
| 03:56 | callen | wish more people were like that. |
| 03:57 | brehaut | ibdknox: luckily noir has solid docs |
| 04:18 | leo2007 | #'swank.commands.basic/print-doc* seems to have code to handle special forms but I could never get the doc from within slime by `C-d C-d d' |
| 04:30 | fliebel | good morning :) Do we have any new reader macros today? |
| 04:33 | leo2007 | why isn't http://clojuredocs.org/ mentioned in the title any more? |
| 04:33 | fliebel | amalloy: are you still awake? How fast is the randnth? |
| 04:34 | ibdknox | fliebel: that would depend entirely on the structure |
| 04:34 | ibdknox | on a vector? basically as fast as generating a random int |
| 04:34 | amalloy | fliebel: tbh i'm not sure. a mini-benchmark showed it was about 4 times as fast as my previous impl, but then re-running your performance graphs it seemed to be slower than any of the others |
| 04:34 | amalloy | ibdknox: picking up an old conversation |
| 04:35 | ibdknox | amalloy: ah, not rand-nth then |
| 04:35 | fliebel | ah, no |
| 04:36 | fliebel | amalloy: So is there a fork of my gist that includes this? Because now I need to beat you of course. |
| 04:36 | amalloy | fliebel: i don't think i actually pushed it back to github |
| 04:37 | amalloy | but you can take my gist and add it to yours |
| 04:37 | fliebel | amalloy: I did a really nice one with Forth :) wasn't lazy though :( |
| 04:39 | fliebel | I can'y find my own gist |
| 04:39 | fliebel | ah https://gist.github.com/805747 |
| 04:49 | leo2007 | is clojure in action published |
| 04:54 | leo2007 | 'joy of clojure' is sold 43 USD here in China. |
| 04:55 | leo2007 | a discounted price. |
| 06:02 | floatboth | hi |
| 06:05 | floatboth | how do I check how much args a fn takes? (:arglists (meta this-fn)) works only w/ vars in 1.2.x. try/catch isn't fast, right? |
| 06:13 | mrh0057 | I don't know of a built in function to do that except for java reflection api |
| 06:14 | mrh0057 | floatboth: http://download.oracle.com/javase/tutorial/reflect/ |
| 06:44 | anttih | I'm trying to set up a clojurescript repl with the browser eval env but I can't get it working when connecting from a webpage hosted on localhost (Noir app). The examples work when serving from a static local html page. |
| 06:44 | anttih | what am I missing? |
| 06:45 | anttih | what happens is that the repl just hangs there |
| 07:25 | asmala | I'm having some trouble with "lein jack-in" (and, by extension, M-x clojure-jack-in in Emacs) |
| 07:26 | asmala | If I run "lein jack-in" in a nested directory (say src/music) inside my lein project, I get "Couldn't find project.clj […]" |
| 07:27 | asmala | I found some relevant tips in the #clojure archives, but it seems like everything *should* be set up correctly (fresh emacs install, no other lein plugins, new lein project) |
| 07:29 | asmala | Is it possible to call jack-in from a directory other than the project root? |
| 07:48 | asmala | "lein swank" + "M-x slime-connect" seems to work fine but I couldn't get "M-x clojure-jack-in" working outside a lein project root ("Couldn't find project.clj […]" |
| 11:03 | edw | A Compojure Q: Is there a way to get the method when using the ANY routes macro? |
| 11:13 | tensorpudding | printing in clojure thoroughly and completely confuses me |
| 11:14 | tensorpudding | there's a ton of different functions but i don't think any do what i want |
| 11:15 | edw | Yeah, there are a few seemingly arbitrarily named functions to memorize. |
| 11:15 | edw | What do you want to do? |
| 11:15 | tensorpudding | i want something which works like sprintf |
| 11:15 | raek | that would be format |
| 11:15 | edw | See FORMAT. |
| 11:15 | raek | ,(format "%x" 255) |
| 11:15 | clojurebot | "ff" |
| 11:16 | edw | More like asprintf... |
| 11:17 | tensorpudding | ,(let [name "Clojure"] (format "Hello, %s" name)) |
| 11:17 | clojurebot | "Hello, Clojure" |
| 11:17 | tensorpudding | but it doesn't seem to do what i want |
| 11:17 | edw | What do you want it to do? |
| 11:18 | tensorpudding | nevermind, it works |
| 11:18 | tensorpudding | i had a typo |
| 11:18 | tensorpudding | is there a way to read function docstrings in the repl |
| 11:18 | edw | (use 'clojure.repl) (doc format) |
| 11:19 | edw | No need for the USE if you're using <1.3 |
| 11:19 | raek | (in clojure < 1.3 'doc' is in clojure.core) |
| 11:19 | tensorpudding | what is use? |
| 11:19 | skelternet | '(doc doc) |
| 11:19 | tensorpudding | is that like require |
| 11:19 | edw | Yes, but it imports the symbols into the current environment. |
| 11:20 | tensorpudding | or wait, does it import....ah |
| 11:20 | tensorpudding | i prefer explicit namespacing usually |
| 11:20 | edw | IMPORT is different. |
| 11:21 | tensorpudding | how do i read docs on java functions |
| 11:21 | gfredericks | I don't think that's possible at runtime... |
| 11:21 | edw | The javadoc? |
| 11:21 | tensorpudding | what's javadoc? |
| 11:22 | gfredericks | a standard method for generating HTML documentation from java source code. What java functions are you interested in? |
| 11:22 | tensorpudding | just the ones referenced in clojure docs |
| 11:22 | gfredericks | if they're from standard java libraries, you can google their names and find them |
| 11:23 | gfredericks | $google java 6 inputstream |
| 11:23 | lazybot | [InputStream (Java Platform SE 6)] http://download.oracle.com/javase/6/docs/api/java/io/InputStream.html |
| 11:23 | gfredericks | most public java libraries post their javadocs on the web, and are easy to find with google |
| 11:23 | edw | You should use a search engine (Google.com is a search engine) and type something like "java.io.File". |
| 11:36 | ambrosebs | does anyone think it's a good idea to dedicate a yearlong CS honours project to a Clojure-in-Clojure compiler? |
| 11:36 | ambrosebs | I'm not aware of an effort currently for this type of thing |
| 11:38 | ejackson | ambrosebs: how much of clojurescript would be useful for that ? |
| 11:38 | ambrosebs | I'm not sure |
| 11:39 | ambrosebs | my very rough understanding is that it's not completely CinC because it uses Clojure |
| 11:39 | ambrosebs | but, please correct me if I'm wrong |
| 11:40 | ambrosebs | I'd imagine it's a starting point |
| 11:43 | ejackson | I have no idea, but I got the impression it was a stab at working on the ideas |
| 11:46 | ejackson | i think it would a really exciting exercise |
| 11:48 | ambrosebs | yes, there seems to be many factors to account for |
| 11:59 | gfredericks | ambrosebs: would you try to design it from the ground up, or just go through the java classes translating functionality into deftypes and such? |
| 12:03 | ambrosebs | gfredericks: well it wouldn't be a 1-1 translation, there are suggested improvements for a CINC compiler on a confluence page |
| 12:03 | ambrosebs | but really, I haven't looked at the compiler much, this is something i'd spend a while thinking about before jumping in |
| 12:04 | gfredericks | if I had an honors project to do, I would definitely enjoy such a thing. |
| 12:05 | ambrosebs | yes, it sounds like a bunch of fun |
| 12:06 | ambrosebs | another possibility is working on an a la carte type system for clojure |
| 12:07 | gfredericks | that sounds more research oriented |
| 12:07 | gfredericks | which I mean neutrally |
| 12:07 | ambrosebs | :) |
| 12:08 | ejackson | hahaha |
| 12:16 | srid | ,(Integer/toString 37 37) ;; radix cannot be greater than 36?! |
| 12:16 | clojurebot | "37" |
| 12:17 | gfredericks | srid: from javadoc: "If the radix is smaller than Character.MIN_RADIX or larger than Character.MAX_RADIX, then the radix 10 is used instead." |
| 12:18 | gfredericks | ,Character/MAX_RADIX |
| 12:18 | clojurebot | 36 |
| 12:24 | TimMc | ew |
| 12:24 | TimMc | Silent fail fail. |
| 12:28 | TimMc | ,(Integer/toString 37 -1) |
| 12:28 | clojurebot | "37" |
| 12:39 | TimMc | I'm surprised it doesn't throw a checked exception. :-P |
| 12:44 | gfredericks | yeah that's what I'd expect from java |
| 12:44 | gfredericks | if it were a clojure function what would you expect it to do? |
| 13:05 | tensorpudding | how do you define a main entry point for a clojure app? |
| 13:05 | tensorpudding | do you use clojure.main/main |
| 13:08 | cark | tensorpudding: depends if you're AOT compiling or not |
| 13:08 | tensorpudding | i'm producing a jar |
| 13:09 | cark | do you want to have an "executable" jar ? |
| 13:09 | cark | or can you take care of that from the command line ? |
| 13:09 | tensorpudding | i want an executable jar |
| 13:10 | cark | then you need to make a gen-class namespace |
| 13:10 | raek | you specify the main namespace in your project.clj: :main foo.bar |
| 13:10 | raek | then add a (:gen-class) in the ns form of that namespace |
| 13:11 | raek | and then add a function called "-main" in the same namespace |
| 13:11 | cark | something like this : https://gist.github.com/1341778 |
| 13:12 | TimMc | gfredericks: nil |
| 13:12 | tensorpudding | how do i use lein to generate a .jar that i can use? |
| 13:13 | TimMc | tensorpudding: lein jar |
| 13:13 | raek | lein uberjar |
| 13:13 | TimMc | or uberjar, really |
| 13:16 | tensorpudding | does java have to give these horribly obtuse error messages every time |
| 13:16 | TimMc | a-yup |
| 13:17 | TimMc | That's Java. And Clojure is worse about it (but getting better.) |
| 13:18 | tsally | is there any way to have a jar only clojar ? |
| 13:18 | TimMc | tsally: "only clojar" <-- could not parse |
| 13:18 | tsally | TimMc: I want to upload a library to clojars, but with the jar only |
| 13:19 | tensorpudding | clojure would be more fun to use if the java part were less obvious |
| 13:20 | tsally | I think clj-time does this where they upload joda here: http://clojars.org/joda-time |
| 13:20 | tsally | similarly, I'm wrapping a java library and want to follow the same style |
| 13:21 | TimMc | tsally: I don't understand -- clojars takes jars, that's what it does. |
| 13:23 | tsally | oh I see, so I can just a minimal pom.xml file |
| 13:23 | TimMc | raek: Is it possible to create an executable JAR without AOT of the bulk of one's code? I understand *something* needs to be precompiled for the jar to work... but maybe it could just be a bootstrapper. |
| 13:24 | TimMc | tsally: Yeah, it doesn't take much. Just mimic what leiningen produces, I guess. |
| 13:24 | TimMc | (I see what you were aksing now.) |
| 13:24 | tsally | TimMc: hehe sorry, I wasn't so clear |
| 13:25 | tsally | thanks for the help |
| 13:28 | tsally | TimMc: for future reference, clojars wiki actually has exactly what I was wondering about https://github.com/ato/clojars-web/wiki/POM |
| 14:20 | TimMc | All tests passed! |
| 14:20 | TimMc | Time to write more tests... |
| 14:29 | dbushenko | hi all! |
| 14:29 | dbushenko | where is the forme clojure.contrib.repl-utils? |
| 14:29 | dbushenko | I really miss the function "show"... |
| 14:33 | cemerick | dbushenko: I never used show, but I think the clojure.reflect namespace provides a superset of it (pretty-printing the results may be up to you right now) |
| 14:33 | dbushenko | wow! thanks! |
| 14:38 | dbushenko | cemerick, I've just looket through clojure.reflect... could you advise me how I can see the methods of a java object? |
| 14:46 | cemerick | ,(->> (reflect "") :members (filter :return-type) (map :name)) |
| 14:46 | clojurebot | #<CompilerException java.lang.RuntimeException: Unable to resolve symbol: reflect in this context, compiling:(NO_SOURCE_PATH:0)> |
| 14:47 | cemerick | ,(->> (clojure.reflect/reflect "") :members (filter :return-type) (map :name)) |
| 14:47 | clojurebot | #<ExecutionException java.util.concurrent.ExecutionException: java.lang.RuntimeException: java.lang.ClassNotFoundException: clojure.reflect> |
| 14:47 | cemerick | (require 'clojure.reflect) |
| 14:47 | cemerick | ,(->> (clojure.reflect/reflect "") :members (filter :return-type) (map :name)) |
| 14:47 | clojurebot | #<ExecutionException java.util.concurrent.ExecutionException: java.lang.RuntimeException: java.lang.ClassNotFoundException: clojure.reflect> |
| 14:47 | cemerick | &(->> (clojure.reflect/reflect "") :members (filter :return-type) (map :name)) |
| 14:47 | lazybot | java.lang.ClassNotFoundException: clojure.reflect |
| 14:47 | cemerick | &(require 'clojure.reflect) |
| 14:47 | lazybot | ⇒ nil |
| 14:47 | cemerick | &(->> (clojure.reflect/reflect "") :members (filter :return-type) (map :name)) |
| 14:47 | lazybot | ⇒ (valueOf regionMatches valueOf indexOf getBytes toUpperCase lastIndexOf contentEquals endsWith indexOf startsWith valueOf split valueOf indexOf valueOf replace replace toLowerCase getChars codePointBefore indexOf offsetByCodePoints contains hashCode compareTo toLow... https://gist.github.com/1341867 |
| 14:48 | cemerick | dbushenko: ^^ |
| 14:48 | dbushenko | thanks!! |
| 14:48 | cemerick | clojurebot ignores require now? |
| 14:48 | cemerick | dbushenko: there's also &(map #(.getName %) (.getMethods (class ""))) |
| 14:49 | llasram | cemerick: I think you left off the initial ','? |
| 14:49 | cemerick | hosty, I guess |
| 14:49 | cemerick | llasram: so I did! |
| 14:49 | cemerick | ,(require 'clojure.reflect) |
| 14:49 | clojurebot | nil |
| 14:49 | llasram | require all the namespaces! |
| 14:50 | dbushenko | cemerick, have tried that. This is just great!! |
| 14:51 | cemerick | dbushenko: read the docs now. You're on your own from here on out. ;-) |
| 14:51 | dbushenko | :-) |
| 14:57 | tensorpudding | is there a recommended templating library in clojure? |
| 15:02 | chewbranca | tensorpudding: my personal preferences are https://github.com/weavejester/hiccup and https://github.com/cgrand/enlive |
| 15:03 | tensorpudding | ehh |
| 15:03 | chewbranca | tensorpudding: ? |
| 15:03 | tensorpudding | i don't want to use clojure to write html |
| 15:03 | chewbranca | ahh |
| 15:03 | chewbranca | well enlive is very interesting |
| 15:03 | TimMc | tensorpudding: You don't exactly write it. |
| 15:04 | chewbranca | you use clojure to select dom elements of existing html and use clojure to update them with the relevant data |
| 15:04 | Raynes | Hiccup is closer to writing it -- enlive is more templateish. |
| 15:04 | chewbranca | but I imagine there is also a mustache port in clojure |
| 15:04 | ibdknox | there is |
| 15:04 | ibdknox | clostache or stencil |
| 15:04 | ibdknox | we use stencil |
| 15:04 | ibdknox | it's worked nicely |
| 15:04 | tensorpudding | enlive seems complicated |
| 15:04 | TimMc | "clostache" ugh |
| 15:04 | ibdknox | it is, unfortunately |
| 15:04 | ibdknox | TimMc: I know |
| 15:05 | Raynes | ibdknox: We use clostache in spawn. |
| 15:05 | chewbranca | enlive is definitely different, I think that's where a lot of the complications come from |
| 15:05 | ibdknox | TimMc: one of the reasons I use stencil was because of that name ;) |
| 15:05 | ibdknox | Raynes: yeah, I know, they're basically equivalent |
| 15:05 | chewbranca | different goals though, if you're working with html and need to continue to work with only html then it can be very useful |
| 15:05 | ibdknox | there's also string template |
| 15:06 | tensorpudding | i've not used mustache before but it seems close to expectations |
| 15:06 | ibdknox | which is basically like the templating you get in other web stacks |
| 15:06 | chewbranca | mustache is alright, I typically don't use it aside from very basic things |
| 15:07 | chewbranca | my issue with mustache is that its too basic, I like to have more tools available inside my templates than what mustache provides |
| 15:08 | chewbranca | I mean, I know that's the point of mustache, I'm just not a fan |
| 15:09 | ibdknox | with lambdas you can basically do anything? |
| 15:09 | ibdknox | the cool thing is mixing lambdas with hiccup :D |
| 15:11 | chewbranca | lambdas work _ok_, they give you the absolute minimum required to be able to create html functions |
| 15:12 | chewbranca | that doesn't mean they're fun to use for larger codebases |
| 15:13 | chewbranca | because when you start wanting to reuse these lambdas, they become more like functions, and you build up a helper system, in which case, why didn't you just use something with more functionality than only lambdas in the first place? |
| 15:13 | ibdknox | that argument doesn't really make sense to me |
| 15:14 | ibdknox | what system is more powerful than being able to execute any arbitrary function? |
| 15:14 | chewbranca | yeah yeah its turing complete |
| 15:14 | ibdknox | in any case though, I've never had any issues, but templating is always a very contentious subject :) |
| 15:14 | ibdknox | I've used them all |
| 15:14 | ibdknox | I like the concept of enlive, but I have an issue with its implementation |
| 15:14 | chewbranca | my point is that you end up building a helper system because mustache maps your lambdas directly with your data |
| 15:15 | chewbranca | so you end up reinventing the wheel |
| 15:18 | bartj | I have just downloaded cascalog |
| 15:18 | bartj | and after I do a "lein compile" |
| 15:18 | bartj | I do not know where the ".class" files are |
| 15:19 | bartj | ie. they are not present in the classes folder |
| 15:19 | ibdknox | that .classes for what? |
| 15:19 | bartj | so when I am trying to get started with running the "playground" |
| 15:19 | bartj | ie: (use 'cascalog.playground) (bootstrap) |
| 15:20 | bartj | I get the error: java.io.FileNotFoundException: Could not locate cascalog/playground__init.class or cascalog/playground.clj on classpath: (NO_SOURCE_FILE:0) |
| 15:21 | bartj | ibdknox, to run cascalog |
| 15:22 | ibdknox | when you say you downloaded cascalog, what do you mean? |
| 15:22 | ibdknox | you added it to your project.clj and ran lein deps? |
| 15:23 | bartj | no |
| 15:23 | ibdknox | ah |
| 15:23 | ibdknox | that's how you should do it |
| 15:23 | bartj | downloaded a .zip from https://github.com/nathanmarz/cascalog |
| 15:23 | ibdknox | ok |
| 15:23 | tensorpudding | there's like a half dozen different jars for this package on clojars |
| 15:24 | tensorpudding | how the heck do i decide which to use |
| 15:24 | TimMc | no kidding |
| 15:24 | bartj | and then ran lein deps && lein compile && lein repl |
| 15:24 | ibdknox | open your project.clj and add [cascalog "1.8.3"] |
| 15:24 | ibdknox | to your dependencies |
| 15:24 | raek | bartj: that would be how you did it before Leiningen came about |
| 15:24 | ibdknox | then run lein deps, lein repl |
| 15:24 | raek | (download zip and compile, that is) |
| 15:24 | tensorpudding | i don't know what its qualified namespace is |
| 15:24 | bartj | oh |
| 15:25 | tensorpudding | that's why i was looking on clojars |
| 15:25 | tensorpudding | i chose the one that ended up being just the name of the package |
| 15:25 | bartj | but looking at the "Getting Started" section on https://github.com/nathanmarz/cascalog |
| 15:25 | raek | tensorpudding: the namespace and maven group + artifact ID do not always match exactly |
| 15:25 | bartj | the idea seems to be just to download the .zip file and follow the instructions there |
| 15:25 | raek | tensorpudding: which library are you looking for? |
| 15:25 | tensorpudding | enlive |
| 15:27 | bartj | raek, correct me if I am mistaken, but my project here *is* cascalog |
| 15:27 | raek | I personally find the clojars search function not so useful. I usually look up the group and artifact id in the project.clj on the project's github page |
| 15:27 | raek | and then look here: http://clojars.org/repo/ |
| 15:27 | raek | for the latest stable version |
| 15:27 | tensorpudding | (this is too complicated) |
| 15:27 | bartj | so, adding that to the dependencies doesn't make sense to me |
| 15:27 | ibdknox | bartj: your project *uses* cascalog |
| 15:28 | ibdknox | bartj: it's not cascalog itself |
| 15:28 | bartj | ibdknox, hmm |
| 15:28 | tensorpudding | what is the group and artifact i |
| 15:28 | tensorpudding | d |
| 15:28 | raek | bartj: the most common way to play with a library is to create a project that has it as a dependency. running lein repl in the cascalog folder should work too, though |
| 15:28 | Raynes | tensorpudding: The part before the / is the group id, the part after is the artifact id. |
| 15:29 | tensorpudding | oh |
| 15:29 | Raynes | So foo.bar/baz = group id foo.bar and artifact id baz. |
| 15:29 | raek | so, in this file https://github.com/cgrand/enlive/blob/master/project.clj |
| 15:29 | tensorpudding | it just says enlive |
| 15:29 | tensorpudding | so both of them are enlive? |
| 15:29 | raek | it just says "enlive". that means that both the group ID and the artifact ID is enlive |
| 15:29 | tensorpudding | okay |
| 15:29 | raek | (this is probably documented in the lein tutorial somewhere) |
| 15:29 | tensorpudding | so how do i deal with its other namespaces? |
| 15:30 | raek | so I would look here: http://clojars.org/repo/enlive/enlive/ |
| 15:30 | raek | and decide to go with [enlive "1.0.0"] |
| 15:30 | Raynes | raek: http://clojars.org/enlive worksa |
| 15:30 | Raynes | works* |
| 15:30 | tensorpudding | i found it on clojars and put that in and got the deps |
| 15:30 | raek | ok |
| 15:30 | tensorpudding | but now i need to figure out how to :use its namespaces |
| 15:31 | raek | that should (ideally) be documented in the docs for the project |
| 15:31 | tensorpudding | the docs don't tell you that |
| 15:31 | tensorpudding | do i use it literally as it appears in the source? |
| 15:31 | raek | https://github.com/cgrand/enlive/wiki |
| 15:31 | raek | here it says (:use net.cgrand.enlive-html) |
| 15:32 | tensorpudding | take that as yes |
| 15:32 | TimMc | tensorpudding: Ideally, a projectwill tell you on its GitHub (or whatever) page 1) the group & artifact IDs, 2) the core namespaces to require. |
| 15:32 | TimMc | Some fail at that. |
| 15:32 | cemerick | ibdknox: for the record, I think korma's color scheme is tops :-D |
| 15:32 | raek | a lot of projects fail to do convey 2) |
| 15:32 | ibdknox | cemerick: best thing ever :D |
| 15:32 | bartj | ibdknox, ok, I just add cascalog to the dependencies |
| 15:32 | ibdknox | speaking of.. |
| 15:33 | ibdknox | I'm thinking about a breaking change for Korma that I'd like some feedback on, if you're interested go to #korma for a minute |
| 15:33 | cemerick | ibdknox: are the headlines just an image you produce using a tablet and a brush or something? |
| 15:33 | bartj | but when I run a (bootstrap), I get the error: "java.lang.Exception: Unable to resolve symbol: flatten in this context (vars.clj:72) |
| 15:33 | bartj | " |
| 15:33 | bartj | maybe the latest version is not stable enough ? |
| 15:33 | bartj | or maybe 1.8.2 is not stable enough |
| 15:44 | ibdknox | cemerick: it's actually a font called "From where you are" |
| 15:46 | cemerick | ~google "From where you are" |
| 15:46 | clojurebot | First, out of 524000 results is: |
| 15:46 | clojurebot | Lifehouse - From Where You Are - YouTube |
| 15:46 | clojurebot | http://www.youtube.com/watch?v=LBh7Muv0yac |
| 15:46 | cemerick | oh well :-) |
| 15:46 | ibdknox | haha\ |
| 15:46 | ibdknox | cemerick: http://www.dafont.com/from-where-you-are.font |
| 15:46 | ibdknox | font selection takes forever |
| 15:46 | cemerick | ibdknox: yeah, got it |
| 15:46 | cemerick | Nice pointer. |
| 15:46 | cemerick | The diacriticals are cute. :-) |
| 16:41 | bartj | trying out the examples in cascalog |
| 16:41 | bartj | I get this for any query: cascading.flow.FlowException: unhandled exception (NO_SOURCE_FILE:0) |
| 16:42 | goodieboy | anyone know of a library for striping tags from html? |
| 16:43 | goodieboy | hmm https://gist.github.com/393194 |
| 16:47 | bartj | goodieboy, is Perl ok ? |
| 16:48 | bartj | goodieboy, http://stackoverflow.com/questions/832620/stripping-html-tags-in-java |
| 16:50 | goodieboy | bartj: thanks, checking out that java question |
| 16:51 | Raynes | technomancy: Ping |
| 16:56 | technomancy | Raynes: pong |
| 16:56 | Raynes | technomancy: lein search "g:clj-github" <-- isn't it strange that the hyphen screws this up? |
| 16:57 | Raynes | I can search for stuff like g:clojail and get proper answers, but anything with a hyphen causes lucene to say wut. |
| 16:57 | Raynes | Just curious if you have any idea why. |
| 16:57 | technomancy | I think it needs a different query parser |
| 16:58 | technomancy | probably just a matter of digging through the nexus indexer to see what they use |
| 16:59 | technomancy | "g:github AND g:clj" doesn't work probably because it's getting tokenized as a single term at indexing-time |
| 17:00 | Raynes | g:clj-github* works… for some reason. |
| 17:00 | Raynes | Lucene is dark, dark magic. |
| 17:01 | technomancy | hm, probably forces their equivalent of a full table scan |
| 19:16 | goodieboy | anyone familiar with noir/compojure? Wondering if it can support faking the delete/put request methods by using a _method request param? |
| 19:17 | ibdknox | goodieboy: yes you can |
| 19:18 | goodieboy | nice, are there docs on how to do this? Is it pretty straight forward? |
| 19:18 | ibdknox | goodieboy: https://github.com/weavejester/compojure/blob/master/src/compojure/core.clj#L13 |
| 19:18 | ibdknox | basically as long as you submit _method with your http request |
| 19:18 | ibdknox | it will happen magically |
| 19:19 | goodieboy | ibdknox: very nice, thanks! |
| 19:23 | goodieboy | ibdknox: do you know if this works for noir as well? (defpage [:delete "/blah"] ... ? |
| 19:24 | ibdknox | goodieboy: yup |
| 19:25 | goodieboy | awesome |
| 19:45 | tensorpudding | why did the latest clojure put things in weird places |
| 19:45 | tensorpudding | someone remind me where doc is again |
| 19:45 | ibdknox | how do you start your repl? |
| 19:45 | tensorpudding | nevermind, now i remember |
| 19:45 | ibdknox | (use' clojure.repl) |
| 19:45 | ibdknox | er |
| 19:45 | ibdknox | (use 'clojure.repl) |
| 20:07 | tensorpudding | the dev cycle with clojure feels really slow |
| 20:08 | scottj | how so? |
| 20:08 | tensorpudding | well |
| 20:08 | tensorpudding | i write something which i don't know if it works |
| 20:08 | tensorpudding | i do 'lein run' |
| 20:08 | tensorpudding | it takes 20 seconds to build |
| 20:08 | tensorpudding | then spits out around 100 lines of inscrutable exception backtrace |
| 20:09 | tensorpudding | i scroll my terminal to find the line i care about, fix the error, repeat |
| 20:09 | scottj | why not use a repl? |
| 20:09 | tensorpudding | i'd need to restart the repl every time i changed my program |
| 20:10 | tensorpudding | in any case, if the program is invalid the repl isn't going to work is it? |
| 20:10 | scottj | Most people develop clojure code by writing their code in a file and then sending expressions and definitions to the repl with a keystroke |
| 20:12 | tensorpudding | well |
| 20:12 | tensorpudding | i'm writing a "webapp" |
| 20:12 | tensorpudding | it's using compojure, ring and enlive |
| 20:12 | tensorpudding | what part do i send to the repl |
| 20:13 | amalloy | all the parts :P |
| 20:13 | scottj | tensorpudding: emacs? |
| 20:13 | tensorpudding | yes |
| 20:14 | scottj | tensorpudding: most people use C-c C-k to send the entire file |
| 20:14 | tensorpudding | i just did |
| 20:14 | tensorpudding | so what now? |
| 20:15 | tensorpudding | it compiled i guess |
| 20:15 | scottj | anything that's not running that you want running should be send in similar way |
| 20:15 | tensorpudding | i'm running my -main in the repl and it's not doing anything |
| 20:15 | scottj | say you have start-server.clj you should send that |
| 20:15 | tensorpudding | oh wait, it worked |
| 20:16 | tensorpudding | it's just not sending output on the repl saying jetty was started |
| 20:16 | tensorpudding | also totally failed at finding my css |
| 20:16 | tensorpudding | right, i commented out that line |
| 20:17 | tensorpudding | okay |
| 20:17 | tensorpudding | i killed it, tried to start it again but the old -main is still running |
| 20:17 | tensorpudding | do i have to restart slime |
| 20:18 | scottj | idk, normally you start the server once per dev session |
| 20:18 | amalloy | tensorpudding: i usually (def j (start-jetty ...)), and then i can (.stop j) |
| 20:22 | tensorpudding | running that, the repl doesn't return |
| 20:23 | scottj | (future (start-jetty...)) |
| 20:27 | tensorpudding | how do i do aliased requires on the repl? |
| 20:28 | chouser | (require '[foo.bar :as b]) |
| 20:29 | amalloy | scottj, tensorpudding: jetty takes a :join false option |
| 20:29 | amalloy | running it in a future won't work because you won't have a result object to .stop |
| 20:30 | scottj | :Join? |
| 20:30 | scottj | :join? |
| 20:30 | amalloy | ah |
| 20:33 | tensorpudding | i don't suppose someone familiar with compojure can explain compojure.route/resources |
| 20:44 | scottj | btw another option if you're struggling to get your environment setup correctly is to use noir, have it create a project for you, and then run it in restart on save mode and it will give you fast nice exceptions. |
| 21:10 | stevelew | hello |
| 21:11 | stevelew | I have a supernoob question if there's not a discussion going on already. |
| 21:12 | stevelew | I'm trying to wrap my mind around thinking functionally |
| 21:13 | cemerick | stevelew: you should always ask, even if there's chaff flying :-) |
| 21:13 | stevelew | So I'm reading about datatypes and protocols here: http://freegeek.in/blog/2010/05/clojure-protocols-datatypes-a-sneak-peek/ |
| 21:13 | stevelew | which is quite good, but it looks an awful lot like OOP to me, with my noob mind |
| 21:13 | stevelew | types, with functions attached to the type |
| 21:14 | stevelew | so I'm missing something conceptually, I think. |
| 21:15 | stevelew | partly, I think it's the fact that there's immutable state |
| 21:15 | stevelew | so any function call using a record would just return a new instance of the record |
| 21:16 | cemerick | First, OO generally implies stateful, mutable objects. |
| 21:16 | stevelew | right |
| 21:16 | cemerick | Second, protocols allow you to define implementations for types you don't control. |
| 21:16 | stevelew | ok |
| 21:17 | stevelew | maybe that's it, the stateless part |
| 21:17 | stevelew | i'm so used to mutating state on an object via a method |
| 21:17 | cemerick | People usually get more excited about the second bit. :-) |
| 21:17 | stevelew | yeah I just watched stuart halloway's vimeo on protocols |
| 21:17 | stevelew | very cool. |
| 21:18 | stevelew | i'm partly just trying to figure out how I'd implement records with a Customer, an Order, and a Product sort of idea |
| 21:18 | cemerick | The implementations are also dynamic (i.e. you can change them at the REPL for all of your instances, assuming you're using extend et al. instead of in-line impls). |
| 21:18 | stevelew | so my mind is on records |
| 21:19 | amalloy | stevelew: if you have an OO mindset you tend to jump to records for modeling your data even though they're not necessary |
| 21:19 | cemerick | (defrecord Customer [fname lname address customer-number])? |
| 21:19 | amalloy | clojure encourages the use of plain old hashmaps, and functions that operate on those maps |
| 21:19 | cemerick | (inc amalloy) ; though I'd say s/encourages/allows, but sure. :-) |
| 21:19 | lazybot | ⇒ 1 |
| 21:20 | amalloy | lazybot: eh? when did your karma get reset? |
| 21:20 | cemerick | happens every could of days, I think. |
| 21:20 | Raynes | amalloy: Well, it's kind of completely broken anyways. |
| 21:20 | Raynes | $karma amalloy |
| 21:20 | lazybot | amalloy has karma 0. |
| 21:20 | stevelew | i'm okay with using hashmaps. i love hashmaps |
| 21:21 | Raynes | amalloy: Feel free to commit something every once in a while. ;) |
| 21:21 | cemerick | (defn karma [handle] (if (= handle "amalloy") 0 (get-karma handle))) |
| 21:22 | stevelew | I'd seen a few things by Alex Miller blogging about how he's used records at his workplace |
| 21:23 | amalloy | man, i've looked into the karma plugin a number of times. can't repro the problem |
| 21:24 | amalloy | stevelew: i've heard records described as an "advanced feature". not a bad way to think of them |
| 21:24 | stevelew | part of it is thinking about how I'd introduce Clojure at my workplace. I'm not sure my coworkers would prefer to throw away all types and go with hashmaps. |
| 21:24 | amalloy | and of course advanced features are more fun to blog about... |
| 21:39 | tensorpudding | can you destructively change a map? |
| 21:40 | cemerick | destructively? |
| 21:40 | tensorpudding | sorry |
| 21:40 | tensorpudding | i mean |
| 21:40 | tensorpudding | i kinda want to have a global mutable map |
| 21:41 | tensorpudding | and a function which changes its value |
| 21:41 | tensorpudding | it's a temporary key-value store for my app |
| 21:41 | cemerick | sounds like an atom with a map inside |
| 21:41 | stevelew | like a cache? |
| 21:42 | tensorpudding | i guess like a cache |
| 21:57 | gfredericks | cemerick: if you s/encourages/allows, then you're not really saying anything anymore ;-) |
| 21:57 | gfredericks | or at least nothing beyond "clojure has hashmaps" |
| 21:57 | cemerick | gfredericks: then my work here is done :-P |
| 21:57 | cemerick | well, "you should use hash maps for modeling" vs. "you can use hash maps for modeling" is different |
| 21:58 | cemerick | just a matter of emphasis |
| 21:58 | gfredericks | you can use hash maps for modeling in java as well though |
| 21:58 | cemerick | ech, not pleasantly nor idiomatically |
| 21:58 | cemerick | records have a variety of creature comforts, and provide a superset of hash maps in the process |
| 21:59 | alexbaranosky | seems like hasmaps are where you usually start, and start using Records once you decide you need something they offer over and above simple hashmaps |
| 21:59 | stevelew | i like comfy |
| 21:59 | gfredericks | So I guess by "allow" we mean "doesn't inhibit" |
| 21:59 | cemerick | e.g. (defrecord Thing []) is better than a regular hash map at least insofar as you can wire it up to protocols |
| 22:00 | cemerick | alexbaranosky: yeah, that's the right path in practice |
| 22:00 | gfredericks | cemerick: sorry, I pay too much attention to words most of the time :) |
| 22:01 | cemerick | Though once you've gone down both roads far enough, you are better able to predict which entities should be records from the start. |
| 22:01 | alexbaranosky | experience is helpful that way |
| 22:01 | alexbaranosky | :) |
| 22:01 | cemerick | gfredericks: Likewise. Usually to the detriment of my readers and bystanders, though! |
| 22:02 | gfredericks | once you (defrecord Thing []), before you know it you'll be (deftype ThingFactoryBean []) |
| 22:03 | cemerick | beans and factory objects need not apply :-P |
| 22:05 | zakwilson | https://github.com/zakwilson/imgcompare <-- I wrote some bad Clojure code that does a surprisingly good job identifying duplicate images given its lack of sophistication. |
| 22:06 | cemerick | ooh, dangerous territory :-D |
| 22:07 | stevelew | FactoryBridgeAdapter |
| 22:08 | cemerick | zakwilson: do you have your test data online anywhere? |
| 22:12 | tensorpudding | where is defproject defined? |
| 22:12 | tensorpudding | why does it suddenly not work |
| 22:13 | tensorpudding | it's like this thing is trying to come with inventive new ways of not working |
| 22:13 | tensorpudding | clojure has been a really bad dev experience so far |
| 22:14 | gfredericks | defproject is part of leiningen. I've never had to look for the definition, if there is such a thing. What did you change when it stopped working? |
| 22:14 | alexbaranosky | you having trouble with your project file? |
| 22:16 | alexbaranosky | put your project.clj in a gist, and I'll look at it if you want |
| 22:16 | zakwilson | cemerick: nope. I just played with a few random images on my hard drive and give it to somebody who had some more substantial test data from a paper he wrote. |
| 22:16 | tensorpudding | it was saying that defproject was unknown |
| 22:16 | tensorpudding | when i tried compiling my core.clj in emacs |
| 22:17 | cemerick | zakwilson: Which paper? |
| 22:17 | cemerick | s/out/out to |
| 22:18 | zakwilson | cemerick: no idea. All I know is it had to do with image similarity and search. |
| 22:19 | tensorpudding | and it still can't find this function in a namespace that is mentioned in the api docs for this one package |
| 22:19 | tensorpudding | i made sure i had the same release as the source |
| 22:19 | tensorpudding | the package loads fine |
| 22:19 | tensorpudding | i can find other functions in the package, just not this one |
| 22:21 | stevelew | defproject is part of leiningen, you probably won't find it in core.clj |
| 22:23 | alexbaranosky | you *definitely* won't find it in core.clj |
| 22:24 | stevelew | what file is trying to use defproject, tensor? |
| 22:25 | alexbaranosky | I'm setting up Emacs on Ubuntu, using Emacs starter kit version 2 |
| 22:25 | alexbaranosky | http://technomancy.us/153 |
| 22:25 | alexbaranosky | I was under the impression that package.el came with Emacs now based on Phil's blog) |
| 22:26 | alexbaranosky | but when I eval-buffer (require 'package) it says it can't load file: package |
| 22:26 | alexbaranosky | what am I missing? |
| 22:27 | stevelew | emacs 24 or 23? |
| 22:28 | alexbaranosky | let me check |
| 22:28 | stevelew | package.el has been integrated into Emacs 24. If you use Emacs 23, please use this version instead. |
| 22:28 | tensorpudding | can the api docs for a package lie? |
| 22:28 | stevelew | http://technomancy.us/133 |
| 22:29 | alexbaranosky | yep, 23 |
| 22:29 | alexbaranosky | so I should get 24 explicitly I guess |
| 22:29 | tensorpudding | i have ring 1.0.0-rc1 and i can tell for sure that ring.util.response/redirect-after-post doesn't exist |
| 22:29 | tensorpudding | but the docs mention it, the github source has it |
| 22:30 | tensorpudding | maybe it's so new that the version on clojars doesn't have it, even though it's the same version tag? |
| 22:31 | alexbaranosky | tensor: that's a possibility |
| 22:31 | stevelew | i don't know about ring, but sometimes api docs on a website are a little ahead or behind of an an rc1. |
| 22:32 | tensorpudding | wait, dang |
| 22:32 | tensorpudding | it's hard to tell |
| 22:32 | stevelew | is the github source the rc1 version or the trunk/in-development version? |
| 22:32 | tensorpudding | the commit in clojars is only two weeks old |
| 22:33 | tensorpudding | the trunk/in-development version has 1.0.0-RC1 |
| 22:33 | stevelew | was it added after rc1? |
| 22:33 | tensorpudding | but this thing is not in 0.3.6 |
| 22:33 | tensorpudding | i guess it must've been added within the last two weeks |
| 22:33 | stevelew | :( |
| 22:33 | tensorpudding | even though the version wasn't incremented |
| 22:33 | alexbaranosky | easy to find out |
| 22:33 | tensorpudding | well friggin fine |
| 22:33 | tensorpudding | i'll just send a 302 instead of 303 |
| 22:34 | stevelew | heh |
| 22:34 | stevelew | you show 'em. |
| 22:34 | alexbaranosky | clone the repo, and checkout a version from 2.5 weeks ago and see if the functions in there |
| 22:35 | tensorpudding | the 1.0.0-beta2 release is older than the one on clojars, but has the feature |
| 22:36 | stevelew | weird |
| 22:36 | alexbaranosky | sounds like you're in some sort of twighlight zone |
| 22:36 | tensorpudding | the commit that marks the change to RC1 has the change, i think |
| 22:36 | tensorpudding | yes, it does |
| 22:37 | stevelew | is it just mislabeled on clojars? |
| 22:37 | tensorpudding | maybe |
| 22:38 | tensorpudding | okay, now i find i am not deref-ing my atom correctly |
| 22:38 | tensorpudding | how do you use deref on an atom? |
| 22:38 | alexbaranosky | any of you going to be at the Conj? I just got a wave of excitement :) |
| 22:38 | alexbaranosky | @ will do it |
| 22:38 | stevelew | @atom |
| 22:38 | alexbaranosky | @atom |
| 22:39 | tensorpudding | oh |
| 22:39 | tensorpudding | oh! |
| 22:39 | tensorpudding | ... |
| 22:39 | tensorpudding | i thought it meant literally @atom |
| 22:39 | tensorpudding | not @<atom name> |
| 22:39 | alexbaranosky | (deref atom) ;; also, right? |
| 22:41 | stevelew | http://clojure.github.com/clojure/clojure.core-api.html#clojure.core/deref |
| 22:41 | stevelew | looks like it, alex. |
| 22:41 | alexbaranosky | I think @ is the reader macro that expands out into `deref` |
| 22:45 | brehaut | ,(read-string "@foo") |
| 22:46 | clojurebot | (clojure.core/deref foo) |
| 22:50 | alexbaranosky | How many people are going to be at the Conj in total? I wasn't there last year... wonder how big it will be |
| 22:51 | tensorpudding | ugh, this is too confusing |
| 22:51 | tolstoy | When you have a lazy-sequence, and then do a (doseq [name sequence] …) Does sequence get fully realized before the body is executed? |
| 22:52 | tensorpudding | how are you supposed to know what confusingly documented clojure code does without reading the source? |
| 22:52 | stevelew | experiment? |
| 22:52 | tensorpudding | not cut out for untyped languages, i'm lost |
| 22:52 | alexbaranosky | you'll get used to it |
| 22:53 | tensorpudding | it just seems like more work for little gain |
| 22:53 | alexbaranosky | I know dorun will go through all of a sequence |
| 22:53 | stevelew | i've done tcl and python before trying clojure so it's not as foreign to me, tensor. it's a big change. |
| 22:54 | tensorpudding | i've used python a good bit |
| 22:54 | tensorpudding | it was less weird because it supported more introspection |
| 22:55 | tensorpudding | pythons also a lot simpler |
| 22:55 | alexbaranosky | I'm looking at the source for doseq right now |
| 22:55 | alexbaranosky | its a bigggg macro |
| 22:55 | stevelew | if i didn't understand something in python, I'd try the REPL |
| 22:55 | alexbaranosky | so give me a minute :) |
| 22:55 | stevelew | i used dir a ton when I was learning python |
| 22:56 | tolstoy | alexbaranosky: I guess I could set up a test, but it's breaks my flow. I was hoping it was common knowledge. ;) |
| 22:56 | tensorpudding | i don't understand this function any better on the repl |
| 22:56 | alexbaranosky | I don't think Python is simpler, but I guess I'm biased |
| 22:56 | tensorpudding | because it returns some object of some kind which i don't know what it does |
| 22:56 | stevelew | you may have to look at the source and break it down, then, tensor. :( |
| 22:57 | amalloy | tolstoy: i don't think your question is clear |
| 22:57 | tensorpudding | the source is hard to read |
| 22:57 | amalloy | if you mean: is every element realized before the body is executed for any of them? then no |
| 22:57 | cemerick | tensorpudding: FWIW, clojure provides just as much (if not more) introspection: it's just that Clojure functions aren't tied up into the values. |
| 22:57 | tensorpudding | i can't figure out what it does because it filters through a complicated macro and i haven't gotten macros down |
| 22:57 | tolstoy | amalloy: Yes, that's was my question. Thanks! |
| 22:58 | tensorpudding | i wanted to get by without having to touch macros for a while |
| 22:58 | tolstoy | amalloy: Ultimately, I'm trying to figure out if Mongo is really slow (as I'm using it) or if I'm just screwing up clojure a bit. |
| 22:59 | alexbaranosky | you can force the sequence to evaluate using dorun I think |
| 22:59 | technomancy | tensorpudding: do you know about the slime inspector? |
| 23:00 | tensorpudding | no |
| 23:00 | technomancy | C-c S-i will let you inspect any object |
| 23:00 | technomancy | including hyperlinks on the method names to see what classes they return |
| 23:00 | tensorpudding | in what |
| 23:00 | tensorpudding | in slime? |
| 23:00 | alexbaranosky | tolstoy: scratch that, I meant doall |
| 23:00 | tensorpudding | it's not bound here |
| 23:01 | technomancy | right, you have to be using slime |
| 23:01 | tensorpudding | i am |
| 23:01 | tensorpudding | i see slime-inspect |
| 23:01 | tensorpudding | bound to C-c I |
| 23:02 | technomancy | sure, same thing |
| 23:02 | technomancy | shift+i is I |
| 23:02 | tensorpudding | and what do i use this on |
| 23:03 | tensorpudding | it doesn't work on macros |
| 23:03 | technomancy | any value you want to introspect |
| 23:04 | technomancy | if you want to see what code a macro generates you can use macroexpand |
| 23:04 | technomancy | C-c RET |
| 23:04 | tensorpudding | okay, i did it on the result that confused me |
| 23:04 | tensorpudding | the output is...something |
| 23:05 | alexbaranosky | anyone know how to run a .in file? |
| 23:05 | tensorpudding | it doesn't provide me anything useful |
| 23:05 | alexbaranosky | looks like I need to run configure.in to configure my Emacs download |
| 23:05 | tensorpudding | you need to run autoconf |
| 23:06 | alexbaranosky | thanks |
| 23:06 | tensorpudding | actually, emacs? |
| 23:06 | tensorpudding | you run autogen.sh |
| 23:06 | tensorpudding | which does autoconf plus other things |
| 23:07 | technomancy | cemerick: http://www.cul.de/images/autotoolscg.jpg |
| 23:07 | amalloy | technomancy: wow slime inspector is awesome |
| 23:09 | amalloy | technomancy: how do i go "back" after drilling down into some field or method? |
| 23:10 | amalloy | ah, found the slime-inspector keymap. apparently it's L |
| 23:10 | technomancy | amalloy: not sure you can. seems like an odd omission |
| 23:12 | tensorpudding | dang |
| 23:13 | tensorpudding | do i have to jack in with swank every time i change deps |
| 23:13 | amalloy | tensorpudding: the jvm doesn't like adding dependencies at runtime, so mostly you can't do it (but ask cemerick about pomegranate) |
| 23:14 | tensorpudding | i want to know how to override the way compojure handles http responses |
| 23:14 | tensorpudding | so that i can send a 302 for redirect |
| 23:15 | amalloy | tensorpudding: why would you override anything? just return {:status 302 :headers {"Location" foo}}, right? |
| 23:15 | tensorpudding | well |
| 23:15 | tensorpudding | the way that defroutes works, i don't know how to do that |
| 23:16 | amalloy | just return that map instead of a string or html thing |
| 23:16 | tensorpudding | the examples, they all use macros which takes a route |
| 23:16 | tensorpudding | that's what i'm doing |
| 23:16 | tensorpudding | i had absolutely no idea if it was the right thing to do |
| 23:16 | amalloy | it's really that simple |
| 23:17 | tensorpudding | the docs muddied the matter, and the source was unfollowable |
| 23:17 | tensorpudding | and in any event, it doesn't actually work |
| 23:17 | tensorpudding | my redirect didn't happen |
| 23:17 | amalloy | ~bug report |
| 23:17 | clojurebot | A bug report has three parts: What you did; what you expected to happen; what happened instead. If any of those three are missing, it is awfully hard to help you. |
| 23:18 | tensorpudding | well, from the point of view of the browser, it just loaded forever |
| 23:20 | amalloy | my objection is that i haven't heard what you actually did. i suggested you do X, which works, but you say it didn't work. so without seeing your code i can't know how what you actually did differs from X |
| 23:22 | ADWong | Hi guys, I'm playing around with clojure and I'm a little stuck trying to get specific values from a data structure I have. Could someone guide me as to how I would pull the value 5 from the following structure: [{:type dog :attrs a :val 3} {:type dog :attrs b :val 5}]? Thanks! |
| 23:22 | tensorpudding | maybe my html form is doing the wrong thing |
| 23:22 | tensorpudding | but if it were sending a POST with the wrong information why is it taking forever |
| 23:22 | tensorpudding | maybe it's timing out trying to deref the atom? i don't know why it'd do that |
| 23:23 | tolstoy | ADWong: Something like (:val (nth thing 1))? |
| 23:23 | tolstoy | Or (:val (second thing))? |
| 23:24 | amalloy | &(get-in [{:type dog :attrs a :val 3} {:type dog :attrs b :val 5}] [1 :val]) |
| 23:24 | lazybot | java.lang.RuntimeException: Unable to resolve symbol: dog in this context |
| 23:24 | amalloy | &(get-in '[{:type dog :attrs a :val 3} {:type dog :attrs b :val 5}] [1 :val]) |
| 23:24 | lazybot | ⇒ 5 |
| 23:24 | tolstoy | Oh, yeah, that *-in stuff is really nice. |
| 23:25 | ADWong | Oh sorry. I guess I wasn't specific enough. Let's just say i had a requirement that the :attrs needs to be b and I want the corresponding :val. |
| 23:26 | amalloy | &(let [data '[{:type dog :attrs a :val 3} {:type dog :attrs b :val 5}]] (:val (keep (comp #{'b} :attrs) data)))) |
| 23:26 | lazybot | ⇒ nil |
| 23:26 | stevelew | you're using ring, tensor? |
| 23:26 | tensorpudding | compojure and ring |
| 23:26 | amalloy | &(let [data '[{:type dog :attrs a :val 3} {:type dog :attrs b :val 5}]] (:val (first (keep (comp #{'b} :attrs) data))))) |
| 23:26 | lazybot | ⇒ nil |
| 23:26 | amalloy | dangit |
| 23:26 | stevelew | yeah that makes no sense for it to hang like that |
| 23:26 | stevelew | but i know very little about compojure & ring |
| 23:27 | tensorpudding | i have no idea what it's hanging on |
| 23:27 | amalloy | &(let [data '[{:type dog :attrs a :val 3} {:type dog :attrs b :val 5}]] (:val (first (filter (comp #{'b} :attrs) data)))) |
| 23:27 | lazybot | ⇒ 5 |
| 23:27 | stevelew | in python I'd start adding prints in the django source |
| 23:28 | amalloy | ADWong: ^ |
| 23:29 | ADWong | Wow. I need to play with slime for a bit to see how that actually works. Thanks! |
| 23:29 | tensorpudding | i had a lot less trouble getting django to do what i wanted, last time i tried it |
| 23:29 | tensorpudding | but django is pretty heavy |
| 23:31 | stevelew | yeah it only happened once. i don't remember what it was |
| 23:31 | stevelew | it ended up being my fault, I'm sure. |
| 23:33 | amalloy | hah, that's how you can tell a real developer. "tool X didn't work, and i forget why, but it was definitely my fault" |
| 23:34 | stevelew | i remember in college, my prof said, "no matter what you think, the C++ compiler is not broken" |
| 23:34 | stevelew | no one even asked it, it was just a warning ahead of time to everyone in class |
| 23:34 | amalloy | well. it performs according to its specs. but the spec is pretty broken |
| 23:35 | stevelew | yeah, he was just trying to let us know that our code was going to be buggier than the compiler. |
| 23:35 | amalloy | indeed |
| 23:35 | tensorpudding | oh, good |
| 23:36 | tensorpudding | i found the issue |
| 23:36 | stevelew | now i'm curious, tensor |
| 23:36 | tensorpudding | turns out that keyword doesn't work on ints? |
| 23:36 | tensorpudding | except the atom either isn't getting updated or my retrieval functions aren't working |
| 23:37 | tensorpudding | well, it can't be the latter since it works fine for the initial values |
| 23:37 | tensorpudding | oh |
| 23:37 | tensorpudding | it's probably that my POST request doesn't have the right names |
| 23:37 | tensorpudding | or something |
| 23:37 | stevelew | the keys? |
| 23:37 | stevelew | in the POST? |
| 23:38 | tensorpudding | yes |
| 23:38 | stevelew | i've done that before |
| 23:38 | amalloy | tbh i was a bit shocked when i found out that ##(keyword 4) doesn't work |
| 23:38 | lazybot | ⇒ nil |
| 23:38 | tensorpudding | (POST "/new" [title body] (handler title body)) |
| 23:39 | stevelew | one time the key was expecting "physican" instead of physician |
| 23:39 | stevelew | took me forever to find that out |
| 23:39 | tensorpudding | i had assumed that it binds title and body to the values of the keys of the same name in the http request |
| 23:39 | stevelew | wth is a pysican |
| 23:40 | amalloy | stevelew: i like how you made it even worse by spelling it three different ways in your story |
| 23:41 | stevelew | lol |
| 23:41 | stevelew | physican |
| 23:41 | stevelew | i stared at it, even. and decided it was right. |
| 23:41 | stevelew | before i pressed enter. |
| 23:41 | tolstoy | Did you s/physician/doc/ after a while? |
| 23:41 | stevelew | lol |
| 23:41 | tensorpudding | how can i make my browser send a post request |
| 23:41 | stevelew | jquery? |
| 23:42 | stevelew | that would make sense, tolstoy |
| 23:42 | tensorpudding | i don't mean programmatically |
| 23:42 | tensorpudding | i want to test my webapp |
| 23:42 | stevelew | create a test form? |
| 23:42 | tensorpudding | i have a form |
| 23:42 | tensorpudding | i can't figure out if it's working |
| 23:42 | tolstoy | I worked on something a long time ago and use "proctologist" instead of "proctorship" because "proctorship" is such an awkward word to say. |
| 23:43 | cemerick | But "proctologist" isn't? |
| 23:43 | tolstoy | Some sort of medical records things. "How many proctologists does Dr Smith have?" |
| 23:44 | tensorpudding | <form method="post" id="form" action=""><input type="text" name="title"/><input type="text" name="body"/><input type="submit" value="Post"/></form> |
| 23:44 | tensorpudding | that's what i wrote |
| 23:44 | stevelew | you need something in the action i suppose |
| 23:44 | tensorpudding | what would go there? |
| 23:45 | tensorpudding | i assumed the submit handled it |
| 23:45 | tensorpudding | the html docs suggested such a thing |
| 23:45 | stevelew | does compojure or ring have something to register which urls work? |
| 23:45 | stevelew | oh hmmm |
| 23:46 | amalloy | i'm with cemerick here. in what domain is proctologist a viable substitute for proctorship? |
| 23:46 | tensorpudding | it's running my handler |
| 23:46 | tensorpudding | it's just got the keys as empty |
| 23:46 | tensorpudding | for some reason |
| 23:47 | tensorpudding | i can only guess the keys are misnamed |
| 23:47 | tolstoy | amalloy: Absolutely none. I think that's why the medical-record ladies were highly amused. |
| 23:47 | stevelew | heh |
| 23:47 | stevelew | so you have title, body.. |
| 23:47 | tolstoy | amalloy: I though they were two versions of the same word. |
| 23:47 | stevelew | which in theory would correspond to a map with :title and :body keys |
| 23:48 | stevelew | in the handler |
| 23:48 | tolstoy | Some people say orien-TAY-ted, and others say ori-EN-ted. All around really stupid of me. ;) |
| 23:49 | amalloy | tensorpudding: do you have a middleware like wrap-params installed? i don't htink ring does that, and there are compojure starting points that don't include that |
| 23:50 | tensorpudding | no? |
| 23:50 | tensorpudding | compojure didn't mention it |
| 23:51 | ibdknox | what's the issue? |
| 23:51 | stevelew | Compojure provides a “params” hash-map that has the parameters of the servlet, which we will pass to a “login” controller |
| 23:51 | tensorpudding | my html form sends a post request, which my app handles |
| 23:52 | tensorpudding | it seems to handle fine except the keys that i passed to the handler are empty |
| 23:52 | stevelew | are you getting a params map, tensor? |
| 23:52 | amalloy | ibdknox: bug: accidentally used compojure instead of noir |
| 23:52 | tensorpudding | a what? |
| 23:52 | ibdknox | amalloy: sounds like it. |
| 23:52 | stevelew | a variable named "params" |
| 23:52 | stevelew | coming into the handler |
| 23:52 | tensorpudding | no |
| 23:53 | tensorpudding | why is there so many libraries for clojure that all do similar things |
| 23:53 | stevelew | this guy has a form example |
| 23:53 | stevelew | http://justin.harmonize.fm/index.php/tag/compojure/ |
| 23:53 | tensorpudding | so that i can always choose the one that people hate |
| 23:53 | stevelew | with a login handler |
| 23:53 | ibdknox | tensorpudding: no one hates compojure |
| 23:53 | amalloy | tensorpudding: compojure is great though |
| 23:53 | tensorpudding | it's not a session |
| 23:53 | stevelew | "You have chosen ... unwisely" |
| 23:53 | amalloy | it's just ibdknox wrote noir |
| 23:53 | amalloy | and you sound like the sort of guy who would prefer noir |
| 23:53 | ibdknox | which is actually built on top of compojure :) |
| 23:54 | stevelew | what does your handler function take as paramters? |
| 23:54 | tensorpudding | i assume that since those posts are from 2009 they have no relevancy to today |
| 23:54 | tensorpudding | since everything else i read from that time period recently was totally, completely wrong |
| 23:54 | stevelew | hmm sorry. didn't see the 2009. |
| 23:54 | tensorpudding | yikes |
| 23:54 | tensorpudding | noir built on compojure built on ring |
| 23:54 | tensorpudding | that's not enough layers |
| 23:54 | stevelew | blue pill |
| 23:54 | ibdknox | haha |
| 23:55 | ibdknox | tensorpudding: those are very small libraries |
| 23:55 | tensorpudding | not small enough for me to understand them |
| 23:55 | ibdknox | tensorpudding: the point of them was actually that they *could* be built on top of |
| 23:55 | ibdknox | tensorpudding: well, those are fairly low level |
| 23:55 | ibdknox | tensorpudding: and not as well documented as they could be |
| 23:55 | tensorpudding | i just don't see why what i'm doing has an issue |
| 23:55 | ibdknox | tensorpudding: so let me help then. Can you put a gist up of your code? |
| 23:56 | tensorpudding | several files at the moment |
| 23:56 | tensorpudding | i'm not sure it's not the fault of my templates either |
| 23:56 | tensorpudding | well, the post page isn't templated |
| 23:56 | ibdknox | all I need to see is your defroutes and your handler function |
| 23:59 | ibdknox | lol |
| 23:59 | ibdknox | texnomancy? |