2012-12-18
| 00:15 | amalloy | ldh: reloading a defrecord won't modify the behavior of existing instances |
| 00:17 | ldh | amalloy: i think that was indeed the issue. passing the instance into the invocation of the protocol function had me turned around a bit, but i think i get it now |
| 01:14 | TEttinger | got kinda an odd question... I'm trying to find the exact probability of certain results coming up when rolling "special" dice (a game I play on the tabletop uses specially-marked dice with no numbers, just symbols with rhyme or reason to how many symbols are on each die). |
| 01:14 | TEttinger | clojure is my language of choice, so I am trying to solve it in clojure... |
| 01:15 | TEttinger | but I am wondering if there is a way to use the for comprehension on a variable number of sequences (determined at runtime) |
| 01:16 | TEttinger | like for through 3 8-sided dice, each bound to something temporary in the for |
| 01:16 | TEttinger | then for-comprehend through 4 8 sided dice and 2 twelve-sided dice |
| 01:17 | TEttinger | to get a map of the symbols that came up in each pass through all dice |
| 01:17 | TEttinger | (each die is a vector of vectors of symbols) |
| 01:17 | TEttinger | someone did a finite-distributions thing for the old clojure.contrib |
| 01:18 | TEttinger | not sure how to get it since it doesn't seem to have source... |
| 01:18 | TEttinger | maybe it does |
| 01:18 | TEttinger | https://github.com/clojure/clojure-contrib/blob/master/modules/probabilities/src/main/clojure/clojure/contrib/probabilities/finite_distributions.clj |
| 01:29 | cark | TEttinger: maybe use the sequence monad instead ? |
| 01:29 | TEttinger | cark, never heard of it |
| 01:31 | cark | let me have a look and get back to you |
| 01:35 | enamanuel | hola |
| 01:37 | cark | TEttinger: have a look at this https://gist.github.com/4325580 |
| 01:37 | cark | is this what you're looking for at all ? |
| 01:38 | TEttinger | cark, looks like it |
| 01:38 | TEttinger | thanks |
| 01:39 | cark | you can find the monad library here : https://github.com/clojure/algo.monads |
| 02:13 | tomoj | ":db/cardinality :db.cardinality/ref" hmm |
| 02:16 | tomoj | ":db/valueType :db.type/many" |
| 02:23 | ro_st | haha |
| 02:23 | ro_st | late night, or early morning? |
| 02:30 | tomoj | likely the later, I don't remember |
| 02:32 | brainproxy | anybody using the atmosphere library (websocket, jsonp stuff) with clojure? |
| 03:05 | TEttinger | cark: I appear to have shot the garbage collector be making a monad seq with all possibilities for 4 12-sided dice and 4 8-sided dice |
| 03:05 | TEttinger | s/be making/by making/ |
| 03:07 | TEttinger | I get "java.lang.OutOfMemoryError: GC overhead limit exceeded" |
| 03:08 | bbloom | TEttinger: google says that's 7.156946e+118 |
| 03:08 | TEttinger | oh |
| 03:09 | TEttinger | well crud. |
| 03:09 | TEttinger | guess that's not going to stay in memory |
| 03:09 | bbloom | combinatorics: they're big. |
| 03:10 | TEttinger | so bbloom, can you figure out a better way to figure out the odds of each specific set of face combinations coming up? |
| 03:10 | TEttinger | let me pastebin my code |
| 03:12 | mthvedt | how about an fn that adds probability distribution + die -> probability distribution |
| 03:12 | mthvedt | and reduce with that |
| 03:15 | TEttinger | https://gist.github.com/4326031 |
| 03:15 | TEttinger | I gotta say, I don't know much, if any, real probability stuff |
| 03:15 | TEttinger | ^ mthvedt |
| 03:15 | TEttinger | so I don't know how I would work with distributions |
| 03:16 | bbloom | TEttinger: boom: http://www.khanacademy.org/math/probability |
| 03:17 | mthvedt | TEttinger: convolving probability distributions in discrete domains is easy |
| 03:17 | mthvedt | for continuous data it's tricky |
| 03:18 | TEttinger | it isn't continuous for mine |
| 03:18 | mthvedt | but if your stuff is much smaller than memory |
| 03:18 | TEttinger | not now |
| 03:18 | TEttinger | i mean it isn't right now |
| 03:18 | mthvedt | like to add 2d6, take 1d6, map adding 1..6 and sum |
| 03:19 | TEttinger | take a look at the gist, I am probably doing something dumb |
| 03:19 | TEttinger | https://gist.github.com/4326031 the meat is in analyze-prob |
| 03:20 | mthvedt | well, i don't have time to fine tooth comb things but |
| 03:20 | mthvedt | there's a lot of repeated code |
| 03:20 | TEttinger | the rest is the standard rolling stuff for a few calculations of the same dice |
| 03:20 | TEttinger | yes. |
| 03:20 | mthvedt | a clojure programmer should never repeat code :) |
| 03:20 | TEttinger | i don't really know macros either |
| 03:20 | mthvedt | oh, you should |
| 03:20 | bbloom | mthvedt: i wouldn't take that particular statement all the way to it's logical conclusion |
| 03:20 | bbloom | TEttinger: macros aren't necessary here |
| 03:20 | mthvedt | but functional programming itself can eliminate |
| 03:21 | TEttinger | and there are frequent changes, but easy enough to just rectangular insert the names |
| 03:21 | mthvedt | most code repetition |
| 03:21 | bbloom | TEttinger: it looks like you're trying to learn both clojure and statistics at the same time |
| 03:21 | TEttinger | yeah I am not trying to code-elegantly. i am trying to make it work |
| 03:21 | bbloom | TEttinger: I always find it helps to simplify and try to do fewer things at once |
| 03:21 | TEttinger | bbloom, yeah |
| 03:22 | bbloom | looks like you got the basics of clojure, but need help with the stdlib |
| 03:22 | TEttinger | the task should be fairly simple, but my math isn't great |
| 03:22 | bbloom | i recommend grabbing the cheatsheet and then doing some problems at 4clojure.com |
| 03:22 | bbloom | ~cheatsheet |
| 03:22 | clojurebot | Cheatsheets with tooltips can be found at http://jafingerhut.github.com/ . |
| 03:22 | bbloom | ~4clojure.com |
| 03:22 | clojurebot | make a note of http://scienceblogs.com/goodmath/2006/11/the_c_is_efficient_language_fa.php it is yet another article about picking c or c++ for performance being naive |
| 03:22 | bbloom | er thanks clojurebot, i guess i didn't really need to ~ a domain already |
| 03:23 | bbloom | www.4clojure.com should be clickable :-) |
| 03:23 | bbloom | then mozzy on over to kahn academy and brush up on your probability skills |
| 03:23 | TEttinger | i've been using clojuredocs a lot |
| 03:23 | bbloom | i recommend you follow some top users on 4clojure, so you can see near functions and tricks they use to solve problems more eloquently |
| 03:23 | bbloom | then try to put the two things together :-) |
| 03:24 | bbloom | s/near/neat |
| 03:24 | bbloom | and get that monad out of there! |
| 03:24 | TEttinger | sigh... |
| 03:25 | TEttinger | make up your minds! |
| 03:25 | bbloom | a bunch of folks in this channel are obsessed w/ monads |
| 03:25 | TEttinger | should i use the sequence monad or not????? |
| 03:25 | bbloom | i dunno, maybe it's useful |
| 03:25 | bbloom | but you've still got a lot to learn about the std lib before you start venturing out into experimental monad libraries... |
| 03:26 | TEttinger | i think i know a fair bit of the std lib, my problems are on tricky things like doseq |
| 03:27 | bbloom | you're code has a ton of opportunities to simplify, cleanup, clarify |
| 03:27 | bbloom | your* |
| 03:27 | TEttinger | yeah |
| 03:27 | TEttinger | I know |
| 03:27 | bbloom | i'm not trying to shit on you |
| 03:27 | bbloom | i'm trying to help us help you |
| 03:27 | bbloom | in order to get good advice here, you need to ask for it in small pieces |
| 03:27 | TEttinger | the big thing that I am using is a rectangular insert in jEdit. it lets me edit each block as basically one line of code |
| 03:27 | TEttinger | got it |
| 03:27 | bbloom | this is a pretty big paste |
| 03:28 | TEttinger | the issue is almost entirely with analyze-prob |
| 03:28 | TEttinger | the rest is just so you can run it |
| 03:28 | TEttinger | since it needs multiple inputs, which I provided via a swing GUI |
| 03:28 | wei_ | how do people deal with multiple build targets using lein-cljsbuild? I find myself having to add two entries (dev and prod) in my project.clj for each page that I want to have clojurescript in. it works but doesn't seem very DRY e.g. https://gist.github.com/4326069 |
| 03:34 | Raynes | ggreg: What is a pretty big paste? |
| 03:34 | bbloom | wei_: I think that most people using cljs are doing singlepage apps |
| 03:34 | Raynes | Ugh |
| 03:34 | Raynes | bbloom, not ggreg. |
| 03:35 | Raynes | And I found it, so never mind. |
| 03:35 | Raynes | Damn it, gist. |
| 03:35 | bbloom | Raynes: I never mind you |
| 03:35 | Raynes | Damn everyone who doesn't use refheap. |
| 03:35 | TEttinger | ok, using https://gist.github.com/4326117 |
| 03:35 | TEttinger | heh just as you say refheap |
| 03:36 | wei_ | alright Raynes, next time :) |
| 03:36 | wei_ | and I guess I could just dry it up with "map" |
| 03:36 | Raynes | https://www.refheap.com/paste/7692 Fixed it for you, TEttinger |
| 03:37 | Raynes | ;) |
| 03:38 | bbloom | Raynes: maybe you should write a bot that finds gist posts in here and copies them to refheap :-P |
| 03:38 | TEttinger | Raynes, forgot to remove seesaw :usage https://www.refheap.com/paste/7693 |
| 03:38 | bbloom | we'll just stick a EULA in the channel topic: if you write in here, you assign all copyrights to Raynes, even if it's somebody else's post |
| 03:38 | Raynes | amalloy_ has suggested that a million times. I figure people would get angry pretty quickly. That might be a fun reason to do it anyways, see how fast people get annoyed. |
| 03:38 | Raynes | Hahaha |
| 03:41 | TEttinger | protip: don't run that code in the latest refheap paste |
| 03:41 | TEttinger | just (use)'ed it in a lein repl |
| 03:41 | Raynes | You have some very weird formatting. |
| 03:41 | TEttinger | yeah, I don't have an auto-format function in jedit |
| 03:41 | Raynes | Yikes, jedit for Clojure? That can't be fun. |
| 03:41 | TEttinger | so indents are all over |
| 03:42 | bbloom | TEttinger: and some sort of weird block edit fetish |
| 03:42 | TEttinger | it starts up faster than eclipse |
| 03:42 | TEttinger | heh |
| 03:42 | Raynes | Also, you are like the smallest minority in the whole Clojure community. |
| 03:42 | TEttinger | yeah |
| 03:42 | Raynes | First person I've ever heard of using it. :p |
| 03:42 | TEttinger | I use eclipse too |
| 03:42 | TEttinger | I contributed some code to CCW a while back |
| 03:43 | bbloom | TEttinger: if i were to try to make sense of this code, i'd basically have to rewrite it |
| 03:43 | TEttinger | yeah |
| 03:43 | Raynes | Haha, I was gonna let emacs reformat the code, but realized I was in Windows when I went looking for it. |
| 03:43 | Raynes | I don't have Emacs on this thing. |
| 03:43 | nbeloglazov | Hi. I have a performance issue. There is a snippet: https://www.refheap.com/paste/7694 The problem is that clojure works much slower if I use (current-surface) instead of (current-applet). It seems that clojure compiler need to use reflections because (current-surface) can return objects of 2 different types while (current-applet) return object of 1 type and compiler optimizes it. |
| 03:43 | nbeloglazov | How can I avoid this without creating 2 sets of functions - one for current-applet and another for current-graphics? |
| 03:43 | bbloom | TEttinger: see if you can get all those "reduce +" lines down to a single map transformation |
| 03:44 | nbeloglazov | Can protocol help this? |
| 03:44 | bbloom | nbeloglazov: try (set! *warn-on-reflection* true) |
| 03:44 | bbloom | you probably need a type-hint |
| 03:45 | nbeloglazov | What kind of? And where? In current-surface? |
| 03:45 | bbloom | (doc *warn-on-reflection*) |
| 03:45 | clojurebot | "; When set to true, the compiler will emit warnings when reflection is needed to resolve Java method calls or field accesses. Defaults to false." |
| 03:45 | bbloom | just set! that to true and run your code |
| 03:45 | bbloom | it will tell you whenever reflection occurs in clj code |
| 03:45 | nbeloglazov | Ok, I'll try |
| 03:47 | TEttinger | bbloom: you mean turn (reduce + (map #(* (count (filter (fn [c] (= :s c)) (flatten %))) (/ (get freqs %) num-rolls )) kf)) |
| 03:47 | TEttinger | into a function call on some local function? |
| 03:49 | bbloom | TEttinger: start there |
| 03:51 | TEttinger | i think the big issue with this code is that I am storing all combinations of all dice in memory at once. |
| 03:51 | nbeloglazov | bbloom: yes it shows a lot of reflection warnings when I use (current-surface). Still I need to fix it somehow. Type hints won't help as I understand because current-surface can return values of 2 different types. |
| 03:53 | bbloom | nbeloglazov: a typehint basically compiles to a cast (afaict) |
| 03:54 | bbloom | nbeloglazov: you can typehint at the call site, if you know what type you got |
| 03:54 | bbloom | nbeloglazov: or, if the method you need is higher up in the type hierarchy, you can hint with a base type |
| 03:55 | debugger98 | (def read-data [user-id] (let [sid (shard user-id) entity (symbol (str "shard" sid))] (select entity (where {:id user-id})))) |
| 03:55 | debugger98 | sorry should be |
| 03:55 | debugger98 | (def read-data [user-id] (let [sid (shard user-id) entity (symbol (str "shard" sid))] (select entity (where {:id user-id})))) |
| 03:55 | debugger98 | the entity dones't eval to its real value |
| 03:55 | debugger98 | select is a macro |
| 03:56 | debugger98 | how should I make entity eval to its value in this function definition |
| 03:56 | debugger98 | basically entity is a predefined val in the same file |
| 03:57 | debugger98 | just need to shard to the right one according to user id at run time |
| 03:59 | debugger98 | oops, s/def/defn/g |
| 03:59 | bbloom | debugger98: that would be your issue. |
| 04:00 | debugger98 | would be very grateful if someone points out the problem, thanks |
| 04:29 | adamvh | When I try to start Leiningen, I get the error message "java.lang.NoClassDefFoundError: clojure.lang.Symbol" |
| 04:29 | adamvh | Any idea why this might happen? |
| 04:29 | clgv | adamvh: sounds pretty weired. whats you environment? do you start "lein repl" outside a project? |
| 04:30 | adamvh | Yes, I get that error outside a project |
| 04:30 | adamvh | I've been running a script with lein-exec |
| 04:30 | adamvh | and it has ceased to work |
| 04:30 | adamvh | for reasons unknown |
| 04:30 | clgv | do you have a .lein/profiles.clj? |
| 04:31 | adamvh | No, I do not |
| 04:31 | clgv | leiningen 2 preview 10 right? |
| 04:31 | adamvh | I assume it's the most recent one |
| 04:31 | clgv | you can check via "lein version" |
| 04:32 | adamvh | I get the class not found error when I run lein version |
| 04:34 | clgv | and you are sure there is no project.clj in the directory where you do that? |
| 04:34 | clgv | then just delete ".lein" and reinstall leiningen |
| 04:36 | adamvh | Happens when I try to reinstall leiningen |
| 04:37 | adamvh | I get the "Downloading Leiningen now" |
| 04:37 | adamvh | and the little status indicator |
| 04:37 | adamvh | followed by the class not found error |
| 04:39 | clgv | huh? there is something pretty messed up. what did you do before? |
| 04:39 | adamvh | Interesting |
| 04:39 | adamvh | It appears that the cluster Java was 1.4 |
| 04:40 | clgv | uff |
| 04:40 | borkdude | :-0 |
| 04:40 | adamvh | now that I have instructed the cluster to use 1.6 |
| 04:40 | adamvh | things seem to be in order again |
| 04:40 | adamvh | It seems they changed the default while I wasn't looking |
| 04:40 | clgv | they have legacy software that old running on that cluster? :O |
| 04:40 | adamvh | frickin' high performance computing |
| 04:40 | adamvh | what a pain |
| 04:41 | clgv | I thought I use an outdated version with java 1.6 ;) |
| 04:41 | borkdude | what programming language is 25 years old today? |
| 04:41 | clgv | well it still has support until next year... |
| 04:41 | adamvh | 1987... |
| 04:41 | adamvh | C++? |
| 04:42 | llasram` | Hmm. Perl? |
| 04:42 | borkdude | It must be Perl |
| 04:43 | borkdude | someone on twitter said: Happy 25th to the "duct tape that holds the Internet together"! |
| 04:44 | borkdude | I actually know of only one "web shop" which is Perl based in my environment |
| 04:44 | clgv | right it is perl according to wikipedia |
| 04:47 | adamvh | Oh thank goodness I got that working. Did not want to re-write that script in something else |
| 04:47 | clgv | perl is the language where you can have source code that looks like a hash sum ^^ |
| 04:48 | Iceland_jack | Oh, perl jokes :) |
| 04:49 | borkdude | I saw some generated C# code yesterday in which every name was represented by a guid… |
| 04:49 | clgv | borkdude: decompiled? ;) |
| 04:50 | borkdude | clgv not even, just generated from some tool |
| 04:51 | clgv | ah kk. |
| 05:03 | silasdavis | Hello, I'm trying to run a main function with lein run -m messaging.models.message |
| 05:03 | silasdavis | but I get: "Exception in thread "main" java.lang.Exception: lib names inside prefix lists must not contain periods" |
| 05:03 | silasdavis | the -main function is in a file in the project with (ns messaging.models.message) at the top |
| 05:04 | silasdavis | can anyone tell me how to refer to it to get it to run with lein? |
| 05:04 | rodnaph | u need to use :gen-class too i think silasdavis |
| 05:04 | rodnaph | (in the namespace with -main) |
| 05:05 | llasram | No, not with 'lein run' |
| 05:05 | nbeloglazov | silasdavis: are you using require,use or refer in your clojure file? |
| 05:07 | silasdavis | Same issue: http://pastebin.com/K1tBk2eE |
| 05:07 | clojurebot | I think you mean gnir. |
| 05:08 | nbeloglazov | Try (:require [monger.core :as mg] [monger.collection :as mc]) |
| 05:09 | silasdavis | nbeloglazov: thanks, different error: Exception in thread "main" java.lang.ClassCastException: clojure.lang.Var$Unbound cannot be cast to com.mongodb.DB |
| 05:11 | nbeloglazov | silasdavis: did you try some examples of using monger? I think you use it somehow incorrectly |
| 05:13 | silasdavis | yes I had separately, I'll strip that out, I'd just like this file to run |
| 05:14 | silasdavis | how does lein find clojure modules? is it just everything below src? |
| 05:19 | nbeloglazov | silasdavis: try to move (mg/connect) inside main function |
| 05:21 | silasdavis | it seems to be the find call that is causing the problem |
| 05:23 | nbeloglazov | I'm not sure that mg/connect is called when you run -main function. So may be when you call mg/find you're not connected. |
| 05:27 | silasdavis | connect is fine outside of main function it seems. I wasn't selecting a database to use |
| 05:27 | silasdavis | do you understand why the require statement was causing the 'lib names inside prefix lists' issue? |
| 05:39 | ro_st | what's an idiomatic way to gather a flat list into a grouped-by… *checks for a group-by fn in core* |
| 05:40 | ro_st | aha! |
| 05:40 | ro_st | (inc read-core.clj-already) |
| 05:40 | lazybot | ⇒ 1 |
| 06:13 | tomoj | anyone seen the core.logic condp/condw gisted or available elsewhere? |
| 06:14 | tomoj | I found a condr that orders clauses randomly |
| 06:14 | tomoj | https://gist.github.com/2876680 |
| 06:14 | clgv | tomoj: for better average performance by chance? |
| 06:15 | tomoj | I'm thinking about logic programs for card games which involve shuffling |
| 06:16 | clgv | oh, wouldnt have thought of that ^^ |
| 06:16 | tomoj | dunno what the motivations for condr or condp really are, I hear there's a conj talk about condp but don't know if it's available |
| 06:17 | no7hing | ,(.foo (proxy [Object][] (foo [] (println "foo!")))) |
| 06:17 | clojurebot | #<IllegalArgumentException java.lang.IllegalArgumentException: No matching field found: foo for class sandbox.proxy$java.lang.Object$0> |
| 06:17 | no7hing | shouldn't this work? |
| 06:17 | clgv | well I think, if you cannot determine the best order of clauses for a given problem or there is not a single one, than condr might improve performance on average |
| 06:19 | clgv | no7hing: no. you need an interface which contains foo |
| 06:19 | clgv | or a protocol |
| 06:19 | no7hing | this is new in 1.4? |
| 06:19 | clgv | does that work in 1.3? |
| 06:20 | clgv | no, it does not |
| 06:20 | no7hing | probably not, i just looked up an example and they all did an override on existing functions |
| 06:20 | no7hing | dammit |
| 06:20 | clgv | try: (definterface IFoo (foo []))(.foo (proxy [Object IFoo][] (foo [] (println "foo!")))) |
| 06:21 | no7hing | works |
| 06:21 | clgv | ah. you definitely need to refer to an interface |
| 06:22 | clgv | even with protocol (defprotocol IBar (bar [this])) defined you need to use the interface of that protocol (.bar (proxy [Object user.IBar] [] (bar [] (println "bar!")))) assuming it was defined in namespace "user" |
| 06:23 | no7hing | silly me thought it'd would be awesome that proxy just creates an ad-hoc interface for me |
| 06:24 | clgv | no. I think there is no clojure construct that does that. proxy, reify, deftype/defrecord all need interfaces or protocols... |
| 06:24 | tomoj | how do you make a defne fail if an argument is an lvar? |
| 06:24 | tomoj | I expect (l/conda [(l/nonlvaro ?arg) l/fail] ...) to work, but it doesn't |
| 06:24 | tomoj | oh |
| 06:25 | tomoj | I mean, I expect (l/conda [(l/lvaro ?arg) l/fail] ...) to work |
| 06:26 | no7hing | no idea what drove me there |
| 06:32 | clgv | no7hing: ah :gen-class should be able to define new methods^^ |
| 06:36 | algernon | is it possible in any way to expose a PersistentArrayMap to Java, so that amap.get("foo") would look up :foo, instead of the string? |
| 06:37 | algernon | (I have a clojure lib, that ends up producing a map, with keyword keys, I'd like to expose that to Java, preferably by allowing the users to use strings instead of having to know a thing about clj keywords) |
| 06:43 | no7hing | clgv: i tried to steer clear of gen-class because of AOT ;) |
| 06:44 | clgv | algernon: you can construct clojure keywords |
| 06:44 | clgv | algernon: like that (clojure.lang.Keyword/intern ns name) |
| 06:47 | algernon | clgv: I know, that's what I do now, but that's kind of awkward in this case |
| 06:48 | clgv | algernon: well since it caches keywords it should be quite fast. you can write a wrapper aroung the map that automatically does the keyword creation |
| 06:48 | clgv | *around |
| 06:48 | algernon | I have things like for (Object o: s) { Map m = (Map) o; System.out.println(m.get(Keyword.intern("MESSAGE")); } |
| 06:48 | clgv | algernon: build the wrapper if you use it frequently in java |
| 06:49 | algernon | yeah, that's what I don't know how to. |
| 06:49 | clgv | what's the problem? |
| 06:49 | algernon | I tried extending PersistentArrayMap (which o is, under the hood), but then I get errors that say it can't be cated to my derived type |
| 06:50 | algernon | Exception in thread "main" java.lang.ClassCastException: clojure.lang.PersistentArrayMap cannot be cast to bb.XMap |
| 06:50 | algernon | stuff like that. |
| 06:50 | clgv | no dont do that. there is the golden rule: "Prefer composition over inheritance." one of the main messages of the gang of four book ;) |
| 06:52 | algernon | hrm. so, I should create a whole new class, that pretty much just wraps PersistentArrayMap, proxying everything but get? |
| 06:53 | clgv | select the interfaces you need and build a class base on them: the constructor gets a clojure map and you implement the interfaces |
| 06:53 | algernon | hmmm. that sounds reasonable. |
| 06:53 | clgv | so you should have your custom interface which gives you something like: "get-kw" |
| 06:53 | algernon | thanks, this'll get me going! |
| 06:54 | clgv | keep in mind the principle^^ |
| 07:00 | bosie | i use "lein midje" to run my midje test cases. works fine except if something fails i get a rather long stacktrace |
| 07:03 | bosie | example: https://gist.github.com/4327382 |
| 07:05 | ticking | how much bad style would it be to have a keyword argument that takes a numerical value or a magical keyword |
| 07:05 | ticking | say (rotate 45 :x 10 :y 5) and (rotate 45 :x :left :y :top) |
| 07:06 | algernon | clgv: thanks again, got my desired API to work fine :) |
| 07:06 | clgv | algernon: great :) |
| 07:07 | clgv | ticking: well the semantics seem unclear |
| 07:07 | clgv | ticking: I would add additional keywords for :left :top |
| 07:08 | ticking | clgv: yeah but what would you name them :D |
| 07:09 | clgv | ticking: no idea, I dont know what they do |
| 07:09 | ticking | provide an anchor around which a rotation occurs |
| 07:10 | ticking | my thought is that always providing thing like height/2 heigth and 0 is cumbersome when all you want is top bottom and center ^^ |
| 07:26 | clgv | ticking: how about :vertical and :horizontal then? |
| 07:27 | clgv | ticking: what do you use for keyword args? pure clojure? |
| 07:27 | ticking | clgv: right so you mean one could in theory do (rotate img 45 :x 5 :y 10 :horizontal :center :vertical :top) but in such case x and y will simply ovverride the horizontal and vertical? |
| 07:27 | ticking | clgv: you mean the calling code? |
| 07:27 | clgv | ticking: or you throw an error |
| 07:28 | ticking | it should be pure clojure yeah |
| 07:28 | clgv | ticking: you can specify either-or in the contract and throw an exception if both are given |
| 07:28 | ticking | clgv: that sounds as if there were already code for such thing ^^ |
| 08:07 | cemerick2 | test, sorry |
| 08:09 | cemerick | that was bizarre |
| 08:10 | ejackson | cemerick: you forked yourself ? |
| 08:11 | cemerick | ejackson: I had said something, but it didn't show up in my log, or in the web logs |
| 08:12 | cemerick | once I logged in from the freenode web client, messages from my regular client started showing up again |
| 08:15 | ejackson | that is bizarre. |
| 08:28 | bosie | how would i be able to pass an arrayseq into clojure.java.io/file ? |
| 08:42 | cemerick | bosie: you mean you have a seq containing a bunch of file path parts? |
| 08:43 | clgv | cemerick: "friend" does not offer brute-force protection, yet? |
| 08:43 | cemerick | clgv: as in, throttling authentication requests and such? |
| 08:44 | bosie | cemerick: yes, apply seems to be the thing |
| 08:44 | cemerick | bosie: yup, that's what you want |
| 08:44 | clgv | cemerick: yeah temporary bans after several attempts |
| 08:46 | cemerick | clgv: nope. Would be pretty easy to do in a naive way (which would probably work just fine in nearly all cases) |
| 08:47 | clgv | cemerick: would be a nice addition to friend ;) |
| 08:47 | cemerick | Things like lock-outs would need to be implemented on a per-workflow and per-credential-source basis though. |
| 08:47 | borkdude | (def as (clojure.lang.ArraySeq/create (to-array ["tmp" "test" "textfile.txt"]))) |
| 08:47 | borkdude | (apply file as) |
| 08:47 | cemerick | clgv: Be my guest. ;-) Should go into a separate library though, at least to start. |
| 08:48 | borkdude | meanwhile the question had already been answered and I have figured out how to create an ArraySeq :P |
| 08:49 | cemerick | borkdude: just (seq any-java-array) will do |
| 08:49 | clgv | cemerick: I did not investigate the internals of friend,yet. you could add it to the list of goals as hint what others may work on |
| 08:49 | borkdude | cemerick I knew there had to be an easier way ;) |
| 08:50 | borkdude | I've really not worked with java arrays in clojure, never needed to |
| 08:53 | borkdude | however, the arguments of a vararg function get collected in an ArraySeq |
| 09:19 | jsabeaudry | Recommendations for async http server besides aleph (too slow)? |
| 09:26 | ro_st | jsabeaudry: atmosphere was in the most recent clojure digest |
| 09:27 | ro_st | no clojure abstraction yet, but it seems to be well liked |
| 09:36 | ejlo | has anyone here managed to get the clojurescript browser repl working with node-webkit? |
| 09:40 | jsabeaudry | ro_st, great, will try it out right now, I found another one named http-kit but it throws on big files |
| 09:43 | samrat | could someone take a look at my attempt to upload files using Dropbox API(its not working): https://bitbucket.org/samrat/jopbox/src/620d223b33b85dbe16b787e653c20d25864f2ca6/src/jopbox/client.clj?at=default#cl-66 |
| 09:43 | jsabeaudry | ro_st, isn't that a social network api? |
| 09:46 | jsabeaudry | ro_st, oh nevermind, finally found it |
| 09:46 | Fauno1 | @samrat, Access denied |
| 09:46 | Fauno1 | Use the links at the top to get back. |
| 09:56 | jsabeaudry | Does lein uberjar AOT compile everything by default? |
| 09:56 | cark | nope |
| 09:58 | cark | actually i think yes, but it will include the source code |
| 09:58 | cark | there is the :omit-source true option in project.clj |
| 09:59 | jsabeaudry | cark, that will not affect start-up time however, right? |
| 10:00 | cark | i don't think so |
| 10:00 | cark | but you know, your best bet is to check the content of an ubberjar for yourself |
| 10:01 | cark | jar xf myjar.jar |
| 10:01 | clgv | jsabeaudry: lein uberjar compiles those files transitively which are required in the namespace with your main method. |
| 10:01 | cark | that should unpack it |
| 10:02 | samrat | Fauno1: sorry, I've made it a public repo now |
| 10:56 | moogatronic | Any emacs exp. people using SublimeText2? I'm looking for a workable setup that gives at least some of the sexp eval, Paren, and general 'integrated' feel that Emacs/nrepl gives. (Mostly to show other people who have 0 emacs experience a working clojure setup that isn't really annoying to work in) |
| 10:59 | borkdude | moogatronic no, but maybe eclipse+ccw is good for beginners/no-emacsers too |
| 11:00 | moogatronic | borkdude: yeah, though, having had to use eclipse for about 10 years, I would *really* like to avoid inflicting that thing on anyone, especially casual newb-ish programmers. |
| 11:00 | moogatronic | ccw itself looks pretty awesome though. |
| 11:01 | borkdude | moogatronic maybe light table, but that's not very stable and complete yet |
| 11:01 | rkz | what's wrong with the web editor bodil made? it's very noob friendly |
| 11:01 | borkdude | moogatronic I recommend ccw to my students, if they don't want to go the emacs road |
| 11:01 | rkz | https://github.com/bodil/catnip |
| 11:03 | borkdude | rkz now that you mention it, I used it when it was at version 0.1 |
| 11:03 | borkdude | rkz gonna try that again |
| 11:03 | moogatronic | rkz: nothings wrong, but I am wanting local 'app' editor / configurations. |
| 11:04 | rkz | moogatronic: it's local, just runs via browser :) |
| 11:04 | borkdude | moogatronic everything runs local in catnip |
| 11:04 | borkdude | in fact Bodil is here, the creator of this |
| 11:04 | moogatronic | maybe i'll check it out. does it fire up nrepl from lein and all that stuff? |
| 11:05 | moogatronic | borkdude: yeah, I saw her preso at the conj |
| 11:05 | borkdude | moogatronic I wouldn't know about nrepl, ask Bodil |
| 11:08 | borkdude | wow, catnip really improved since I saw it |
| 11:08 | moogatronic | looks like this may be what i want, based off the read me at any rate. =) |
| 11:10 | borkdude | I think I made it crash though, by evaluating (read-line) in the repl… ;) |
| 11:22 | Ferdy_ | Hi, on behalf of 3 Bsc students competer science I am looking for a thesis project/internship. Is there anyone who can help me or point me in the right direction? |
| 11:23 | Fauno1 | i'm starting to build my own continuous integration platform in clojure which i could open-source if you're interested |
| 11:23 | borkdude | hello Ferdy, I see you are from Delft, how nice |
| 11:23 | Ferdy_ | =) |
| 11:24 | borkdude | borkdude I'm working at hogeschool utrecht and have done some clojure projects with my students |
| 11:24 | borkdude | Ferdy_ I mean… (something up with my typing) |
| 11:24 | vijaykiran | Fauno1: interesting - something like Jenkins ? |
| 11:24 | borkdude | Ferdy_ would you like to work with a company or within your university? |
| 11:25 | Ferdy_ | Depends on the project |
| 11:25 | borkdude | Ferdy_ doesn't the project depend on what you want in the first place? |
| 11:27 | Ferdy_ | borkdude True I suppose. However we don't have too clear of an idea of what we want to do. We have to do a project for a third party such as a teacher or company. Either could be interesting |
| 11:29 | ciphergoth | Should I have stars either side of the name of my dynamic vars? Is that the convention? |
| 11:29 | borkdude | Ferdy_ should it involve clojure and is that the reason why you're asking in here? |
| 11:29 | borkdude | ciphergoth it's convention, but really the metadata decides if it's dynamic from 1.3 onward |
| 11:30 | ciphergoth | borkdude: OK - yep noticed that it's now a metadata thing, but wanted to follow the conventions too! |
| 11:30 | tbaldridge | ciphergoth: but I think these conventions are "enforced" via warnings these days. So if you have a dynamic var without them it might complain |
| 11:30 | ciphergoth | no it doesn't complain |
| 11:30 | ciphergoth | but it does complain if you put stars without a dynamic marker |
| 11:30 | ciphergoth | that's how I know about the convention :) |
| 11:31 | Ferdy_ | borkdude The 3 of us really enjoy working with clojure and think there is a lot of interesting ground not covered in our curiculum. So we would like to do it in clojure but our university doesn't seem to care for clojure. |
| 11:31 | vijaykiran | ciphergoth: yeah, it complains the otherway round |
| 11:32 | TimMc | Whenever somesome says *earmuffs*, I always think @earmuffs@ instead. :-/ |
| 11:32 | borkdude | Ferdy_ let's talk private in Dutch if you don't mind, maybe we can exchange some contact details |
| 11:37 | crease | is there any way to implicitly specify project-wide namespace stuff in a leiningen profile? Like if I wanted every namespace to require pprint when developing, but didn't want that explicitly in the ns form |
| 11:37 | bosie | is there a way to overload functions based on values? |
| 11:37 | bosie | i.e. i have one parameter and if its nil, do this, if not do that |
| 11:37 | moogatronic | bosie: multi methods? |
| 11:38 | gtrak | crease: it sounds like a bad idea.. I would just make a utility function for that and put it in a shared namespace |
| 11:38 | bosie | moogatronic: lemme check |
| 11:38 | moogatronic | you can dispatch on type, value, etc. |
| 11:39 | bosie | was hoping for sth like (defn foo [nil] 0 [x] (println x)) |
| 11:39 | moogatronic | google turns up some pretty good examples |
| 11:39 | borkdude | bosie multmethods yes |
| 11:39 | bosie | k |
| 11:39 | borkdude | bosie or pattern matching |
| 11:40 | bosie | borkdude: that was the word i was looking for, thx |
| 11:40 | borkdude | bosie defn doesn't support it out of the box, but there's this https://github.com/clojure/core.match |
| 11:40 | bosie | borkdude: yup |
| 12:16 | crease | gtrak: yeah, probably a bad idea |
| 12:17 | gtrak | crease: you could put some require's in a fn in a test namespace, that's probably the easiest thing |
| 12:18 | gtrak | (crease.util/repl-bits) or something like that |
| 12:18 | technomancy | crease: you can do that using nstools |
| 12:18 | technomancy | but it's out of scope for leiningen |
| 12:19 | technomancy | I agree it's annoying to have to copy/paste things all around for simple things like pprint; nstools does a decent job of making that better |
| 12:19 | gtrak | hrm... I feel like if you're doing repetitive stuff, you'd want to group it into its own namespace... what's wrong with a little indirection? |
| 12:20 | joevandyk_ | are all the lein project templates embedded in lein? or does it look them up somewhere? |
| 12:20 | crease | gtrak: it's not a very principled thing, it's just that my hands start falling off after typing (use 'clojure.pprint) (use 'clojure.repl) a billion times |
| 12:20 | technomancy | joevandyk_: it comes with a few templates (see the lein-newnew project) but can download them dynamically from clojars as well |
| 12:21 | joevandyk_ | technomancy: clojars == rubygems.org? |
| 12:21 | technomancy | joevandyk_: more or less |
| 12:21 | crease | technomancy: I'll look into that, thanks. |
| 12:21 | gtrak | crease: sounds like you need a pprint foot-pedal |
| 12:21 | joevandyk_ | what's with all the "Could not find artifact lein-ring:lein-ring:pom:0.7.5 in central (http://repo1.maven.org/maven2)" warnings/errors? |
| 12:21 | joevandyk_ | just me? |
| 12:21 | crease | gtrak: I'm guessing you're joking but that's actually an awesome idea |
| 12:22 | crease | hm |
| 12:22 | gtrak | haha |
| 12:22 | technomancy | gtrak: yeah actually nrepl middleware or something to auto-pprint things might be worth experimenting with |
| 12:23 | TimMc | crease: It really is. |
| 12:24 | joevandyk_ | i did 'lein new compojure hello', then 'lein run' and i get "No :main namespace specified in project.clj" Shouldn't that be put in the project.clj by the template generator? |
| 12:24 | technomancy | joevandyk_: lein looks in central (java-centric repo) as well as clojars |
| 12:24 | technomancy | so it's saying it can't find it in central and is falling back to clojars |
| 12:24 | technomancy | which is kind of silly; the master version is better about only telling you things that matter |
| 12:24 | weavejester | joevandyk_: Why would it? There's nothing to run... |
| 12:24 | weavejester | joevandyk_: If you want to start a development server, you can do "lein ring server" |
| 12:25 | joevandyk_ | weavejester: ah |
| 12:25 | joevandyk_ | weavejester: i'm confused by "there's nothing to run" |
| 12:25 | technomancy | joevandyk_: yeah it's not obvious how that template doesn't give you an embedded jetty server |
| 12:26 | weavejester | joevandyk_: Well, you're defining a web application, which in Clojure terms means a Ring handler. |
| 12:26 | weavejester | joevandyk_: How a Ring handler is turned into a web server is up to you |
| 12:26 | crease | I haven't played around with nrepl middleware much, it looks like the place to go though. and pretty easy to write… I've been wanting a way to throw together queries on projects quickly |
| 12:26 | technomancy | I wonder what the numbers are on non-jetty web users |
| 12:27 | technomancy | suspect they're pretty slim |
| 12:27 | joevandyk_ | weavejester: ah. ok. |
| 12:27 | weavejester | The latest snapshot of lein-ring allows you to create an executable jar which uses the embedded Jetty server |
| 12:27 | weavejester | I'll probably release it this weekend, since it seems to work well enough |
| 12:27 | crease | tap the foot-pedal, get a tree of all references to a function in a project… |
| 12:27 | technomancy | personally I think including a :main in the template would be a good default for beginners |
| 12:28 | antoineB | hello, how to import a protocol in clojurescript? (i get " is not a protocol" warning ) |
| 12:28 | gtrak | crease: I use this in a util namespace all the time: (defn and-print [val] (pp/pprint val) val) |
| 12:28 | joevandyk_ | What's the best way to learn about the infrastructure parts of clojure? testing, packaging, deploying, organizing, etc? |
| 12:28 | weavejester | The README of the template does explain how to get the server started, though maybe a (println) would be useful as well |
| 12:28 | technomancy | joevandyk_: start with `lein help tutorial` |
| 12:29 | antoineB | i used (ns some.ns (:use [some.other.ns :only [ISomeProto someProtoDef]]) |
| 12:29 | joevandyk_ | technomancy: perfect! thanks! |
| 12:29 | technomancy | joevandyk_: clojure-doc.org has some great content too |
| 12:29 | gtrak | during threading, it's kinda like a ruby's tap, afaict |
| 12:29 | technomancy | tap is doto, isn't it? |
| 12:29 | weavejester | technomancy: I'm a little adverse to including a main method in the template, as that combines a method of deployment with the actual code... |
| 12:29 | gtrak | yea, suppose so |
| 12:30 | weavejester | My preference is to provide different outputs: war file, executable jar, development server, etc. |
| 12:30 | technomancy | weavejester: well that's the thing about templates; it's very obvious what they're doing, and the 5% who are deploying to tomcat typically know what they're doing |
| 12:30 | technomancy | so it's easy for them to just strip out the bits they don't like |
| 12:30 | technomancy | in fact people deploying to tomcat are probably a lot less likely to use the template to begin with |
| 12:30 | gtrak | doto pprint is more general, you're right |
| 12:31 | TimMc | sppy |
| 12:31 | weavejester | technomancy: Yes… but templates should also guide users to the "right way" of doing things |
| 12:31 | TimMc | (defmacro sppy [form] `(doto ~form (pprint))) |
| 12:32 | weavejester | I don't think having a main method in your project is the right way to start out. |
| 12:32 | gtrak | it's weird to use doto because I learned as a java interop form |
| 12:32 | weavejester | Because you're writing a web application, not a console application |
| 12:33 | technomancy | I don't see the point of distinguishing unless you're trying to integrate into an existing legacy environment |
| 12:33 | Ember- | hmm, I see no problem in having a main function if you are doing a web application |
| 12:34 | amalloy | man, are you guys writing this macro again? you're missing the key feature: (defmacro ? [x] `(let [x# ~x] (printf "%s is %s" (pr-str x#) ~(pr-str x)) x#)) |
| 12:34 | joevandyk_ | technomancy: the 'lein help tutorial' stuff is *perfect* |
| 12:34 | technomancy | joevandyk_: swet |
| 12:34 | Ember- | in fact, that's the way I'd prefer to do it if app containers would allow it all the time |
| 12:34 | technomancy | sweet |
| 12:35 | amalloy | er, except i got the two args to printf backwards. you get the idea, i think: print the form as well as its value |
| 12:35 | gtrak | amalloy: nice |
| 12:36 | weavejester | technomancy: It's not necessarily just legacy environments like servlet containers |
| 12:36 | joevandyk_ | best way to get autotest-like functionality? |
| 12:36 | hyPiRion | joevandyk_: lazytest I think |
| 12:36 | technomancy | joevandyk_: keep it in the repl |
| 12:36 | ejackson | which profile does leiningen use to find repositories for lein jar ? |
| 12:36 | technomancy | for emacs, clojure-test-mode |
| 12:36 | joevandyk_ | vim? |
| 12:36 | clojurebot | Gesundheit! |
| 12:37 | weavejester | And the idea is to separate the definition of a web app from the implementation |
| 12:37 | ejackson | lein repl finds my nexus repo, lein jar gets upset. I have the repo described in ~/.lein/profiles.clj under {:user ....} |
| 12:37 | amalloy | wait, servlet containers are legacy environments now? |
| 12:37 | TimMc | amalloy: No, I was just writing the basic version, knowing you'd fill it in. :-D |
| 12:38 | weavejester | amalloy: In my view ;) |
| 12:38 | technomancy | ejackson: the user repo is the wrong place for repos that you can't build the jar without |
| 12:38 | technomancy | ejackson: that's what you call a recipe for Works on My Machine =) |
| 12:38 | TimMc | amalloy: The background there was wanting to have a pprint version. |
| 12:38 | ejackson | hehehe, yeah, rather what I'm discovering :) |
| 12:39 | amalloy | yeah. but i never use pprint so i couldn't remember how to get it to write to *out* without just lamely (binding ...) |
| 12:40 | TimMc | amalloy: The key is to have that foot-pedal change an atom (I think) so that a (printer) fn returns the right print fn. |
| 12:40 | gtrak | I want a write-my-program button on my foot pedal |
| 12:40 | amalloy | speaking of which: foot pedal, really? i mean, i'm all in favor of foot pedals, but this sounds more like a job for a keyboard shortcut |
| 12:40 | amalloy | or a keybinding, if you're in emacs |
| 12:41 | TimMc | FOOT PEDAL |
| 12:41 | TimMc | It's a mode, not a command. |
| 12:41 | TimMc | Or maybe it should be a set of stops, like on an organ. |
| 12:41 | gtrak | I've been thinking of using this for a generic controller: https://github.com/overtone/grid |
| 12:41 | gtrak | now that we're talking about organs |
| 12:42 | gtrak | it even lights up and stuff |
| 12:42 | ejackson | technomancy: the problem is that I don't control the source, and the dep in question is not on a public repo. No problem, just host locally in nexus, but now I figure out how to resolve the repo without changing the project.clj. |
| 12:42 | technomancy | ejackson: so the source is broken =( |
| 12:43 | ejackson | technomancy: alright, I'll go upstream then :) |
| 12:45 | crease | foot pedal, definitely. with stops |
| 12:46 | crease | I was thinking pressure plates on desk chairs, so you can instruct the repl exactly how pretty to print by shifting your weight |
| 12:47 | crease | gtrak: you shouldn' t put buttons on your pedal. finger-pinch |
| 12:47 | gtrak | hook up an extra monitor to your tongue: http://www.dailymail.co.uk/sciencetech/article-1210425/Blind-people-able-using-amazing-tongue-tingling-device-bypasses-eyes.html |
| 12:50 | TimMc | Ugh, the Daily Mail. |
| 13:12 | bosie | is there a way to make midje use nailgun ? the startup times of midje are too slow |
| 13:14 | mabes | bosie: you're best bet is to try to use drip since it has lein integration (https://github.com/flatland/drip) |
| 13:14 | mabes | s/you're/your/ |
| 13:14 | mabes | drip will only save on the JVM start up time though |
| 13:14 | joevandyk_ | i'm using vimclojure, but i'd love for the output of the repl to go to a different terminal window (or maybe the terminal that's running nailgun. is that possible? |
| 13:15 | bosie | mabes: as opposed to? |
| 13:16 | technomancy | bosie: you should just start a repl and do all your work in it |
| 13:16 | technomancy | starting a new process just to run your tests is not the way to go |
| 13:17 | bosie | technomancy: and then execute midje through the repl? |
| 13:17 | joevandyk | technomancy: is there a screencast or something about how to edit code and work with files inside a repl? i'm so used to editing files and running them |
| 13:18 | technomancy | bosie: yeah |
| 13:18 | technomancy | joevandyk: hmm... not sure what would be helpful there |
| 13:18 | joevandyk | technomancy: you edit functions and save them to files inside the repo? |
| 13:19 | technomancy | right |
| 13:20 | mabes | bosie: as opposed to JVM start up time + load time of midje and your app. technomancy is right about using the repl.. the newest version of midje has nice repl support |
| 13:21 | bosie | mabes: looking at it now |
| 13:26 | bosie | mabes: can't seem to figure out how to do it in the repl |
| 13:27 | antoineB | is there someone here, involved in clojurescript analyzer dev? |
| 13:27 | dnolen | antoineB: yep |
| 13:28 | antoineB | i get "is not a protocol" error, when i use a protocol imported from another file |
| 13:28 | mabes | bosie: this may help https://groups.google.com/forum/?fromgroups=#!topic/midje/XH5WOZFMrAA ... So, in 1.5-alpha3 you can say (load-facts :all) |
| 13:28 | antoineB | i suspect the "resolve-var" in cljs.analyzer remove the meta-data |
| 13:31 | bosie | mabes: i use alpha3. i load a repl with "lein repl" and do "> (use 'midje.sweet)" |
| 13:31 | bosie | (load-facts :all) results in "unable to resolve symbol" |
| 13:31 | dnolen | antoineB: do you have a minimal reproducible case? Can you make a gist of what you're trying to do? |
| 13:32 | antoineB | dnolen: i will test in a repl |
| 13:32 | bosie | mabes: clearly i am doing it wrong ;) |
| 13:33 | pandeiro | is declare supposed to work in cljs? |
| 13:33 | dnolen | antoineB: a little more info would be helpful. Are you running into this problem when using lein-cljsbuild? the clojurescript compiler directly? |
| 13:33 | dnolen | pandeiro: yes |
| 13:36 | pandeiro | dnolen: definitely doesn't work in the Rhino REPL on the latest release, cleaning my cljsbuild cache and testing in browser... |
| 13:36 | antoineB | dnolen: lein-cljsbuild, i haven't the problem before, but a update to lein-cljsbuild form 0.2.9 to 0.2.10 |
| 13:37 | antoineB | *i update form 0.2.9 to 0.2.10 and the problem appear |
| 13:38 | dnolen | pandeiro: declare still works - but it seems like it may have issues in the Rhino REPL. |
| 13:39 | pandeiro | dnolen: w/ lein-cljsbuild 0.2.10 + :whitespace i get nothing in the output js from declare |
| 13:39 | dnolen | antoineB: please create a minimal case and open a ticket. |
| 13:40 | dnolen | pandeiro: declare shouldn't generate any code, it doesn't do anything. |
| 13:40 | pandeiro | dnolen: shouldn't it just create the key in the namespace? |
| 13:41 | dnolen | pandeiro: I don't see why it should, it's likely to get removed anyway. |
| 13:42 | TimMc | dnolen: Because of var hoisting in JS? |
| 13:42 | pandeiro | dnolen: i thought of declare as a way of "re-enabling" the JS hoisting behavior we're used to? |
| 13:42 | dnolen | TimMc: no because of optimizations. |
| 13:42 | dnolen | pandeiro: declare is meant to be used precisely as it's meant to be used in Clojure, hoisting has nothing to do w/ it. |
| 13:43 | dnolen | it's for forward declarations of top levels |
| 13:44 | pandeiro | dnolen: not sure what that accomplishes if the JS interpreter will still trip up on any var that hasn't been actually defined when it is used in code |
| 13:44 | dnolen | http://dev.clojure.org/jira/browse/CLJS-444 |
| 13:44 | pandeiro | k |
| 13:44 | dnolen | pandeiro: will look into it, this probably an unfortunate side effect of some dead code elimination improvements. |
| 13:45 | pandeiro | dnolen: i had been using declare in the manner TimMc and I alluded to in previous versions of CLJS and i remember it working... so i think you might be right |
| 13:46 | dnolen | pandeiro: it's error to use it that way. |
| 13:46 | dnolen | no promises were ever made about unintended uses of declare |
| 13:46 | pandeiro | dnolen: hmm, then i don't understand the use case, honestly |
| 13:46 | dnolen | pandeiro: forward declaration, that's it |
| 13:46 | pandeiro | i mean cljs doesn't really exist apart from the JS runtime |
| 13:47 | dnolen | pandeiro: however if you're running into something where the semantics don't line up w/ Clojure then by all means, that's a bug too. |
| 13:47 | antoineB | dnolen: https://gist.github.com/4330709 |
| 13:47 | dnolen | pandeiro: but I can't think of case that doesn't involve ns manipulation where it wouldn't blow up in Clojure JVM |
| 13:47 | antoineB | dnolen: i tested it in a fresh project |
| 13:47 | pandeiro | dnolen: hard to assess, because in my mind 'forward declaration' and function housing in JS are practically synonymous, albeit achieved by different means |
| 13:48 | dnolen | pandeiro: that's not what it means |
| 13:48 | dnolen | pandeiro: there are no hoisting semantics to `declare` in clojure at all |
| 13:48 | antoineB | just also notice that the command "lein cljsbuild once" don't end (don't give me back the bash) |
| 13:48 | dnolen | pandeiro: using any top level name before def or declare is an error. it's that simple. |
| 13:49 | pandeiro | dnolen: ah no, you're misunderstanding me: i am doing (declare foo) and then (defn foo ...) later in the namespace file |
| 13:49 | dnolen | antoineB: that's a lein-cljsbuild bug. |
| 13:49 | pandeiro | and JS trips up regardless with an undefined error |
| 13:49 | antoineB | dnolen: you mean the "once" command or the warning? |
| 13:50 | antoineB | for the "once" it's a cljsbuild bug |
| 13:50 | pandeiro | dnolen: i understand the semantics are different, but functionally, the two mechanisms allow for the same common coding technique: defining things later in the file than they are used, ie code organization |
| 13:50 | dnolen | pandeiro: heh, ok, I thought we were talking past each other. |
| 13:51 | dnolen | pandeiro: attach a minimal case not at the REPL that demonstrates what you're talking about. Though that seems weird since we're using declare in core.cljs and not seeing any undefined issues. |
| 13:51 | dnolen | pandeiro: to the ticket |
| 13:51 | pandeiro | dnolen: k, will do |
| 13:51 | pandeiro | dnolen: commen to the same ticket as yours, or new ticket? |
| 13:52 | dnolen | pandeiro: i'll change the ticket title. |
| 13:52 | dnolen | pandeiro: done |
| 13:53 | dnolen | antoineB: can you include the error you are seeing in your paste? |
| 13:53 | antoineB | i made a comment |
| 13:55 | antoineB | cljsbuild 0.2.10 use ClojureScript version 0.0-1552. |
| 13:57 | antoineB | dnolen: if you look like at the error message, you go into "extend-type" macro |
| 14:01 | dnolen | antoineB: are you sure there is not a type involved here, I just tried it and it works for me no error |
| 14:01 | dnolen | type -> typo |
| 14:02 | antoineB | dnolen: do you use cljsbuild? |
| 14:03 | dnolen | antoineB: yep 0.2.10 |
| 14:03 | dnolen | pandeiro: feel free to comment on this ticket, http://dev.clojure.org/jira/browse/CLJS-444 |
| 14:04 | pandeiro | dnolen: i'm afraid it was user error on my part, expecting "hoisting" behavior, as you pointed out |
| 14:04 | pandeiro | sorry |
| 14:04 | pandeiro | it's because in JS, I can call a function before it's defined |
| 14:04 | pandeiro | and in Clojure, declare really doesn't allow that |
| 14:04 | pandeiro | sorry to waste your time with that |
| 14:04 | dnolen | antoineB: if you're certain you can reproduce - it's easiest if you can make a project that illustrates the issue, then I can clone that and try it out using your exact setup modulo OS & JVM environment |
| 14:04 | pandeiro | but the Rhino REPL really does barf on (declare ...) in any case |
| 14:04 | pandeiro | not sure that's a major bug |
| 14:05 | dnolen | pandeiro: ok, updating the title. |
| 14:05 | antoineB | dnolen: ok |
| 14:05 | dnolen | pandeiro: it's a bit annoying for interactive dev |
| 14:05 | harob | Hi all, I wanted to get your thoughts on a recurring problem in my code: I often want to have alternating computations and side-effecting statements (e.g. logging of the intermediate computed results). The way I do that now is with "fake" let variables, but it seems really hackish: |
| 14:05 | harob | let [a (compute-a) |
| 14:05 | harob | _ (log-a a) |
| 14:05 | harob | b (compute-b a) |
| 14:05 | harob | _ (log-b b) |
| 14:05 | harob | ...] |
| 14:05 | harob | The other way I can think of would be to have many nested let statements, and do the logging in the implicit do's, but that makes the code even less readable. Is there a better solution for this? |
| 14:05 | technomancy | harob: 0) please use a paste site like gist or refheap; 1) try (doto (compute-a) log-a) |
| 14:06 | pandeiro | dnolen: i really wanted to be able to define an "on-ready" fn for initiating my app, but throw that definition at the bottom of the file, after the more 'important' code, which is something i could do in JS of course |
| 14:08 | dnolen | pandeiro: I don't see how that problem isn't solved w/ declare. |
| 14:08 | harob | technomancy: got it for gist! doto sounds good, although I would have as many doto statements as intermediate variables. I think ideally there would be a higher-level construct similar to let but that supports skipped |
| 14:08 | joevandyk | what is "trampoline", as in "lein trampoline"? |
| 14:08 | harob | expressions |
| 14:08 | borkdude | you could also let the logging function just return its argument… let [a (log (compute a))] …, don't know.. is that evil? |
| 14:09 | technomancy | joevandyk: it's a way to avoid having both Leiningen's JVM and the project's running at the same time |
| 14:09 | hyPiRion | borkdude: it's okay for debugging at least |
| 14:09 | technomancy | joevandyk: Leiningen enforces a separation between your code and its code, which is pretty different from ruby. it tries to be as transparent as possible, though there are a few necessary exceptions. |
| 14:09 | hyPiRion | But purists/functional extremists may want to hunt you down |
| 14:10 | borkdude | hyPiRion we can wrap it inside an IO monad anytime, to hide the evil |
| 14:10 | pandeiro | dnolen: (declare on-ready) (defn do-stuff []) (on-ready do-stuff) (defn on-ready [f] (set! (.-onload js/window) f)) <-- this won't work b/c the call to on-ready comes before the definition |
| 14:10 | squidz | can anybody point me to some code using enlive for html templating? |
| 14:11 | pandeiro | dnolen: which is expected, right? same would happen at the clj repl |
| 14:11 | antoineB | dnolen: for my test project, i find the typo, i used a .clj instead of a .cljs |
| 14:12 | dnolen | pandeiro: yeah that won't work. |
| 14:12 | squidz | so far Ive mostly found tutorials on how to use enlive for scraping, but I would really like to see real examples of it being used for templating |
| 14:12 | TimMc | squidz: Here's some I wrote recently: https://github.com/timmc/pellucida/blob/master/src/org/timmc/pellucida/listing.clj |
| 14:12 | squidz | TimMc: thanks |
| 14:12 | dnolen | antoineB: good to hear it's not a bug in CLJS that would have been a bad bug :) |
| 14:13 | pandeiro | dnolen: so basically i was asking for JS weirdness to be brought into CLJS and was appropriately scolded by you ;) |
| 14:13 | TimMc | squidz: I found Enlive to have a long learning curve. |
| 14:13 | joevandyk | technomancy: hm, if I use lein 2 with heroku, 'lein deps' doesn't seem to be ran automatically? |
| 14:13 | harob | By the way, is the let-with-fake-undercore pattern acceptable in the clojure community? I saw it in the Emerick-Carper-Grand book. |
| 14:13 | squidz | is it worth it in the end? Normally Ive only really used java's wicket, i'm guessing it's much different |
| 14:14 | technomancy | joevandyk: correct; running deps hasn't been necessary for a long time |
| 14:14 | borkdude | squidz here is something from a project of mine https://www.refheap.com/paste/7701 |
| 14:14 | dnolen | pandeiro: heh hopefully not scolded. I was confused by you asking for something clearly not allowed in Clojure. |
| 14:14 | TimMc | squidz: I'm not familiar with Wicket. I like Enlive's separation of HTML and transformation. |
| 14:14 | squidz | borkdude: thanks |
| 14:14 | harob | squidz: The Programming Clojure book has an excellent tutorial on Enlive, much better than I found online. And yes, it is worth it? |
| 14:14 | joevandyk | technomancy: ah. on the first request to heroku, it starts downloading all the dependences, which takes a minute or two |
| 14:14 | pandeiro | dnolen: i was totally trying to get hoisting into cljs :) |
| 14:14 | joevandyk | (while the request hangs) |
| 14:14 | technomancy | yeah |
| 14:14 | joevandyk | which doesn't happen with lein1 |
| 14:15 | technomancy | hm; should be the same |
| 14:15 | squidz | harob: thanks for the tip, ill take a look at it |
| 14:15 | TimMc | borkdude: Combining Hiccup and Enlive, there? |
| 14:16 | borkdude | TimMc yes, is that evil also? |
| 14:16 | TimMc | Well, it certainly startled me. |
| 14:17 | borkdude | TimMc it's called pragmatic instead of pure ;) |
| 14:18 | borkdude | TimMc or a lack of enlive knowledge, probably that |
| 14:18 | technomancy | enlive is hard =\ |
| 14:18 | squidz | why is it so hard? |
| 14:19 | technomancy | it's not documented and the conceptual model behind it is difficult to grasp |
| 14:19 | squidz | ah, okay, so the documentation is really a problem i guess |
| 14:20 | squidz | I thought my google-fu just wasn't sufficient |
| 14:20 | technomancy | all the docs for it I could find were like "here, do it like this" rather than explaining what was really going, which leads to copy/paste coding rather than real understanding |
| 14:20 | technomancy | *going on |
| 14:20 | borkdude | yes, I agree. there is documentation, but it lacks examples |
| 14:20 | squidz | technomancy: you used to program ruby if I remember corrrectly, how long did you do ruby? |
| 14:20 | technomancy | squidz: around 2005-08, and I've picked it up a bit again for work |
| 14:21 | squidz | okay, are you happy with almost completely moving over to clojure? |
| 14:21 | technomancy | I'm much happier working in Clojure, but there are still some things the JVM is rubbish at |
| 14:21 | callen | technomancy: other than scripts, what? |
| 14:22 | squidz | interesting |
| 14:22 | technomancy | callen: subprocess management and unixy things primarily |
| 14:22 | technomancy | disposable processes |
| 14:22 | callen | technomancy: oh yes. |
| 14:22 | callen | borkdude: compared to most template libraries, Enlive is black magic in a bad way. |
| 14:22 | squidz | has learning clojure changed the way you program ruby now |
| 14:22 | callen | borkdude: I'd rather use Fleet or Stencil. |
| 14:22 | technomancy | the codebase I manage at work is practically all messing with subprocesses and SSH |
| 14:23 | Ember- | well, it did get better though, process management with java at least |
| 14:23 | callen | I'd *really* rather have something like Play or Django/Jinja templates though. |
| 14:23 | squidz | callen: what templating engine do you recommend? |
| 14:23 | technomancy | squidz: well I never wrote "proper" OOP ruby to begin with |
| 14:23 | borkdude | callen I like css selectors and total separation of html and templating |
| 14:23 | callen | squidz: Fleet or Stencil, to taste. |
| 14:23 | Ember- | not saying it couldn't be better though |
| 14:23 | technomancy | just a bunch of methods on modules |
| 14:23 | callen | borkdude: yeah uh, what you just said doesn't mean what you think it means. |
| 14:23 | callen | borkdude: think carefully to yourself about the implications of writing backend code that complects CSS classes with passing data to the frontend. |
| 14:23 | callen | borkdude: how much does that make really? |
| 14:24 | callen | further it makes the ludicrous assumption that templating is only needed where HTML or XML are involved. |
| 14:24 | callen | how much sense* |
| 14:24 | borkdude | callen what do I think it means? |
| 14:24 | TimMc | squidz: Enlive requires you to be *really* comfortable with higher order functions if you want to do anything non-trivial. |
| 14:24 | callen | borkdude: backend code should not care about CSS classes on the frontend. |
| 14:24 | callen | I have great news though, you see, the world found a better way. |
| 14:24 | squidz | TimMc: so it enforces good practice? |
| 14:24 | borkdude | I feel a religious debate is coming up |
| 14:24 | TimMc | No, it' just requires a certain way of thinking. |
| 14:24 | callen | It's called passing a map or dictionary of data to the template-side. works great. |
| 14:25 | hyPiRion | Oh, it's almost time for the quine to reappear. |
| 14:25 | borkdude | callen that is basically how you use a deftemplate I guess? |
| 14:25 | squidz | callen: what do you use for making sites instead of enlive? |
| 14:25 | callen | technomancy: that doesn't surprise me that work there involves that amount of mucking about. |
| 14:26 | callen | squidz: usually Stencil, mostly because of refheap (raynes), but I've tinkered with fleet and been fairly impressed. |
| 14:26 | technomancy | callen: our platform is all based around HTTP applications, and I'm stuck maintaining an SSH-based app =( |
| 14:26 | callen | Fleet is analogous to JSP for Clojure. |
| 14:26 | amalloy | hyPiRion: Raynes removed the timer because he is a spoilsport who thinks that a message every 16 hours is spammy |
| 14:26 | hyPiRion | Unless Raynes killed it. |
| 14:26 | hyPiRion | oh |
| 14:26 | TimMc | squidz: http://clojure-log.n01se.net/date/2012-11-29.html#00:38 |
| 14:26 | squidz | t |
| 14:26 | squidz | TimMc: thanks |
| 14:27 | hyPiRion | Well, I don't mind. Did he remove timers altogether? |
| 14:27 | TimMc | That was my insight. |
| 14:27 | technomancy | I'm working on a replacement with HTTPS-based git, but HTTP really sucks for this kind of thing in a number of ways |
| 14:27 | hyPiRion | $timer 0:0:1 foo |
| 14:27 | lazybot | Timer added. |
| 14:27 | lazybot | foo |
| 14:27 | TimMc | muahaha |
| 14:27 | callen | "Debugging is twice as hard as writing the code in the first place. Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it." --Brian Kernighan <--- this applies to Enlive. |
| 14:27 | technomancy | not the least of which being lack of support for client-side SSL certs |
| 14:28 | callen | dnolen: you are the guy behind core.logic/match, nobody expects you to find things like that difficult. |
| 14:28 | TimMc | amalloy: If he had removed timers altogher, I'd stage a civil disobedience action by tossing clojurebot a lazybot-flooding command. |
| 14:28 | hyPiRion | echo Gotta love echo |
| 14:28 | borkdude | I like enlive, only more examples would be welcome. |
| 14:28 | callen | dnolen: nevertheless, I have things I want to make. I'd like to make them in Clojure rather than Python. Sadly the state of templating on Clojure makes a compelling argument for not using Clojure. I'm not the only one who feels this way. |
| 14:28 | hyPiRion | Oh, he removed that one. Smart guy. |
| 14:28 | dnolen | callen: a lot of people seemed to enjoy my old tutorial - http://github.com/swannodette/enlive-tutorial |
| 14:29 | dnolen | callen: I think the primary issue is the lack of more good documentation and example usages |
| 14:29 | callen | dnolen: I am of course familiar with it, as I followed along with it when I originally tried to learn Enlive. |
| 14:29 | callen | dnolen: no, I'm sorry but it's really not. It's a fundamental property of the design. |
| 14:29 | TimMc | dnolen: It didn't help me, but I haven't gotten my own understanding tight enough to write my own tutorial. :-P |
| 14:29 | Ember- | I know this isn't exactly about templating in clojure, but we are currently super happy in using clojure+noir+angular.js combo |
| 14:29 | lazybot | Gotta love echo |
| 14:29 | callen | dnolen: performing whole comprehensions/transformations of the HTML is unnecessary and complecting HTML markup with data injection is insane. |
| 14:29 | TimMc | (inc lazybot) |
| 14:29 | lazybot | ⇒ 11 |
| 14:29 | TimMc | Ember-: Shouldn't you be using ember.js? ;-) |
| 14:30 | dnolen | TimMc: callen: heh fair enough, I tried my best to explain. |
| 14:30 | Ember- | development is super speedy, it's ridiculous how much you can achieve with so few lines of code and it's SPA all the way |
| 14:30 | callen | Ember-: I'm considering side-stepping the insanity of templating by making it a 100% single-page-app |
| 14:30 | technomancy | hiccup forces you to be disciplined about not mixing logic and presentation, but is that really too much to ask? |
| 14:30 | hyPiRion | Wow, was lazybot in the kitchen when I echoed or something? |
| 14:30 | Ember- | TimMc: hehe, true that. But it's inferior imho :) |
| 14:30 | Ember- | callen: go for it |
| 14:30 | Ember- | I've done 100% SPA stuff for 2-3 years now |
| 14:30 | technomancy | all that practice clojure devs have separating side-effects from functional values helps |
| 14:30 | Ember- | ain't going back without a good reason |
| 14:30 | TimMc | I hate single-page apps. |
| 14:30 | callen | Ember-: I just resent being forced to do so. I don't believe in 100% SPA or 100% server-side. |
| 14:31 | callen | Ember-: I also don't like that in 100% SPAs how much work I have to do to make it behave like a normal webapp |
| 14:31 | TimMc | Maybe with a proper history mechanism... |
| 14:31 | callen | so that it doesn't break user expectations |
| 14:31 | joevandyk | has anyone done any work with postgresql returning json to clojure? seems like it might be a natural fit. |
| 14:31 | callen | TimMc: that exists bro |
| 14:31 | dnolen | callen: perhaps, but different projects have different needs. Enlive does make getting pure CSS and HTML from designers feasible. You have Hiccup at the other end of the spectrum of designs. |
| 14:31 | Ember- | callen: like a "normal" webapp? |
| 14:31 | Ember- | huh? |
| 14:31 | TimMc | Ember-: <a href...> |
| 14:31 | TimMc | history |
| 14:31 | technomancy | joevandyk: I think that would depend on the underlying jdbc driver |
| 14:31 | tbaldridge | (inc dnolen) I don't linke enlive much but that feature is hard to beat |
| 14:31 | Ember- | TimMc: those are done by the spa libraries |
| 14:31 | Ember- | for you |
| 14:32 | technomancy | joevandyk: when I looked into hstore (a similar feature to json) the JDBC support was really half-baked |
| 14:32 | technomancy | haven't tried json yet because IIRC heroku postgres doesn't have it yet |
| 14:32 | callen | dnolen: I understand fully why people like Enlive, but it's not appropriate for working on webapps where you have a frontend guy. |
| 14:32 | borkdude | what the heck is a SPA webapp? a single page application web application? |
| 14:32 | Ember- | I built one myself actually, unfortunately proprietary |
| 14:32 | Ember- | borkdude: hehe, nitpicker |
| 14:32 | callen | borkdude: JS-driven navigation, history, templating, state transition web app. |
| 14:32 | TimMc | SWPA |
| 14:33 | TimMc | single world wide web user-agent page view application |
| 14:33 | Ember- | borkdude: but if you did not actually know SPA then think it as fat client on browser |
| 14:33 | dnolen | callen: sure, I agree it's not applicable in many cases. |
| 14:33 | borkdude | Ember- I have tried GWT for a while, so I think I know what it means … (yikes) |
| 14:34 | Ember- | no, GWT is not SPA |
| 14:34 | callen | dnolen: for someone who's mostly trying to build web apps, that's most cases. |
| 14:34 | squidz | and some of you have made SPAs in clojure? |
| 14:34 | callen | borkdude: ...no. |
| 14:34 | Ember- | and it's bad. Cool hack, but bad |
| 14:34 | Ember- | squidz: \o |
| 14:34 | Ember- | but using plain javascript, not clojurescript |
| 14:34 | borkdude | well GWT generates a single page application |
| 14:34 | callen | squidz: SPAs aren't all that special when it comes to backend. You're mostly kicking around JSON. |
| 14:34 | squidz | Ember-: why not clojurescript? |
| 14:34 | callen | squidz: the frontend is usually the more interesting part. |
| 14:34 | joevandyk | technomancy: that's too bad :( |
| 14:34 | Ember- | squidz: learning clojure still, babysteps :) |
| 14:34 | callen | squidz: because you lose convenient access to a lot of really nice libraries. |
| 14:34 | Ember- | and that |
| 14:34 | callen | squidz: using JS libraries from CLJS can be really irritating. |
| 14:35 | callen | that's why JayQ exists. |
| 14:35 | technomancy | joevandyk: that was over 6 months ago though; maybe it's gotten better |
| 14:35 | dnolen | callen: I've worked on projects where there is no front end person, just designs in HTML/CSS. So it doesn't work in your experience. But perhaps it works in other people's experience. In anycase, not worthy of extended discussion. |
| 14:35 | callen | dnolen: I'm just so tired and frustrated with the state of templating being so utterly broken that it shifts the pragmatic decision back over to using Python for my projects. |
| 14:36 | TimMc | callen: I still want a pony that can generate markup either on the client or server, depending on whether JS is enabled on the client. |
| 14:36 | callen | I hate that I can't reasonably choose to use a great language because batteries aren't included for a critical component of making a web app. |
| 14:36 | Ember- | use angular? :) Not that I weren't a fan of separation of concerns in layout and templating logic |
| 14:36 | callen | TimMc: I could think of a few ways to go about that. The JS enabled thing is rough though. noscript on the client means you'd be doing an image load callback or something which is effin' weird. |
| 14:37 | Ember- | wicket has a great idea, not a fan of wicket and it's hugely verbose way of doing things (plus it's trying to do too much, contain state in backend) |
| 14:37 | Ember- | but the component mapping to html is great in it |
| 14:37 | callen | I don't want anything that involved, complicated, or holistic. |
| 14:37 | Ember- | similar and elegant solution to clojure would be awesomesauce |
| 14:37 | squidz | wicket is all ive use so far but i actually like it |
| 14:37 | technomancy | Raynes: how's that enlive-like lib coming anyway? |
| 14:37 | callen | I want a template library made by somebody who seems to have experience with writing web apps for a living. |
| 14:37 | technomancy | callen: ^ |
| 14:38 | squidz | just seems very Object-Oriented |
| 14:38 | solussd | enlive works wonderfully for me working with our front end guy. I "fill in the blanks" with enlive. |
| 14:38 | solussd | i cant imagine anything better than "pure html" templates… I hate most templating languages |
| 14:38 | Ember- | callen: I hear your pain and suffering. Unfortunately I don't see the need anymore with advanced client side templating libraries |
| 14:38 | Ember- | or well, if you need to support browsers without javascript |
| 14:38 | TimMc | callen: image load callback? I just mean render the whole page on the server side on first load, then incrementally update the page via either client or server rendering when I capture clicks. |
| 14:39 | borkdude | Ember- what does this component do? |
| 14:39 | craigbro | switches from enlive to jsoup |
| 14:39 | Ember- | borkdude: could you elaborate? |
| 14:39 | craigbro | enlive is sloooooooow for large tempaltes |
| 14:39 | callen | TimMc: you'd want this to be holistic I take it? |
| 14:39 | Ember- | what component |
| 14:39 | callen | http://jinja.pocoo.org/ <--- first example. That's how template inheritance, overrides, loops, and map/dictionary data access work in Jinja. Enlive and Hiccup do not compare favourably. |
| 14:39 | borkdude | Ember- from wicket |
| 14:39 | ivan | is there a better way to define step functions than condp <=? |
| 14:39 | Ember- | borkdude: ah |
| 14:39 | craigbro | Jsoup can do many of the same things, and I can avoid the cost of converting eveything from java objects to vectors |
| 14:40 | Ember- | component is a core concept in wicket, it can do pretty much anything |
| 14:40 | Ember- | it can populate text for example into <p> or any html tag |
| 14:40 | dnolen | callen: to be honest, it's a known issue. I had a chat w/ Jen Myers (who works at Relevance) at the Clojure Conj. Clojure's web story as far as gracefully integrating w/ modern front end dev practice is still evolving. |
| 14:40 | callen | It's all simple, it works how you expect it to, no crazy CSS-reach-in, no need to touch backend. |
| 14:40 | Ember- | or it can contain it's own html snippets |
| 14:40 | squidz | for me wicket is kind of like developing a swing/swt app |
| 14:40 | Ember- | and stuff like that |
| 14:40 | Ember- | squidz: it is, but it has a huge problem |
| 14:40 | Ember- | 1) java and it's verbosity with anonymous classes |
| 14:40 | ibdknox | callen: https://github.com/weavejester/comb |
| 14:40 | dnolen | callen: fingers crossed she gives a talk about this at Clojure/West, it's an important topic |
| 14:41 | callen | dnolen: I've talked to the author of another template library about it, he's thinking about a potential equivalent to something like Jinja. |
| 14:41 | Ember- | 2) it's trying to do too much: it contains the UI state at server side in HTTP session |
| 14:41 | callen | ibdknox: looks a lot like Fleet. Thanks for sharing this! |
| 14:41 | Ember- | and due to this it has a LOT of magic under the hood which will bite you in the leg sooner or later |
| 14:41 | ibdknox | callen: it is *much* better than fleet |
| 14:41 | Ember- | pretty much the same as Hibernate |
| 14:41 | squidz | Ember-: Ember- yes I dont like #2 |
| 14:41 | borkdude | Ember- is that like webforms in ASP.NET? |
| 14:41 | callen | ibdknox: oh, just wondering, what does it do better? |
| 14:41 | ibdknox | callen: the impl is like 60 lines |
| 14:42 | ibdknox | callen: it's very fast |
| 14:42 | Ember- | borkdude: not familiar with webforms |
| 14:42 | Ember- | borkdude: http://wicket.apache.org/learn/examples/ |
| 14:42 | Ember- | you can view the source code from those |
| 14:42 | callen | ibdknox: the real question is, what would it take to build this up to something appropriate for writing templates for a web app. |
| 14:42 | callen | ibdknox: looks really promising. |
| 14:42 | Ember- | it's overly verbose and I don't like it |
| 14:42 | callen | seems like you'd still need to build up the machinery for things like template inheritance, injection, overrides, etc. |
| 14:42 | Ember- | I mean, we have this search functionality in our app with clojure+angular |
| 14:43 | squidz | Ember-: wicket makes doing ajax pretty simple though. Ive never done ajaxy stuff outside of wicket, but I needed zero experience to get ajax enabled components up and running |
| 14:43 | ibdknox | callen: you have the full power of clojure, you'd just need a couple convenience functions for those things :) |
| 14:43 | Ember- | we have a fully functional search from 3rd party API to browser with less than 20 lines of clojure, 15 lines of javascript and 15 lines of HTML |
| 14:43 | TimMc | ivan: "We're sorry, #clojure is currently closed for our monthly templating argument. Please leave a message and we'll get back to you when we return. *beep*" |
| 14:43 | craigbro | oi |
| 14:43 | ivan | TimMc: no problem ;) |
| 14:44 | callen | ibdknox: yeah I think I might give this a whirl. Thank you very much. |
| 14:44 | Ember- | 3rd party server takes in a HTTP request, returns XML |
| 14:44 | technomancy | (inc TimMc) |
| 14:44 | lazybot | ⇒ 23 |
| 14:44 | technomancy | |
| 14:44 | callen | (inc TimMc) |
| 14:44 | lazybot | ⇒ 24 |
| 14:44 | ibdknox | (dec |
| 14:44 | ibdknox | (dec TimMc) ; #Clojure is not a place for humor :p |
| 14:44 | lazybot | ⇒ 23 |
| 14:44 | TimMc | haha |
| 14:45 | TimMc | I mean |
| 14:45 | ibdknox | also your karma is getting too high. Gotta take you down a peg ;) |
| 14:45 | TimMc | "Yes sir." |
| 14:45 | TimMc | I would never laugh in #clojure. |
| 14:45 | craigbro | guffaw? |
| 14:45 | mdeboard | This is very serious business. |
| 14:45 | amalloy | we need a movie-preview announcer's voice to narrate the upcoming KARMA WARS |
| 14:46 | pjstadig | "In a world were karam is the most valuable commodity..." |
| 14:46 | ibdknox | haha |
| 14:46 | squidz | Ember-: so you said you were using fleet mostly right? |
| 14:46 | hyPiRion | Say I have the following form: (let [a (foo ?a?)] a). What is the idiomatic way of getting ?a? to point to a here? |
| 14:46 | TimMc | ivan: Is your step function returning existing values, or is this more of a control flow thing? |
| 14:47 | Ember- | squidz: fleet? not familiar |
| 14:47 | squidz | Ember-: sorry, what do you normally use instead of enlive? |
| 14:47 | squidz | Ember-: ah right, you come from javaland? |
| 14:47 | Ember- | we use enlive for XML parsing |
| 14:47 | Ember- | yes, been working in a real project with clojure a bit over two weeks now |
| 14:47 | ivan | TimMc: existing values |
| 14:47 | Ember- | before that, just random hacking |
| 14:48 | Ember- | nothing even remotely serious |
| 14:48 | amalloy | hyPiRion: wat? |
| 14:48 | ivan | TimMc: it just seemed like a common thing that should exist in some library rather than as code generated by condp |
| 14:48 | borkdude | just println to the HTTPServletResponse's outstream guy's, who needs static html files anyway. |
| 14:49 | Ember- | squidz: ok, fleet looks like a templating library. No, we use angular.js |
| 14:49 | Ember- | and it's templating |
| 14:49 | Ember- | simple, efficient. But does not separate layout from templating |
| 14:49 | TimMc | ibdknox, callen: comb doesn't have any facility for output escaping. o\__/o |
| 14:49 | Ember- | but it does it's templating with style (although I'm not very happy with all the curly braces) |
| 14:50 | ibdknox | TimMc: I'm pretty sure with a 60 line codebase it could be added trivially :p |
| 14:50 | bbloom | ivan: how about (some pred vector) where vector is a vector of [threshold value] pair or something like that, and pred checks the threshold |
| 14:50 | bbloom | ivan: some returns the first item to match the predicate |
| 14:50 | TimMc | I can't believe people are still writing templating libs that are not XSS-safe by default. |
| 14:50 | Ember- | I really should try LightTable in our project |
| 14:50 | bbloom | or you can do (first (filter ...)) to be clearer |
| 14:50 | Ember- | have been mostly using the instarepl in it |
| 14:50 | Ember- | ibdknox: which is awesome :P |
| 14:50 | ivan | bbloom: thanks. I'll give that a try. |
| 14:50 | callen | TimMc: fuck it, XSS doesn't even real. |
| 14:51 | TimMc | ... |
| 14:51 | egghead | xss safe ? like what -- xss is a lot more than just escaping <> |
| 14:51 | callen | TimMc: well gee willikers we wouldn't be considering using such evil stygian tools like eval'ing unescaped strings all over the place if we had decent template libraries... |
| 14:52 | TimMc | Oh... kay... |
| 14:53 | hyPiRion | amalloy: nevermind, I think I'll have to work with Y-combinators to make this work |
| 14:53 | llasram | callen: OOC, since you have strong opinions about how templating libraries should work, are you developing one? |
| 14:53 | TimMc | egghead: I don't mean such as stopping people from doing eval(location.hash.substring(1)) -- just basic context-aware escaping. |
| 14:53 | TimMc | Or even just plain ol' escaping by default. |
| 14:53 | callen | llasram: I'm awful at parsers. I actually said this to the author of Stencil, who's already planning to make the sort of template library I have in mind. |
| 14:53 | Ember- | callen: write your templating with clojure :) |
| 14:53 | Ember- | lisp is trivial to parse |
| 14:53 | callen | llasram: but until he does, I'd like to convey my suffering to the rest of you. |
| 14:54 | callen | Ember-: that's called Hiccup. |
| 14:54 | hyPiRion | amalloy: I realised that I was asking how I could pass the result of a value as a parameter to the function call which realized the value |
| 14:54 | Ember- | callen: yup |
| 14:54 | Ember- | but do it the way you like it :) |
| 14:54 | callen | That...is not what I have in mind. |
| 14:54 | hyPiRion | Since Clojure can't send unbound variables, that's rather hard. |
| 14:54 | callen | Ember-: http://jinja.pocoo.org/ I want this. |
| 14:54 | jkkramer | callahad: https://github.com/sjl/dram - release date TBD |
| 14:54 | Ember- | callen: no offense, but that looks horrible to me :) |
| 14:55 | Ember- | just what I *don't* want to use |
| 14:55 | jkkramer | oops, callen ^^ |
| 14:55 | ro_st | what's wrong with Hiccup?! |
| 14:55 | callen | Ember-: well, Jinja and Django templates have suited many projects for me for the last 4+ years. |
| 14:55 | TimMc | hyPiRion: Go on... |
| 14:55 | callen | jkkramer: I know about Dram. I'm just kinda hoping Losh picks it back up. |
| 14:55 | Ember- | callen: I understand and not saying that it wouldn't work |
| 14:55 | callen | jkkramer: if he doesn't, I'll have to wait on Santiago. |
| 14:55 | hyPiRion | I don't know if there's more to discuss, heh |
| 14:55 | TimMc | hyPiRion: I smell a code horror, and I want to know more! |
| 14:55 | bbloom | the reason there are 39385935 templating languages is because there are lots of different use cases and many people haven't explicitly stated their use cases and design goals |
| 14:56 | Ember- | but you previously said you'd like a templating library for clojure which has been developed by a guy doing web apps for living |
| 14:56 | Ember- | well, I do web apps for living and I wouldn't desing a templating system like that |
| 14:56 | Ember- | it's a matter of taste which is good |
| 14:56 | callen | jkkramer: the last commit was, "Basic template file loading!" |
| 14:56 | bbloom | if you want a template language for designers, than maybe django/jinja is a reasonable choice |
| 14:56 | callen | jkkramer: very encouraging. |
| 14:56 | bbloom | i've never worked with a designer smart enough to figure out django templates, but dumb enough not to be able to learn HAML |
| 14:56 | bbloom | i figure they could learn hiccup to |
| 14:56 | bbloom | o |
| 14:57 | hyPiRion | TimMc: Okay, it's basically like this: Create a recursive merge function by calling e.g. merge-with |
| 14:57 | callen | bbloom: there's a *lot* to Jinja that makes it my template lang of choice. |
| 14:57 | callen | bbloom: not just that a designer can use it. |
| 14:57 | bbloom | callen: like what? |
| 14:58 | hyPiRion | TimMc: So (fn [& r] (apply merge-with merge r)) would merge two levels only. |
| 14:59 | callen | bbloom: registering template filters and custom tags for extending the functionality to match your use-case without repetitiously processing the data on the backend logic, template extension, overrides, and injection that actually work really well to eliminate duplicate logic/markup, syntax that is both simple and easy and doesn't break down once you hit a moderately complicated use-case, good separation of frontend/backend in terms of markup/layout an |
| 14:59 | borkdude | "Clojure html templating libraries: the grand tour", free blog post idea =) |
| 14:59 | hyPiRion | TimMc: That's solved through (fn rec [& r] (apply merge-with rec r)) usually, but I can't do that since I'm calling a function which expands that fn |
| 14:59 | callen | borkdude: it'd just be me walking around with a baton, pointing at things and going, "so this sucks...this sucks too. Oh yeah, that definitely sucks." |
| 14:59 | hyPiRion | /s/fn/fn-form/ |
| 15:00 | ro_st | borkdude, callen: it'd be interesting if you included _why_ it sucks |
| 15:00 | borkdude | ro_st probably because it's not ninja, like clojure is not common lisp |
| 15:00 | callen | ro_st: I could talk for weeks about why 99% of templating libraries are awful. |
| 15:01 | ro_st | i don't doubt it. |
| 15:01 | callen | for the record, I hate CL-WHO too. |
| 15:01 | bbloom | callen: every single one of those use cases can be more directly accomplished via functions. jinja reifies particular signatures of functions into particular convinenent syntaxes. but if you're a programmer, you should be just fine writing normal functions.... |
| 15:01 | callen | bbloom: you're missing...the damn point. |
| 15:01 | callen | bbloom: I'm not always writing the templates |
| 15:01 | callen | bbloom: most projects are not one dude. |
| 15:01 | callen | bbloom: I need to make the template filters and tags *ahead of time*, in the backend code, register them with the template handler, THEN let the designer use what I created |
| 15:01 | bbloom | callen: which is exactly what i'm saying: if you have non programmers on your teamwriting templates, then you've got a justification for using jinja |
| 15:02 | bbloom | and you told me that wasn't the reason :-P |
| 15:02 | callen | because if I don't do that, it'll end up in JS somewhere. |
| 15:02 | callen | bbloom: I said that wasn't the only reason. |
| 15:02 | callen | bbloom: there's a lot about Jinja that makes my life simpler as a lone programmer, but it's positively critical when I have a frontend guy. |
| 15:02 | TimMc | hyPiRion: So how does this end up with you trying to pass around unbound vars? |
| 15:03 | callen | replicating even the simple example here: http://jinja.pocoo.org/ would take way too much work in Hiccup and Enlive. |
| 15:03 | callen | you could get sorta close in Stencil, but it'd be laborious and involve {{{ }}} |
| 15:03 | clojurebot | Cool story bro. |
| 15:03 | hyPiRion | TimMc: I have a function foo which takes a function and returns a function, I want to pass the returned function as the argument function. |
| 15:04 | hyPiRion | Hence the fun. |
| 15:04 | ro_st | callen: why do you want a mix of html and something else? |
| 15:05 | callen | ro_st: https://github.com/sjl/dram#why |
| 15:05 | callen | ro_st: just read the "why". |
| 15:05 | ro_st | that, imho, is why 99% of TLs suck. they get soupy even with trivial examples |
| 15:06 | Ember- | callen: I know it is client side, but with angular.js those examples are less verbose, more like normal HTML and very designer friendly |
| 15:06 | devinus | will 1.5 have a PersistentQueue literal? |
| 15:06 | Ember- | if you really need server side templating then it's of course off limits |
| 15:06 | hyPiRion | I mean, (fn bounce [args] (apply (foo bounce) args)) works, but it's hairy and computationally heavy. |
| 15:06 | hyPiRion | Or not hairy, but I don't know if it's idiomatic. |
| 15:06 | dnolen | hmm what's the dynamic var in Clojure that you can check for AOT compiles? |
| 15:07 | callen | hyPiRion: apply is pretty bad in Clojure. |
| 15:07 | tomoj | *compile-files* |
| 15:07 | callen | Ember-: I'd like to avoid resorting to an SPA if possible. |
| 15:07 | tomoj | I think you mean? |
| 15:07 | hyPiRion | callen: Slow you mean? |
| 15:07 | dnolen | tomoj: yes, that's it thanks. |
| 15:07 | Ember- | callen: I can appreciate that if you have a good reason for that |
| 15:07 | callen | hyPiRion: why not. |
| 15:07 | Ember- | but in my experience SPA is way better than traditional |
| 15:08 | callen | Ember-: because I've done 100% SPAs before and it turned into a mess for usability and accessibility. |
| 15:08 | Ember- | even if you have to tolerate javascript and it's quirks |
| 15:08 | callen | standard web apps are better unless you have something very specific going on. |
| 15:08 | callen | I don't mind JS. |
| 15:08 | egghead | can anyone who is familiar with carmine (the redis client) explain this to me? https://www.refheap.com/paste/7703 is it just that with-redis (wcar) only makes one trip to redis? |
| 15:08 | Ember- | callen: ok, well. No offense but someone in your team did not know how to build SPA then :) |
| 15:08 | hyPiRion | callen: I think I lost you there |
| 15:08 | callen | Ember-: maybe so. |
| 15:08 | Ember- | the largest SPA project I've done had over 40kloc of javascript in it |
| 15:08 | callen | hyPiRion: just benchmark it, you'll see what I mean very quickly. |
| 15:09 | Ember- | and hundreds of thousands of lines of java code in the backend |
| 15:09 | TimMc | callen: How about you *explain* what you mean. |
| 15:09 | hyPiRion | callen: Oh, I know it's slow. That's not the issue here though |
| 15:09 | Ember- | it was quite manageable, had great performance and usability |
| 15:09 | hyPiRion | I just wonder what's idiomatic to do. |
| 15:09 | callen | TimMc: as soon as somebody makes a template library that doesn't make me want to take the protesting buddhist monk way out of life with a bucket of gasoline. |
| 15:09 | crease | I'm having trouble with cl-format… shouldn't (cl-format nil "~2@* ~D" 1 2 3) give you " 3"? I'm getting " 1" |
| 15:10 | hyPiRion | ,(require '[clojure.pprint :refer [cl-format]) |
| 15:10 | clojurebot | #<ExecutionException java.util.concurrent.ExecutionException: java.lang.RuntimeException: Unmatched delimiter: )> |
| 15:10 | TimMc | callen: Yeah, I'm not in that discussion anymore, sorry. |
| 15:10 | hyPiRion | ,(require '[clojure.pprint :refer [cl-format]]) |
| 15:10 | clojurebot | nil |
| 15:10 | hyPiRion | ,(cl-format nil "~2* ~D" 1 2 3) |
| 15:10 | clojurebot | " 3" |
| 15:11 | Ember- | callen: well, fortunately for you someone is making that Jinja version for clojure |
| 15:11 | callen | I didn't know people actually wanted to use cl-format. |
| 15:11 | callen | Ember-: if you mean dram, he hasn't worked on it in awhile. |
| 15:11 | Ember- | fork and pick up it and finish the work? |
| 15:11 | callen | Ember-: Clango is in a similar state. |
| 15:11 | callen | Ember-: I'd end up replicating the work Santiago wants to do. I'd rather not trip over him, he has more experience writing template libraries. |
| 15:12 | Ember- | lure the original Jinja developers to the Clojure side? :) |
| 15:12 | callen | actually, Mitsuhiko is a good target for that |
| 15:12 | callen | he's been pissed about Python 3 for awhile. |
| 15:12 | Ember- | go for it |
| 15:13 | Ember- | I really mean it |
| 15:13 | hyPiRion | crease: huh, I think I need to read the docs |
| 15:13 | callen | Ember-: I already asked him in #flask. |
| 15:13 | hyPiRion | ,(cl-format nil "~D ~0@* ~D" 1 2 3) |
| 15:13 | clojurebot | "1 1" |
| 15:13 | hyPiRion | ,(cl-format nil "~D ~1@* ~D" 1 2 3) |
| 15:13 | clojurebot | "1 2" |
| 15:13 | hyPiRion | ,(cl-format nil "~D ~2@* ~D" 1 2 3) |
| 15:13 | clojurebot | "1 1" |
| 15:13 | hyPiRion | Either that, or this is not working properly. |
| 15:15 | hiredman | win 15 |
| 15:15 | crease | hyPiRion: yeah, maybe it's a bug… the doc says ~2@* is an absolute goto to the third argument. Maybe I'm missing something tho. It's a kind of scary doc. |
| 15:16 | devinus | technomancy: do you use elein at all? |
| 15:17 | hyPiRion | crease: yup, it's a bug. SBCL, clisp and clozure gives "1 3" for the last one there |
| 15:17 | hyPiRion | I'll check JIRA for bugs |
| 15:18 | callen | devinus: pretty sure he lives inside a perma-running lein terminal for that. |
| 15:18 | callen | devinus: so, "no" |
| 15:18 | devinus | callen: that's what i figured |
| 15:18 | callen | does explain why the lein command mode thingy exists though. He made it for himself, haha. |
| 15:19 | devinus | i'm trying to figure out the latest emacs/clojure stuff, trying to figure out the difference between clojure-mode and clojure-test-mode |
| 15:19 | devinus | then there's clojure-project-mode |
| 15:20 | crease | hyPiRion: thanks! and appreciative clicking noises for firing up those languages. I don't see it in JIRA... |
| 15:21 | zerokarmaleft | what does clojure-project-mode have that clojure-mode doesn't cover? |
| 15:22 | cark | hum this FXML thing in javafx feels a bit half-assed |
| 15:23 | devinus | zerokarmaleft: no idea, trying to figure that out |
| 15:24 | devinus | then there's cljdoc |
| 15:25 | devinus | i need technomancy's technomastery me thinks |
| 15:25 | hyPiRion | crease: I tested it with 1.5.0-beta2, and it's still there. Want me to add a ticket for it? |
| 15:26 | hyPiRion | It's either me or you. |
| 15:26 | callen | devinus: it's 12:18 pm in the bay area, he's probably at lunch. |
| 15:27 | devinus | callen: good call |
| 15:28 | callen | devinus: not really. I noticed I was hungry. I'm in south bay. |
| 15:29 | hyPiRion | crease: I'll add a ticket if you don't mind. |
| 15:29 | devinus | callen: i'm guessing the bay area is the only place to get jobs that let you work with Clojure these days? :P |
| 15:30 | craigbro | devinus: we're hiring, remote workers too |
| 15:30 | craigbro | oh, sorry, didn't detect your sarcasm |
| 15:30 | clj_newb_2345 | what is the most robust (i.e. not adhoc) way of getting the maybe monad inside of clojure? |
| 15:30 | clj_newb_2345 | (I'd like to use it together with map) |
| 15:31 | Ember- | devinus: I live in Finland and I am working on a Clojure project |
| 15:31 | Ember- | pretty far away from the bay area :) |
| 15:31 | devinus | craigbro: half-sarcasm. i've looked around the austin area for people doing Clojure stuff |
| 15:31 | devinus | haven't seen much |
| 15:31 | matthavener | devinus: i think mass relevance does some clojure |
| 15:31 | matthavener | or scala |
| 15:32 | callen | devinus: basically, yes, but I don't get to work in Clojure. I can't convince my boss the community has good templating libraries. |
| 15:32 | Ember- | and push your own organization to clojure? |
| 15:32 | Ember- | that's the way we started to use it |
| 15:32 | Ember- | internal evaluation after developers brought it up |
| 15:33 | Ember- | still baby steps, only 2 projects using clojure currently out of maybe 70 but the way we are progressing and just Getting Things Done(tm) I have a good feeling that more clojure projects will be coming... |
| 15:33 | callen | I'm considering evaluating Scala/Play for a project since the template story there is pretty good. |
| 15:33 | ivan | https://github.com/clojure/algo.monads/blob/master/src/main/clojure/clojure/algo/monads.clj#L354 <- would an explicit Just/Nothing make little sense in Clojure? |
| 15:34 | devinus | callen: wait, is it really templating holding you back? i thought you were being sarcastic |
| 15:34 | clj_newb_2345 | ivan: defmonad looks like a macor worth undersstanding |
| 15:35 | callen | devinus: it'd sap too much productivity to justify using Clojure. It tips the scales in favor of using Python or Scala. |
| 15:35 | callen | devinus: it's that bad. |
| 15:35 | craigbro | callen: really? Mazel Tov |
| 15:35 | Raynes | callen: I think that if it is really that if you need django, chances are django is your best option. |
| 15:35 | craigbro | as if templating was a ahrd problem worthy of more than, oh, i don't know, 50 lines of code |
| 15:36 | callen | Raynes: I have a forthcoming project that will require a more...industrial language than python. |
| 15:36 | callen | Raynes: I'd like to have a few projects down before that happens. |
| 15:36 | craigbro | Raynes: agreed actually. |
| 15:36 | Raynes | I haven't had your problems with templating. |
| 15:36 | callen | Raynes: you use Stencil. |
| 15:36 | Raynes | We obviously have different needs. |
| 15:36 | callen | Raynes: it's your git repo that I use to guide working with Stencil when I *do* make things in Clojure |
| 15:36 | Raynes | But the constant shitting on of all the templating libs is getting a bit old, no offense. |
| 15:37 | callen | Raynes: but just because I was able to get it done, does it mean that it's a sensible choice wrt productivity. |
| 15:37 | Raynes | The biggest problem I see is that nobody has finished that one you linked too a few days ago. |
| 15:37 | devinus | callen: what are you looking for exactly? DTL in Clojure? |
| 15:37 | callen | Raynes: Santiago (Stencil author) sees the same problem I do. |
| 15:38 | callen | Raynes: he's just less vocal about it. |
| 15:38 | callen | don't act as if I'm some crazy man from the mountains who alone sees this problem. |
| 15:38 | Ember- | callen: I hear you! |
| 15:39 | Ember- | throw clojure at HTML/CSS guy's face and he'll punch you |
| 15:39 | Raynes | I'm not disagreeing with your desire for such a thing, just that we don't need to be so angry at the existing templating libs. Lots of people like them and use them, and lots of people put lots of work into them. They work really well for most people. I wrote one myself. You just want something different which is totally understandable. |
| 15:39 | Raynes | Ember-: Hiccup isn't the only templating lib he is talking about. |
| 15:39 | Ember- | yeah I know |
| 15:40 | callen | Raynes: if you know a better way to spur the development of something legitimately appropriate for building a web app with other people, I'd love to hear it. |
| 15:40 | Raynes | I think you're missing my point completely. |
| 15:40 | callen | I didn't know you had one, save to complain about my complaining. |
| 15:40 | Raynes | Okay. |
| 15:40 | Raynes | I should have known better. |
| 15:41 | callen | I asked for an actionable improvement to my approach, you demurred. That leaves me with no way to understand what you want to achieve. |
| 15:41 | brehaut | callen: shitting on developer set A does not cause people in developer set B to think 'oh! i'd like develop an alternative' it causes them to think 'glad im not getting shat on right now' |
| 15:41 | ivan | I'm looking at enlive for the first time and completely befuddled by why I would load some existing HTML and manipulate it in another file with some Clojure |
| 15:41 | callen | LOL ^^ you know what? I don't even need to say anything. I'll just let the truth speak for itself. |
| 15:41 | ivan | I guess I'll have to play with hiccup and see where the brick wall is |
| 15:42 | HolyJak | Raynes: Your point seemed to by quite clear to me, though :-) Don't fall into dispair. |
| 15:42 | Raynes | brehaut: Your IRC client has an ignore feature designed specifically for trolls. |
| 15:42 | Raynes | Exercise it. |
| 15:42 | brehaut | Raynes: it does, but it comes unstuck |
| 15:42 | devinus | i think there's plenty of room for a logic-ful (as opposed to a logic-less like Stencil) templating lib for Clojure |
| 15:42 | devinus | is there not? |
| 15:42 | Raynes | Sure. |
| 15:42 | callen | devinus: there's a great one called http://jinja.pocoo.org/ |
| 15:42 | callen | devinus: just need a Clojure version. |
| 15:43 | Raynes | devinus: Something like jinja would be great for Clojure. |
| 15:43 | brehaut | devinus: why not just use a java library in that case? there are heaps of options |
| 15:43 | devinus | callen: right |
| 15:43 | devinus | yeah, or not even like jinga |
| 15:43 | hyPiRion | woa, you guys are still going on with the template discussion? It's been 90 minutes. |
| 15:43 | dnolen | haha |
| 15:43 | devinus | the language it uses could be clojure-inspired |
| 15:43 | dnolen | hyPiRion: my thoughts exactly |
| 15:43 | Raynes | devinus: But that doesn't mean we should shit all over the existing libraries that other people have made. But that appears to be callen's motive. |
| 15:43 | devinus | instead of jinjaish |
| 15:43 | callen | I don't *really* want to talk about Enlive |
| 15:43 | devinus | Raynes: i must have missed a lot of previous context :P |
| 15:43 | callen | I want something better to crop up. |
| 15:44 | Ember- | callen: please use term "different" instead of "better" to keep this civil |
| 15:44 | callen | they ignored me anyway, but noted. |
| 15:44 | Ember- | you're stabbing someone's baby the way you are going with your argument |
| 15:45 | Raynes | ivan: I wrote a lib similar to Enlive that does that too (laser). It's simply a way of transforming HTML using selectors instead of markers in code such as you would do with mustache. Also, if you use hiccup your HTML is written in a Clojure DSL that a designer probably can't read or want to mess with. |
| 15:45 | Ember- | the father of that baby won't be happy |
| 15:45 | devinus | this honestly shouldn't be too hard. i've worked on erlydtl for erlang and written my own mustache libs before. a clojinja would be relatively easy i think |
| 15:46 | m0smith | I chose stencil for just that reason: a designer needs to be able to work with it as well |
| 15:46 | callen | the revolution begins! /me cackles |
| 15:46 | brehaut | m0smith: my expiernece is designers are entirely capable of working with plain HTML too :P |
| 15:47 | hyPiRion | devinus: Well, it's great news that it shouldn't be too hard - an even better reason for you to create your own solution :) |
| 15:47 | Raynes | ivan: The point is to keep your code separate from your logic. Does that make sense? |
| 15:47 | devinus | hyPiRion: yes :P the only problem is i'm on page like 160 of JoC |
| 15:47 | m0smith | brehaut: They ceratinly are but clojure data structures are a bit of a stretch |
| 15:47 | ivan | Raynes: yeah, but I have the need to see some rendering logic with the HTML structure |
| 15:47 | joevandyk | anyone find rendering html templates to be a bottleneck ever? i found that happened a lot with rails |
| 15:47 | hyPiRion | devinus: don't stop ;) |
| 15:47 | brehaut | m0smith: enlive does not use clojure data structures for templates. it uses plain HTML. |
| 15:48 | joevandyk | (possibly it was related to slow view helpers and route generation) |
| 15:48 | Raynes | ivan: I'll be rewriting refheap's views with laser soon. Keep an eye out. |
| 15:48 | brehaut | m0smith: that goes for a number of other libs too (tinsel, laser) |
| 15:49 | ivan | Raynes: cool, I'll check it out |
| 15:49 | callen | ivan: it's like Enlive |
| 15:49 | brehaut | "i dont understand how to use X" is not the same as "X is bad". Nor is it a condemnation of anyone not understanding X. |
| 15:50 | callen | there is such a thing as understanding just fine, but being horrified nevertheless. Of course it's a lot easier to think your position is tenable if you assume all who don't share it are ignoramuses. |
| 15:51 | m0smith | brehaut: Yes I see what you mean. I prefer the mustache metaphor as it gives the designer a wider range of options without breaking the clojure coe |
| 15:51 | m0smith | code |
| 15:52 | m0smith | for example [:p#message] can be frgaile if the designer decides to not use the <p> |
| 15:52 | brehaut | m0smith: do take the time to look at a transformational templating system though. its a different formulation of that idea where the designer _only_ worries about html and css etc, and doesnt concern themselves with population at all |
| 15:53 | m0smith | brehaut: do you have a link? The stuff I am seeing is just some tutorials |
| 15:53 | brehaut | m0smith: no more fragile than passing a map of keys through to the designer. you need to have some sort of interface/schema between the two sections of code nomatter what the soliution you use is |
| 15:53 | Raynes | m0smith: I had someone give me that exact same argument a few days ago, and it seems valid enough. |
| 15:54 | Raynes | brehaut: I think the point is that with tags you can change what they are without breaking anything in a lot of cases, whereas laser and friends all require an exact DOM structure in order for them to work reliably. |
| 15:54 | Raynes | Well, not exact. |
| 15:54 | m0smith | brehaut: True. It just seems easier for our designers to leave the key names in tact |
| 15:54 | Raynes | But still. |
| 15:55 | brehaut | m0smith: theres two tutorials. both are somewhat hard slog, but give them a crack. the actual documenation for enlive is somewaht mind boggling when you dont know enlive already. |
| 15:56 | brehaut | Raynes: i understand that. |
| 15:56 | gtrak | meh... there are java template libs, too... clojure ones implement java.util.Map |
| 15:56 | gtrak | clojure maps* |
| 15:56 | brehaut | gtrak: exactly. |
| 15:57 | m0smith | brehaut: It feels a bit like JQuery for clojure |
| 15:57 | m0smith | I like JQuery so that is not a slam (BTW) |
| 15:58 | brehaut | m0smith: there are parallels |
| 16:00 | gtrak | callen: does something like this float your boat? |
| 16:00 | gtrak | https://developers.google.com/closure/templates/docs/helloworld_java |
| 16:03 | brehaut | gtrak: i've also heard that StringTemplate can be pretty good. (and stupidly fast) |
| 16:03 | gtrak | I even found the map line for you: http://code.google.com/p/closure-templates/source/browse/trunk/java/src/com/google/template/soy/tofu/SoyTofu.java?r=21#131 |
| 16:03 | gtrak | brehaut: I hated it when I tried to use it for even a toy program |
| 16:03 | brehaut | gtrak: hah ok |
| 16:03 | gtrak | I can show you an integration though |
| 16:04 | brehaut | sure |
| 16:04 | gtrak | https://github.com/gtrak/garytrakhman.com/blob/91813c7d0b6206e2821aadbf2b47c18135d5a6e1/src/garytrakhman/stview.clj |
| 16:05 | gtrak | there's some extra bits like associating a JS file per view... I couldn't make myself happy with it though |
| 16:05 | gtrak | the variable scoping's a huge pain |
| 16:06 | devinus | i know there's a condition-restart lib for clojure |
| 16:06 | devinus | can anybody remember what it is? |
| 16:07 | technomancy | devinus: error-kit, but I don't think it's recommended |
| 16:08 | devinus | technomancy: there was nother one too |
| 16:08 | devinus | another* |
| 16:08 | crease | hyPiRion: ticket's a good idea, thanks |
| 16:09 | devinus | technomancy: also you're back! |
| 16:10 | gtrak | here's the bit in closure-templates that takes a map, anyway: http://code.google.com/p/closure-templates/source/browse/trunk/java/src/com/google/template/soy/tofu/SoyTofu.java?r=21#131 |
| 16:10 | devinus | technomancy: i have some clojure/emacs questions for you. your talk on leiningen inspired me |
| 16:10 | devinus | technomancy: can you tell me what the clojure-project-mode does that clojure-mode doesn't? |
| 16:13 | zerokarmaleft | devinus: https://github.com/psyllo/emacsenations, i don't think technomancy authored clojure-project-mode |
| 16:13 | technomancy | devinus: never heard of clojure-project-mode |
| 16:13 | devinus | ah, it seems it extends project-mode |
| 16:14 | devinus | there's also cljdoc |
| 16:14 | technomancy | I use ,,find-file-in-project for larger codebases |
| 16:14 | technomancy | oh wait, this isn't #emacs; no fsbot |
| 16:14 | devinus | technomancy: i have find-file-in-project installed after your endorsement |
| 16:14 | technomancy | anyway, I think most of the project stuff around emacs is kind of silly; the only thing I need is scoped file opening |
| 16:14 | zerokarmaleft | from a glance, it looks like it does some project-wide string searching and source-file/matching-test-file navigation |
| 16:15 | technomancy | I highly recommend using M-x rgrep (or rgrep from eshell) for searches |
| 16:15 | technomancy | when you can't use M-. |
| 16:15 | technomancy | clojure-mode has some functionality for jumping between implementation and test, but it's not great |
| 16:15 | technomancy | I wish he would have fixed the existing implementation instead of creating a new one =\ |
| 16:17 | callen | gtrak: not at all. My boat sinks. |
| 16:18 | gtrak | ha, it seems to me similar to django's |
| 16:19 | callen | gtrak: you don't appear to have used Django much. |
| 16:19 | gtrak | nope... http://www.jangod.org/ |
| 16:19 | gtrak | 'inspired by django' |
| 16:20 | gtrak | can you tell I don't work with designers? :-) |
| 16:20 | callen | gtrak: that's not what you linked me |
| 16:20 | callen | gtrak: you linked me a different library. |
| 16:20 | gtrak | ah, yea, that's what I found just now |
| 16:20 | callen | ... |
| 16:21 | callen | that's for java and java classes |
| 16:21 | callen | I need something that works with maps. |
| 16:21 | gtrak | I'm not sure why closure-templates doesn't match your requirements... but perhaps that does the trick |
| 16:21 | callen | No. |
| 16:34 | tpope | (v/length-of :password :within (drop 5 (range))) |
| 16:34 | tpope | is there a less obtuse way to write this? |
| 16:35 | gtrak | (->> (range) (drop 5) (v/length-of :password :within)) ? |
| 16:35 | TimMc | What does length-of do? |
| 16:35 | TimMc | haha |
| 16:36 | amalloy | (nthnext password 4)? like, i don't know about this crazy validation library, but checking that a seq is at least 5 elements long is not hard in normal life |
| 16:36 | tpope | it's from validateur to check if a password is at least x chars |
| 16:37 | gtrak | err... I want my validations as data!? |
| 16:37 | tpope | the existing implementation has (range 5 20) and I was like "why enforce a maximum length" |
| 16:37 | xeqi | (numericality-of (comp length :password) :gte 5) ? |
| 16:38 | technomancy | partial <= 5 |
| 16:39 | gtrak | (= 5 (count (take 5 my-seq)) |
| 16:39 | xeqi | wonder if you could just pass (comp (partial <= 5) length :password) to the validation-set |
| 16:39 | tpope | xeqi that's what we're trying |
| 16:40 | rbxbx | xeqi: that would work except it doesn't adhere toe the contract of a validator fn |
| 16:40 | xeqi | ah, not quite, needs to return a [boolean #{errors}] pair |
| 16:40 | rbxbx | needs to do something like... yes |
| 16:40 | technomancy | wait what |
| 16:40 | technomancy | why not just check for an empty set? |
| 16:41 | xeqi | technomancy: how would you fail without providing any useful info? |
| 16:41 | technomancy | can't tell if serious =) |
| 16:42 | rbxbx | technomancy could if not using a library, but in order to adhere to what validateur expects from validator fns... |
| 16:42 | technomancy | rbxbx: yeah, arguing against the larger design, not the suggestions here |
| 16:43 | rbxbx | technomancy gotcha. |
| 16:43 | gfredericks | why did lein/maven just say something about looking for a snapshot of thneed? |
| 16:43 | gtrak | gosh.. validation as a Domain seems ill-suited to a DSL |
| 16:44 | gfredericks | I don't see thneed anywhere in my deps tree |
| 16:44 | technomancy | gfredericks: I thought I added an exclusion for that or something |
| 16:44 | technomancy | not sure |
| 16:45 | rbxbx | technomancy gfredericks that has happened to me many times. |
| 16:46 | technomancy | rbxbx, gfredericks: running lein from source? |
| 16:46 | rbxbx | yes. |
| 16:46 | gfredericks | no, just a regular installation |
| 16:46 | rbxbx | er |
| 16:46 | rbxbx | 2.0.0-preview10 |
| 16:47 | hyPiRion | I've seen it pop up from time to time, not sure whether it has been on the preview or master though |
| 16:48 | gfredericks | arrays in postgres: korma doesn't seem to handle them correctly on insert. Should I expect clojure.java.jdbc to be any better? |
| 16:48 | gfredericks | (specifically korma generates "(?,?,?)" when it ought to "{?,?,?}") |
| 16:48 | technomancy | ok, so I think master has the exclusions in place for thneed though I don't recall the details |
| 16:50 | xeqi | gfredericks: thneed snapshot was used in the latest trammel, which is used by some versions of lein-jacker, which is used be some plugins |
| 16:50 | xeqi | I'd guess it came from there |
| 16:50 | gfredericks | xeqi: okay, thanks |
| 16:50 | hyPiRion | Travis doesn't pick up thneed though, so I assume it's not from lein itself |
| 16:51 | xeqi | for example, lein-ring pulls it in sometimes |
| 16:51 | tomoj | clojure.java.jdbc would generate neither "(?,?,?)" nor "{?,?,?}", would it? |
| 16:51 | gfredericks | tomoj: I don't know. What happens if you give it a vector as a value? |
| 16:52 | xeqi | rbxbx: ^ |
| 16:52 | gfredericks | I was about to try it out myself. |
| 16:52 | rbxbx | xeqi okay. Thanks. |
| 16:52 | frozenlock | Going through the slime->nrepl transition... I used to be able to send some interesting info to my REPL using a simple `print' function while running an application. (For example, I could see any webhooks received). However `print' doesn't seem to be sending the output to the REPL. Am I mistaken? |
| 16:52 | frozenlock | (print in nrepl that is) |
| 16:53 | moogatronic | frozenlock: you mean like (print "some string") ? |
| 16:53 | technomancy | frozenlock: possibly different flushing behaviour? see if println is different |
| 16:53 | moogatronic | should be appearing. Also there's a *nrepl-server* buffer that nicely captures log4j output |
| 16:54 | cark | frozenlock: your print is hapenning in some other thread, where *out* is not bound |
| 16:54 | llasram | frozenlock: When I print form other than the main REPL thread, I see messages go to the JVM process's stdout instead of *out* |
| 16:55 | msamiry | hello all |
| 16:55 | frozenlock | Oh I see o_O |
| 16:55 | cark | frozenlock: i usually define a function debug like so (let [o *out*] (defn debug [s] (println o s))) |
| 16:55 | cark | tho i'm not sure about order of parameters on println |
| 16:55 | msamiry | please I'd like to ask a question |
| 16:55 | technomancy | ~anyone |
| 16: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 ..." |
| 16:56 | hyPiRion | msamiry: fire away! |
| 16:56 | msamiry | is there something in clojure like numpy.linspace |
| 16:57 | TimMc | What does it do? |
| 16:57 | msamiry | Return evenly spaced numbers over a specified interval |
| 16:58 | msamiry | numpy.linspace(start, stop, num=50, endpoint=True, retstep=False) |
| 16:58 | amalloy | &(doc range) |
| 16:58 | lazybot | ⇒ "([] [end] [start end] [start end step]); Returns a lazy seq of nums from start (inclusive) to end (exclusive), by step, where start defaults to 0, step to 1, and end to infinity." |
| 16:58 | TimMc | msamiry: So, if asked for 3 numbers in 0..20, what would it give back? |
| 16:58 | cark | frozenlock: look at this : https://gist.github.com/4332383 |
| 16:58 | TimMc | amalloy: Not absolutely trivially. |
| 16:59 | msamiry | numpy.linspace(0,2,1000) will give a list of 1000 item between 0 and 2 evenly devided |
| 16:59 | TimMc | Oh, not just integers? |
| 17:00 | TimMc | Then range could work after all -- although you'd want to watch for error propagation. |
| 17:00 | gtrak | cark, if it's in a different thread, send the message to an agent or something |
| 17:00 | TimMc | *accumulation |
| 17:00 | cark | gtrak: this is quick and dirty debugging |
| 17:00 | msamiry | no not just integers |
| 17:00 | hyPiRion | ,(range 0 2 (/ (- 2 0) 4)) ; not correct, but going there. |
| 17:00 | clojurebot | (0 1/2 1N 3/2) |
| 17:00 | cark | gtrak: if you want something serious, use a logging tool |
| 17:00 | gtrak | cark: future's quicker |
| 17:01 | gtrak | and it uses the same threadpool |
| 17:01 | TimMc | msamiry: The incanter library might have something ready-made, if you don't mind pulling that in. |
| 17:01 | cark | gtrak: can't be quicker than my quick and dirty thing =P |
| 17:02 | cark | gtrak: surely could be more correct tho |
| 17:02 | amalloy | &((fn linspace [start stop num] (take num (range start Double/POSITIVE_INFINITY (/ (- stop start) (dec num))))) 0 20 3) |
| 17:02 | lazybot | ⇒ (0 10 20) |
| 17:02 | Fauno1 | &(+ 5 3) |
| 17:02 | lazybot | ⇒ 8 |
| 17:02 | Fauno1 | o_O |
| 17:02 | gtrak | cark: yours will break if *out* is rebound, since it captures the value at initialization |
| 17:02 | TimMc | Fauno1: Not the answer you expected? |
| 17:03 | cark | gtrak: i observed some mixing of log output with this, the agent way is indeed better, but best as i said is a logging framework |
| 17:03 | cark | gtrak: works for me ! |
| 17:03 | cark | technomancy: haha yes |
| 17:03 | technomancy | (actually just "framework" would be enough) |
| 17:04 | brehaut | dont anyone else say it, or something unknowable will show up and destroy our sanity |
| 17:04 | TimMc | technomancy: Just wait until you see my JPEG rendering framework. |
| 17:04 | hyPiRion | ,((fn linspace [min max n] (let [step (/ (- max min) (dec n))] (range min (+ max step) step))) 0 20 3) |
| 17:04 | clojurebot | (0 10 20) |
| 17:04 | frozenlock | cark: thanks! |
| 17:05 | gert | Hi all, we're working on a cljs mocking tool and we would like to use something like with-redefs in clojurescript -- we're using binding to temporarily bind defined functions to their mocked versions, but that generates a lot of "... not declared dynamic" warnings. What's the best way to go about this? |
| 17:06 | amalloy | brehaut: i imagine the next mention of "logging framework" would gradually turn into http://stackoverflow.com/a/1732454/625403 |
| 17:06 | brehaut | haha |
| 17:07 | cark | woah was digging my biggest project for the logging thing i have in it, and it still uses c.c.def and c.c.duck-streams |
| 17:07 | brehaut | amalloy: i found an accurate diagram on wikipedia http://upload.wikimedia.org/wikipedia/commons/2/28/Azathoth.jpg |
| 17:08 | dnolen | gert: probably need an official `with-redefs` that works like `bindings` minus the warnings, open a ticket in JIRA |
| 17:08 | msamiry | @TimMc @hyPiRion @amalloy thanks, I appreciate ur help |
| 17:08 | gfredericks | so if I want to use arrays in postgres am I best off patching clojure.java.jdbc to handle them? |
| 17:09 | gfredericks | there's no existing clojure lib that does this well? |
| 17:09 | technomancy | amalloy: ... wow. |
| 17:09 | crease | man, backbutton.el's great |
| 17:09 | cark | it indeed uses an agent, a ref and does daily log file rotation, the whole of which is about 30 lines of code... |
| 17:09 | gert | dnolen: cheers. as a temporary workaround, we're trying to figure out how to set *cljs-warn-on-dynamic* to false from leiningen when we're running our tests, but not sure how to do that |
| 17:10 | technomancy | gfredericks: I think it would go deeper than c.j.jdbc to the actual underlying jdbc drivers? |
| 17:10 | gfredericks | technomancy: I'm not sure what that statement implies |
| 17:10 | gfredericks | certainly the details involve the driver... |
| 17:10 | technomancy | gfredericks: oh never mind I'm thinking of the json datatype |
| 17:11 | technomancy | carry on |
| 17:11 | dnolen | gert: are you using lein-cljsbuild? |
| 17:11 | gert | yes we are |
| 17:11 | brehaut | postgres's json datatype intrigues me. Im thinking of porting my site from couchdb to postgres and using it as a datamullet |
| 17:12 | dnolen | gert: k not sure how that's done but you just need to bind that to false when calling lein-cljsbuild to compile the files. I don't think we provide a fine grained way to tweak warnings yet via build options. |
| 17:12 | dnolen | no sure how things are handled in lein-cljsbuild I mean as far as where you need to set up the binding |
| 17:12 | dnolen | I mean |
| 17:12 | technomancy | brehaut: I don't think the underlying jdbc driver supports it yet |
| 17:13 | brehaut | technomancy: ah :/ |
| 17:13 | technomancy | but yeah, it looks like it could replace document DBs nicely once it does |
| 17:13 | technomancy | someone told me that postgres is the emacs of DBs |
| 17:13 | gert | thanks dnolen, we'll do some more digging |
| 17:13 | brehaut | nightmare to set up but does everything once you succeed? |
| 17:13 | brehaut | sounds apt |
| 17:15 | ynniv | I'm having issues with AOT compilation, but I'm not compiling on purpose |
| 17:15 | TimMc | "datamullet"... |
| 17:15 | ynniv | I think this is due to import / use? |
| 17:15 | technomancy | ynniv: do you have :main in project.clj? |
| 17:15 | TimMc | Do you have any protocols or defrecords? |
| 17:15 | brehaut | TimMc: business (relational) in the front, party (adhoc blobs) in the back |
| 17:16 | brehaut | TimMc: originally meant for a system that uses an SQLDB with a NoSQL db |
| 17:16 | ynniv | i have no protocols or defrecords, but I do have a :main |
| 17:16 | technomancy | ynniv: try :main ^:skip-aot my.ns |
| 17:16 | TimMc | brehaut: Hmm, in that case I misunderstand the pg/json usage. |
| 17:16 | technomancy | ynniv: the next version of lein won't require that, FWIW |
| 17:17 | ynniv | that sounds good, because ^:skip-aot is pretty magical |
| 17:17 | brehaut | TimMc: Im not sure i can explain it sorry :/ |
| 17:17 | TimMc | technomancy: lein 2 defaults to non-AOT? |
| 17:17 | technomancy | ynniv: it used to be that :main was only used for uberjars, but these days it's usually used for lein run instead |
| 17:18 | TimMc | brehaut: Ah, relational calls producing JSON blobs? |
| 17:18 | ynniv | yes, I'm using it for lein(2) run. |
| 17:18 | technomancy | TimMc: better to be explicit about AOT instead of magically flipping it on and having a hidden switch to turn off the magic |
| 17:18 | TimMc | technomancy: Man, who wants it for uberjars anyhow? ;-P |
| 17:19 | TimMc | s/;/:/ |
| 17:19 | technomancy | TimMc: I tell ya, back in the day it was all uberjars all the time |
| 17:19 | TimMc | all AOT'd uberjars, too |
| 17:19 | TimMc | Let me tell you about this one plugin... |
| 17:19 | ynniv | uberWar is still very useful |
| 17:19 | technomancy | lein 1.0.0 actually compiled everything by default |
| 17:20 | technomancy | that didn't last long |
| 17:20 | crease | Anyone know if it's possible to extend protocols over primitive types? |
| 17:20 | crease | not having much luck :( |
| 17:21 | ynniv | (inc technomancy) |
| 17:21 | lazybot | ⇒ 42 |
| 17:21 | ynniv | wow! congrats! |
| 17:21 | TimMc | brehaut: I somehow thought it was a JSON-ish interface backed by relational stuff. :-) |
| 17:21 | TimMc | ibdknox! We need a downvote in here! |
| 17:21 | AimHere | (dec TimMc) |
| 17:21 | lazybot | ⇒ 22 |
| 17:22 | TimMc | oh no! |
| 17:22 | AimHere | I think we got one |
| 17:22 | technomancy | (dec inc) |
| 17:22 | lazybot | ⇒ 1 |
| 17:22 | TimMc | (inc dec) |
| 17:22 | lazybot | ⇒ 1 |
| 17:22 | dnolen | crease: you can extend the object versions of the primitives |
| 17:23 | ppppaul | would someone be able to help me with a datomic issue |
| 17:23 | ppppaul | i'm in the datomic channel |
| 17:23 | crease | dnolen: it is so! thanks! |
| 17:24 | hyPiRion | (inc TimMc) |
| 17:24 | lazybot | ⇒ 23 |
| 17:24 | TimMc | a good number |
| 17:25 | hyPiRion | $karma TimMc |
| 17:25 | lazybot | TimMc has karma 23. |
| 17:25 | AimHere | And only yesterday I made an illuminatus reference. |
| 17:26 | craigbro | (inc foo) |
| 17:26 | gman_ | Hi all can someone tell me what an expression like header->body means? |
| 17:26 | lazybot | ⇒ 2 |
| 17:26 | craigbro | (inc craibro) |
| 17:26 | lazybot | ⇒ 1 |
| 17:26 | craigbro | (inc craigbro) |
| 17:26 | lazybot | You can't adjust your own karma. |
| 17:26 | craigbro | good |
| 17:27 | AimHere | (dec ChanServ) |
| 17:27 | lazybot | ⇒ -1 |
| 17:27 | gtrak | that guy's a jerk |
| 17:27 | hyPiRion | You can adjust your own karma. |
| 17:27 | hyPiRion | ,(println "(inc hypiRion)") |
| 17:27 | clojurebot | (inc hypiRion) |
| 17:27 | lazybot | ⇒ 4 |
| 17:28 | gtrak | gman_: when I write names like that, that usually signifies a map |
| 17:28 | gtrak | from key->value |
| 17:29 | amalloy | gman_: it's just the name of something. probably a function |
| 17:29 | gman_ | ok so you can dereference a map with that syntax? |
| 17:29 | crease | ,(type crease) |
| 17:29 | clojurebot | #<CompilerException java.lang.RuntimeException: Unable to resolve symbol: crease in this context, compiling:(NO_SOURCE_PATH:0)> |
| 17:29 | crease | ho hum |
| 17:29 | gtrak | gman_: it's not a syntax |
| 17:29 | technomancy | it means it's converting between "types" loosely |
| 17:29 | technomancy | but header->body makes no sense |
| 17:29 | technomancy | because you can't convert between them |
| 17:29 | amalloy | technomancy: just confusing the issue. the point is it's a name, with no special signifigance in the language |
| 17:29 | technomancy | oh, sure |
| 17:30 | gtrak | data row header to human body conversion function |
| 17:30 | amalloy | header->body exists in gloss and makes sense in context |
| 17:30 | crease | (type craigbro) |
| 17:30 | craigbro | (inc (var-get (resolve 'craigbro))) |
| 17:30 | lazybot | ⇒ 1 |
| 17:30 | craigbro | (inc (var-get (resolve 'craigbro))) |
| 17:30 | lazybot | ⇒ 2 |
| 17:30 | craigbro | well well well |
| 17:30 | crease | uh oh |
| 17:30 | TimMc | what |
| 17:30 | amalloy | dunno if that's the one he's run into, but saying it makes no sense seems silly |
| 17:31 | technomancy | craigbro: you're way over-thinking it =) |
| 17:31 | gman_ | yes it is from gloss, I just can't glean what it expresses |
| 17:31 | amalloy | TimMc: that's just the karma plugin |
| 17:31 | technomancy | craigbro: it only looks like lisp; it's really not. |
| 17:31 | crease | (type (var-get (resolve 'craigbro))) |
| 17:31 | TimMc | oh, ha |
| 17:31 | TimMc | I get it. |
| 17:31 | craigbro | $karma craigbro |
| 17:31 | lazybot | craigbro has karma 0. |
| 17:31 | craigbro | ah |
| 17:31 | Bronsa | lol |
| 17:31 | TimMc | $karma (var-get (resolve 'craigbro)) |
| 17:31 | lazybot | (var-get has karma 0. |
| 17:31 | Bronsa | $karma (var-get (resolve 'craigbro)) |
| 17:31 | lazybot | (var-get has karma 0. |
| 17:31 | Bronsa | what. |
| 17:31 | hyPiRion | it's escaping incorrectly |
| 17:32 | ibdknox | 2pro4u |
| 17:32 | hyPiRion | We've been through this before |
| 17:32 | ibdknox | lol |
| 17:32 | craigbro | i imagine so |
| 17:32 | gman_ | i mean the -> operator when between two symbols |
| 17:32 | TimMc | Oh, (inc and $karma have differnet parsing. |
| 17:32 | hyPiRion | (inc ~@:*) |
| 17:32 | lazybot | ⇒ 1 |
| 17:32 | TimMc | gman_: It's not between them -- it's part of the name. |
| 17:32 | ibdknox | ppppaul: is that cljs pprint stuff somewhere? :) |
| 17:32 | hyPiRion | karma ~@:* |
| 17:32 | amalloy | gman_: -> isn't an operator anyway, and in header->body it's just the name of a thing, named "header->body" |
| 17:32 | hyPiRion | $karma ~@:* |
| 17:32 | lazybot | ~@:* has karma 1. |
| 17:32 | clojurebot | @ has nothing to do with whether sth is evaluated or not |
| 17:32 | gtrak | gman_: ##[(class 'a->b) 'a->b] |
| 17:32 | lazybot | ⇒ [clojure.lang.Symbol a->b] |
| 17:33 | TimMc | ,'foo->>>>-->->>bar ;; gman_ |
| 17:33 | clojurebot | foo->>>>-->->>bar |
| 17:33 | gman_ | ahh.. ok thanks TimMc |
| 17:33 | TimMc | gtrak: Don't you mean... ##((juxt class identity) 'a->b) :-P |
| 17:33 | lazybot | ⇒ [clojure.lang.Symbol a->b] |
| 17:33 | gtrak | of course |
| 17:34 | TimMc | Always use juxt, even if it will confuse people. |
| 17:34 | amalloy | TimMc: well done preempting me there; i was going to scold you for confusing people |
| 17:34 | TimMc | s/even if/especially when/ |
| 17:34 | ibdknox | especially when it'll confuse people. |
| 17:34 | TimMc | BAM |
| 17:34 | amalloy | ibdknox: TimMc is on fire |
| 17:34 | ibdknox | oh no's |
| 17:34 | ibdknox | lol |
| 17:37 | gtrak | ,(map #(%) (map #(partial % 'a->b) [class identity])) |
| 17:37 | clojurebot | (clojure.lang.Symbol a->b) |
| 17:38 | crease | hrm, is there a good way to traverse maps in core.logic? |
| 17:38 | dnolen | crease: nothing beyond seq'ing them |
| 17:39 | amalloy | maps are almost as hard as numbers |
| 17:40 | crease | dnolen, amalloy: oh. So what do people use to run queries on map literals in source? |
| 17:40 | solussd | what do people use for custom decoders when using cheshire? |
| 17:40 | dnolen | crease: or you could do some custom unification |
| 17:41 | gtrak | last one: ##(drop 1 (reductions (fn [_ a] (a)) nil (map #(partial % 'a->b) [class identity]))) |
| 17:41 | lazybot | ⇒ (clojure.lang.Symbol a->b) |
| 17:41 | dnolen | crease: people haven't tried it much so it's still a developing topic. lynaghk implemented partial maps which is useful - but I need to tweak it a bit to make it sound. |
| 17:42 | frozenlock | cark: I must be missing something... I still don't see anything appearing in my *nrepl* or *nrepl-server*. :( |
| 17:43 | mindbender1 | what the best way of adding new library dependency to a running nrepl session |
| 17:44 | moogatronic | frozenlock: what version of nrepl.el are you running? |
| 17:44 | brehaut | pomegranate ? |
| 17:44 | frozenlock | eh... the one from lein 2.0.0-preview10 |
| 17:45 | crease | dnolen: yah, I was just looking at that branch… I'm trying to write a source navigator for projects using zippers and logic queries |
| 17:45 | moogatronic | frozenlock: well, nrepl.el is separate from nrepl that lein uses. oh wait, are you using emacs even? |
| 17:45 | crease | I suppose I could represent the source as a tree of records and do queries on that |
| 17:45 | frozenlock | Oh sorry, I didn't see .el |
| 17:46 | moogatronic | 0.1.6-preview fixed some stuff that was broken for me in the prev ver, but that's not likely related to your issues.. |
| 17:46 | hyPiRion | ,(mapv #(% 'a->b) [#(`%%%) class]) |
| 17:46 | clojurebot | [a->b clojure.lang.Symbol] |
| 17:46 | frozenlock | 0.1.3 |
| 17:46 | dnolen | crease: partial maps are actually in master now. that sounds interesting. |
| 17:46 | frozenlock | Oh! I'll try that then, thanks for the tip! |
| 17:46 | mindbender1 | brehaut: ok thanks just making sure |
| 17:47 | brehaut | mindbender1: i dont know for certain, but thats the only thing that springs to mind |
| 17:47 | crease | dnolen: oh, awesome! |
| 17:47 | moogatronic | frozenlock: yeah, maybe update to at least 0.1.5, but the preview fixed restarting the repl for me. |
| 17:47 | moogatronic | (0.1.6-preview i mean) |
| 17:48 | gtrak | there must be a market for manual clojure obfuscation |
| 17:49 | aperiodic | sounds like a good kibbit plugin |
| 17:49 | crease | dnolen: the idea is something a bit like the call-hierarchy stuff in Eclipse, where you can display and navigate through potentially cyclic or otherwise infinite trees |
| 17:49 | dnolen | crease: again I don't recommend using them heavily in their current form. At some point in the future I hope to see how well having a constraint version of some of Clojure's core APIs plays out. for traversal I need some hammock time |
| 17:51 | gfredericks | seancorfield: ping |
| 17:51 | dnolen | crease: rhickey at ClojureX had a good idea - relations should really be polymorphic - Clojure already has a rich notion of sequences, core.logic should perhaps have something that mirrors that but allowing moving back to the original data that generated the sequence. |
| 17:51 | dnolen | crease: have you seen this - http://github.com/cderoove/damp.ekeko ? |
| 17:52 | dnolen | crease: queries of the Java AST in Eclipse, it uses core.logic |
| 17:58 | hyPiRion | gtrak: manual clojure obfuscation? Sure thing! |
| 17:58 | gtrak | let's start a company |
| 17:58 | hyPiRion | We need to find a market first |
| 17:58 | gtrak | the users don't know what they want... it's our job to tell them |
| 17:59 | crease | dnolen: no, I hadn't seen that! It looks really cool |
| 17:59 | hyPiRion | Maybe we can sell our services to rhickey, explaining that he can focus on working with the language instead of reviewing bugfixes and whatnot |
| 17:59 | Bronsa | lol |
| 18:00 | gtrak | I meant obfuscating the code, not the language itself.. ;-) |
| 18:00 | hyPiRion | I meant the code for the language :) |
| 18:00 | technomancy | was going to say; that explains contains? |
| 18:01 | hyPiRion | And (Boolean. false) and friends? |
| 18:01 | gtrak | technomancy: just use java interop in order to doTheRightThingTM |
| 18:02 | gtrak | what's the big deal? #(.contains [:a :b :c :d] :d) |
| 18:02 | gtrak | ##(.contains [:a :b :c :d] :d) |
| 18:02 | lazybot | ⇒ true |
| 18:02 | hyPiRion | Or some |
| 18:02 | hyPiRion | ,(some :d [:a :b :c :d]) |
| 18:02 | clojurebot | nil |
| 18:03 | hyPiRion | See, that works nice. |
| 18:03 | hyPiRion | ,(some #(= :d %) [:a :b :c :d]) |
| 18:03 | clojurebot | true |
| 18:03 | hyPiRion | gah. |
| 18:04 | dnolen | ,(some #{:d} [:a :b :c :d]) |
| 18:04 | clojurebot | :d |
| 18:04 | hyPiRion | ,(some #{false} [false :a :b :c :d]) |
| 18:04 | clojurebot | nil |
| 18:04 | hyPiRion | But yeah, if you know they are truthy, #{} is sweet. |
| 18:05 | gtrak | contains? makes more sense as clojure.set function, but it's used all over core.clj |
| 18:06 | AimHere | ,(contains? [:a :b :c] :c) |
| 18:06 | clojurebot | false |
| 18:06 | AimHere | ,(contains? [:a :b :c] 1) |
| 18:06 | clojurebot | true |
| 18:06 | rbxbx | weavejester: am I incorrect in thinking that https://github.com/weavejester/ring-json-response/blob/master/src/ring/middleware/json_response.clj#L11 should work for things other than maps which are representable as JSON? (ie: a vector) |
| 18:06 | amalloy | rbxbx: the docstring is pretty clear that it's not intended to work that way |
| 18:07 | weavejester | rbxbx: That library is deprecated. Try: https://github.com/ring-clojure/ring-json |
| 18:07 | rbxbx | aha |
| 18:07 | weavejester | I need to update the README to mention that. I thought I did, but maybe I didn't push it. |
| 18:08 | rbxbx | weavejester: awesome. That's how I expected the impl to work :D |
| 18:08 | rbxbx | amalloy I get that, just figured https://github.com/ring-clojure/ring-json/blob/master/src/ring/middleware/json.clj#L41 was the apropos behavior ;) |
| 18:08 | rbxbx | Thanks weavejester! |
| 18:08 | weavejester | rbxbx: Note it only works with vectors, not seqs, because seqs are used for streaming Ring responses. |
| 18:11 | rbxbx | weavejester: noted. |
| 18:19 | hyPiRion | ..well, that was easier than I though it would be. |
| 18:20 | hyPiRion | Anyone here who has submitted patches to bugs in core? |
| 18:20 | yedi | is it called boolean pattern, or boolean equation, or? |
| 18:28 | TimMc | &(-> class class class) |
| 18:28 | lazybot | ⇒ java.lang.Class |
| 18:28 | technomancy | hyPiRion: I have, but the process has changed so as to be unrecognizable since Jira was introduced |
| 18:28 | technomancy | s/unrecognizable/incomprehensible/ |
| 18:28 | hyPiRion | technomancy: okay, that's exactly why I asked. |
| 18:30 | hyPiRion | Oh well, I'll just hop down the rabbit hole and hope for the best. |
| 18:30 | TimMc | hyPiRion: #(`%%%) is still my favorite. |
| 18:31 | hyPiRion | TimMc: it's shorter than identity! |
| 18:32 | hyPiRion | There's some gensym leakage within #() though |
| 18:33 | hyPiRion | ,(#(do `%) :foo) |
| 18:33 | clojurebot | p1__87__88__auto__ |
| 18:34 | bbloom | dnolen: could you elaborate on the polymorphic relationship and bi-directional navigation? |
| 18:36 | mmitchell | is there a core fn that takes a map and a set of functions, and then applies the functions to the *values* of the map, and then returns the map with the new values? |
| 18:36 | technomancy | mmitchell: no, but it'd sure be nice |
| 18:36 | Raynes | There is one in useful. |
| 18:36 | technomancy | (zipmap (keys m) (map f (vals m))) is the closest |
| 18:36 | Raynes | I hate that version |
| 18:36 | mmitchell | haha |
| 18:37 | technomancy | s/closest/shortest/ |
| 18:38 | hyPiRion | No love for reduce-kv? |
| 18:38 | hyPiRion | &(reduce-kv (fn [m k v] (assoc m k (+ 1 v))) {} {:a 1, :b 2, :c 3}) |
| 18:38 | lazybot | ⇒ {:b 3, :c 4, :a 2} |
| 18:39 | mattmoss | (into {} (map (juxt key (comp f val)) coll) |
| 18:39 | dnolen | bbloom: just that if you want to do anything w/ the various Clojure data structures in core.logic you end up doing a lot of explicit seq'ing. Would be nice if this could be pushed under the covers somehow. seems like you might need a slightly smarter notion of seq to do this. |
| 18:39 | hyPiRion | (reduce-kv #(assoc % %1 (f %2)) {} ...) |
| 18:39 | amalloy | TimMc: that's a neat identity function |
| 18:40 | bbloom | dnolen: smarter in what sense? |
| 18:40 | dnolen | bbloom: in general miniKanren abounds with cases where there are missed opportunities for polymorphism - constraints for example. !=fd vs !=. Of course it make it's more challenging to implement, and it's not clear how constraints might / should interact. |
| 18:40 | bbloom | dnolen: one thing i've considered is "the seq" or "a seq". unsorted collections are seq-able, but really there are N! arbitrary sequences you can pick |
| 18:41 | dnolen | bbloom: you put a map in your want to get a map out. that won't happen if you seq a map. |
| 18:41 | mattmoss | ,(let [m {:a 1 :b 2 :c 3}] (into (empty m) (map (juxt key (comp inc val)) m))) |
| 18:41 | clojurebot | {:a 2, :c 4, :b 3} |
| 18:41 | bbloom | dnolen: ah, i see, some kinda seq that carries with it the notion of conj! and empty |
| 18:42 | dnolen | bbloom: something, to be honest I have the haziest of notions at the moment. |
| 18:43 | TimMc | amalloy: Praise/blame goes to hyPiRion for #(`%%%) |
| 18:43 | bbloom | dnolen: clearly your AbstractRehydratableCollectionSequence needs to have an AbstractLinearizableCollectionFactory |
| 18:43 | bbloom | er i mean, yes more hammock time. |
| 18:44 | dnolen | bbloom: :) |
| 18:45 | bbloom | dnolen: but yeah: makes sense to me. definitely worth exploring |
| 18:45 | hyPiRion | TimMc: http://i.imgur.com/cvEFp.png |
| 19:03 | bosie | is midje supposed to reload the code in the repl? |
| 19:03 | bosie | i am using (load-facts) and it doesn't seem to see the changes i make outside of the test files |
| 19:05 | S11001001 | bosie: I don't think it will globally load; if you're using nrepl press C-c C-l when in a buffer to reload it |
| 19:05 | S11001001 | bosie: global reload is more trouble than it's worth |
| 19:06 | bosie | S11001001: lein repl |
| 19:06 | S11001001 | bosie: well, you can use require :reload then, but I'd suggest getting going with nrepl instead |
| 19:06 | bosie | S11001001: i am just trying technomancy's suggestion of executing midje test cases through the repl and not with "lein repl" |
| 19:09 | technomancy | bosie: I recommend handling reloading through your editor |
| 19:09 | bosie | S11001001: will look into nrepl |
| 19:10 | ticking | what if file implemented count to get the number of files in a directoy? |
| 19:10 | technomancy | ticking: you can count file-seq |
| 19:11 | ticking | technomancy: yeah but that is recursive |
| 19:11 | technomancy | oh right |
| 19:11 | ticking | technomancy: tbh a non recursive file-seq would probably better ^^ |
| 19:11 | technomancy | like .listFiles |
| 19:11 | technomancy | ? |
| 19:12 | S11001001 | but there's the burning question of whether you must count "." and "..", therefore all file list counters must be custom |
| 19:12 | ticking | yes, but without the java interop |
| 19:12 | technomancy | why without java interop? |
| 19:12 | ticking | because its nasty |
| 19:12 | technomancy | it is not nasty |
| 19:12 | ticking | just think of the higher order functions^^ |
| 19:12 | amalloy | use another language, then |
| 19:13 | amalloy | clojure can't get anything done without *someone* talking to java |
| 19:13 | hyPiRion | "eww, java. Let's build a language on top of it" |
| 19:13 | hyPiRion | "with good interop" |
| 19:13 | ticking | hyPiRion: you know what they say "The jvm is a nice runtime, but its reference language sucks." |
| 19:14 | amalloy | ticking: not relevant? nobody is telling you to write java |
| 19:14 | amalloy | only suggesting you use the jvm runtime's method-invocation feature |
| 19:14 | ticking | amalloy: there is a reason why you don't write java.io.File. everytime you now use clojure.java.io/file |
| 19:14 | Raynes | Uh |
| 19:14 | Raynes | No, I don't. |
| 19:14 | S11001001 | One time I needed to use httpcomponents-client. |
| 19:15 | S11001001 | clj-http-client didn't have the features I needed. |
| 19:15 | Raynes | If you hate Java so much that you aren't willing to use perfectly acceptable code already written in it, you're probably using the wrong language. |
| 19:15 | S11001001 | So I...used interop to work with hc-client directly, it worked out |
| 19:15 | dakrone | S11001001: out of curiosity, which feature? |
| 19:16 | ticking | Raynes, I'm not saying that this shouldn't be used but that it should be wrapped by the core already |
| 19:16 | Raynes | That's insane. |
| 19:16 | Raynes | You want to wrap every single bit of Java code in clojure.core? |
| 19:16 | Raynes | For the sole purpose of not having to write a dot before the name? |
| 19:16 | ticking | Raynes, no, I just want to wrap the usefull file io bits in clojure.java.io |
| 19:17 | ticking | Raynes: I agree that the old testament "The only good about java are 1 billio lines of java." is true |
| 19:17 | Raynes | https://github.com/Raynes/fs <-- some file system stuff |
| 19:17 | S11001001 | dakrone: it was 2 years ago, but probably something to do with headers or persistent connection handling |
| 19:17 | ticking | Raynes: thus we should use what is there |
| 19:17 | S11001001 | ticking: define useful |
| 19:17 | ticking | Raynes but that still doesn't mean that I want to use interop in non libary coe |
| 19:18 | ticking | Raynes: yeah I know, I actually use your lib in a lot of projects, could use jome javadoc btw ;D |
| 19:19 | Raynes | If I could get weavejester to reply to my codox issue. ;) |
| 19:19 | weavejester | Hm? |
| 19:19 | Raynes | weavejester: https://github.com/weavejester/codox/issues/16 |
| 19:19 | Raynes | y u no work |
| 19:19 | ticking | S11001001: everyday stuff, not esoteric things like getters and setters for sticky bits or ZFS hash information |
| 19:20 | S11001001 | ticking: it's not a dichotomy |
| 19:20 | S11001001 | for example, suppose you're walking a tree. |
| 19:20 | weavejester | Oh yep, I've been meaning to look into that, but I've been sick lately, so I haven't worked up the courage to go through the code in Lein master and work out why the dependencies have changed. |
| 19:20 | S11001001 | Do you need file types beyond isdir? |
| 19:20 | Raynes | Awww. |
| 19:21 | S11001001 | Well, maybe. |
| 19:21 | brehaut | Raynes: weavejester is in england, they drink tea |
| 19:21 | S11001001 | Depends on how good you want it to be. |
| 19:21 | ticking | S11001001: you need isDir? isFile? isSpecial? |
| 19:21 | weavejester | We have chicken soup too |
| 19:21 | Raynes | brehaut: I'm in Alabama. We drink whiskey and cough syrup. |
| 19:21 | weavejester | I had some earlier :) |
| 19:21 | brehaut | weavejester: what‽ my entire understanding of england is coming unraveled! |
| 19:21 | Raynes | I'll be in LA soon though. And they drink protein shakes. |
| 19:22 | bosie | Raynes: many clj programmers in alabama? ;) |
| 19:22 | Raynes | bosie: I know of just one. |
| 19:22 | Raynes | His name is Raynes. |
| 19:22 | S11001001 | So the definition of "everyday stuff" isn't clear-cut. |
| 19:22 | bosie | hah |
| 19:22 | crease | lovin protocols |
| 19:23 | Raynes | weavejester: Where is that assert at? I can probably fix whatever the problem is for you. |
| 19:23 | Raynes | Oh, dur |
| 19:23 | Raynes | Never mind. |
| 19:23 | Raynes | Dear Anthony, you has stacktrace. |
| 19:23 | ticking | S11001001: then you grow and shrink the library based on user input |
| 19:23 | brehaut | S11001001, ticking: I think java.util.concurrent Queues are a great example of everyday stuff that nobody wraps because they are so useful already |
| 19:24 | S11001001 | ticking: that sounds like "grow and ...grow" to me. We can't even kick if-not out of clojure.core. |
| 19:25 | ticking | S11001001: then there are 1 or 2 functions in there that are already use or you aply this conservatively and try to keep it at a minimum |
| 19:25 | S11001001 | I think the main area where you might want a library, and you can't do something nice with clojure like write a dsl, is "stuff you might want to do in cross-clojure code" |
| 19:25 | ticking | S11001001: still no reason to keep it nonexistent |
| 19:26 | Raynes | weavejester: How would you feel about inlining source code instead of linking to Github, sort of like rubydoc does? |
| 19:26 | S11001001 | ticking: anyway, since it's just a few functions, why not introduce a new library with impls for jvm,clr?,js? The bar isn't that high for new libs in clojure-land |
| 19:26 | ticking | S11001001: the same goes for the queues, just because they are usefull doesn't mean they are idiomatic |
| 19:26 | weavejester | Raynes: Not sure. Too tired right now to have an opinion. |
| 19:26 | Raynes | weavejester: I'm interested in adding it with pygments highlighting. It would basically just change the source link to expand to the code. Could also still do the linking to github thing with an option. |
| 19:26 | Raynes | Haha |
| 19:26 | weavejester | Raynes: Codox does support custom outputs, though |
| 19:27 | Raynes | Alright, no prob. |
| 19:27 | ticking | S11001001: the bettern thign to do would probably write a pull request for fs to Raynes |
| 19:27 | S11001001 | hmm |
| 19:27 | S11001001 | @mail rplevy you'll be happy to know I'm getting RHCA'd |
| 19:28 | Raynes | I don't accept pull requests. You have to send me a CA, a blood sample, make a jira issue, wait 6 months, attach a patch, and then wait for me to vet it and send it to amalloy for code review and then brehaut will merge it if all goes as planned. |
| 19:29 | ticking | Raynes: sounds simpler than contributing to clojure ;) |
| 19:29 | brehaut | ticking: you havent seen me try to merge a patch |
| 19:29 | Raynes | Haha, that's exactly the process for contributing to Clojure, except the blood sample. |
| 19:31 | ticking | yeah thats the only thing from submitting a 400% faster version of partition-by which is implemented in the even faster partition-between which can split at arbitrary places instead of just borders between values |
| 19:31 | hyPiRion | wait 6 months for what? |
| 19:31 | hyPiRion | the CA to be accepted? |
| 19:32 | ticking | hyPiRion: it takes rick that long to channel the dark spirit of clojus the deamon of programming from the 11th dymention to give is dark blessing to the patch ^^ |
| 19:33 | hyPiRion | Well yeah, obviously. |
| 19:33 | ticking | lol |
| 19:33 | hyPiRion | brehaut: how the.. what? wouldn't it be [1 1] [1 3] ? |
| 19:34 | brehaut | hyPiRion: not if you are partitioning in arbitrary places instead of just the borders between values |
| 19:34 | hyPiRion | oh right |
| 19:34 | brehaut | i never said it was rational :P |
| 19:34 | ticking | hrhr |
| 19:34 | amalloy | brehaut: you made it produce rational numbers |
| 19:34 | ticking | I wonder how the params for the partition funciton would look like |
| 19:35 | brehaut | amalloy: someone always has to be pedantic |
| 19:36 | amalloy | no, the pedants would have pointed out your lame implementation produces real numbers |
| 19:36 | Raynes | sattvik: leinjacker's dep stuff is broken against recent leiningen 2 previews. |
| 19:36 | ticking | I would already be happy about something like (partition-between (fn [x y] …) …) |
| 19:37 | Raynes | amalloy: Didn't leiningen start using ordered maps as an internal representation of dependencies instead of vectors? |
| 19:37 | ticking | in the core |
| 19:37 | amalloy | started, then stopped, i think |
| 19:44 | dhm | anyone know if it's possible to make ring watch and reload namespaces defined in a project's dependencies and imported at startup time via a symlink in directory 'checkouts'? |
| 19:45 | sattvik | Raynes: Hmm… I'll have to take a look at that. Could you open a bug, please? |
| 19:45 | Raynes | sattvik: I found out why |
| 19:46 | Raynes | sattvik: Dependencies isn't a vector of vectors anymore, it's a seq of vectors. Just need to change the assertion to look for a seq instead. |
| 19:46 | Raynes | sattvik: https://github.com/Raynes/leinjacker/blob/master/src/leinjacker/deps.clj#L47 these assertions |
| 19:46 | sattvik | Raynes: Ah, OK. |
| 19:47 | Raynes | sattvik: Want me to throw a pull request at you? |
| 19:47 | Raynes | Well... |
| 19:47 | sattvik | Raynes: That'd be great. |
| 19:47 | Raynes | I guess asserting a seq would break lein 1 compatibility. |
| 19:47 | Raynes | Are you going for compatibility with lein 1 here? |
| 19:47 | Raynes | I could assert (sequential? ..) |
| 19:48 | sattvik | Yes, both Lein 1 and Lein 2. |
| 19:48 | sattvik | That could work. |
| 19:48 | Raynes | I'll give that a shot. |
| 19:52 | egghead | hey all, I am trying to use a function which slurps up keys/vals via [& {:keys [..]}] -- I have a object containing those keys but I need to pass them individually (somefn :a 1 :b 2) rather than (somefn {:a 1 :b 2}) -- if it wasn't a hashmap I'd use apply, is there anything I could do? |
| 19:53 | bbloom | ,(apply concat {:a 1 :b 2}) |
| 19:53 | clojurebot | (:a 1 :b 2) |
| 19:54 | egghead | ah, that works... thanks bbloom |
| 19:54 | egghead | I was thinking 'I could mapcar list over the keys and vals....' but concat works much better |
| 19:55 | Raynes | sattvik: I'm having a bit of trouble running the tests. |
| 19:55 | Raynes | Actual: java.lang.IllegalStateException: Unable to find Leiningen 2 in the path as lein or lein2. Please make sure it is installed and in your path under one of those names. |
| 19:55 | Raynes | I have lein on my path (leiningen 2) as well as lein1 for lein 1. |
| 19:55 | Raynes | Is something wrong with that setup? |
| 19:56 | egghead | mapcat* |
| 19:57 | amalloy | egghead: you could mapcat identity over the map-entries. concat is better, but mapcat solutions also exist |
| 19:58 | Raynes | sattvik: Never mind, drip was breaking it. |
| 19:58 | Raynes | amalloy: Damn your drip. |
| 19:58 | bbloom | I found a solution to the slow JVM startup time! i got a faster machine :-P |
| 19:59 | egghead | amalloy: ah, mapcat identity is even simpler than what I was thinking, still apply concat seems to make sense since I just want to concatenate all the key/value pairs |
| 19:59 | Raynes | amalloy: Remember how we always had that issue where we'd want to kill cake's persistent jvm just to be sure it wasn't causing problem? I do that now with LEIN_JAVA_CMD= lein test |
| 19:59 | egghead | you guys are so smart :3 |
| 20:03 | mpan | what's the most convenient way to run a standalone clojure file? |
| 20:03 | osbert | hi, is there somebody here that is an admin on clojars that can delete the jars osbert/hiccup-bootstrap and org.clojars.osbert.osbert/hiccup-bootstrap for me? i just had two huge brain farts. sorry and thanks in advance. |
| 20:03 | technomancy | osbert: sure; I can get that |
| 20:04 | amalloy | the jvm really doesn't start up slowly enough for developers to notice, bbloom. it's the time spent compiling clojure.core, lein, and your app that you notice |
| 20:05 | akhudek | amalloy: can you aot clojure core? I've found even if you aot your entire app the startup time is still ~2 sec |
| 20:05 | bbloom | amalloy: i'm just enjoying my new mbp being much faster than my prior machine. `lein repl` now only takes 1ish second to get to a useful prompt, which is a huge improvement for me |
| 20:05 | amalloy | probably that's your ssd rather than a faster cpu |
| 20:05 | bbloom | amalloy: my prior machine was an older air which had an ssd too |
| 20:06 | technomancy | osbert: *voip* |
| 20:06 | technomancy | gone |
| 20:06 | osbert | technomancy: thanks, sorry about that. |
| 20:06 | technomancy | np |
| 20:06 | amalloy | akhudek: even if you AOT namespaces, i believe the compiler checks to see if a source file is available and recompiles it if so; AOT is more for exposing a java-friendly interface. not sure about that, though |
| 20:06 | technomancy | AOT does allow for faster loading |
| 20:07 | technomancy | but the bytecode still needs to pass through the verifier |
| 20:07 | Raynes | sattvik: Just sent you a pull request. When do you think we can get a release? Codox is broken until we do. |
| 20:07 | akhudek | yep, we have a command line app and AOT is pretty crucial to have it start up quickly |
| 20:07 | technomancy | FSVO "quickly" |
| 20:07 | akhudek | well, people still complain about the 2s :-/ |
| 20:08 | akhudek | which is funny because it's a compiler that is not fast |
| 20:08 | Raynes | akhudek: I would have written it in Haskell! :D |
| 20:08 | akhudek | Raynes: hah, not a bad choice :-) |
| 20:11 | amalloy | technomancy: so if your code is AOTed, the compiler doesn't attempt to recompile it? i have a heck of a time figuring out what code is run when you (require 'some.ns) so i can't really track it down myself |
| 20:12 | technomancy | amalloy: it still checks the timestamps; if the source is newer it will recompile. |
| 20:12 | amalloy | it looks to me like (require 'foo.core) unconditionally involves a call to (load "foo/core.clj") eventually; where's that timestamp check? |
| 20:15 | technomancy | wouldn't surprise me to find it in load |
| 20:15 | technomancy | require is all about translating symbols to paths and preventing unnecessary reloads |
| 20:16 | amalloy | ah, it's in c.l.RT/load. i was looking in c.l.RT/loadResourceScript, since that's what people are usually encouraged to use; it doesn't do that check |
| 20:22 | dhm | regarding my previous question about auto reloading a ring app's dependencies, turns out ring-reload-modified is a great solution for that |
| 20:32 | Raynes | Houston, we have documentation http://raynes.github.com/laser/ |
| 20:33 | technomancy | Raynes: you had documentation before too |
| 20:33 | Raynes | technomancy: I don't think I did. |
| 20:33 | Raynes | technomancy: Not pretty html documentation |
| 20:33 | technomancy | I mean before you generated and published the HTML |
| 20:33 | Raynes | technomancy: You're talking about the code, right? |
| 20:34 | technomancy | Raynes: right; just a pet peeve |
| 20:34 | amalloy | i think your big rambling README is more interesting/useful documentation than some html that's autogenerated from the sources |
| 20:34 | technomancy | IMO repl-accessible docstrings and long-form prose are way more important as documentation |
| 20:34 | Raynes | technomancy: So now I can't use when without side efforts or generate documentation? Jesus, I give up. |
| 20:34 | technomancy | Raynes: I'm objecting to your treatment of in-repl docstrings =) |
| 20:34 | technomancy | don't discriminate! |
| 20:35 | Raynes | technomancy: Well, the docstrings are still there. |
| 20:35 | Raynes | Nothing has changed. |
| 20:35 | Raynes | amalloy: I need to make it even bigger with more rambling. |
| 20:35 | technomancy | right; that's what I was getting at; "you had documentation before too" |
| 20:35 | Raynes | I'm going to cause you physical harm. |
| 20:36 | technomancy | sorry I am getting a bunch of snark tossed my way in #git for expressing my wish that the gc operation was documented and am deflecting it over here |
| 20:36 | technomancy | were documented |
| 20:36 | Raynes | wuz |
| 20:36 | amalloy | Raynes: you already have caused him physical harm by claiming docstrings aren't documentation |
| 20:37 | Raynes | I did not claim that. |
| 20:37 | Raynes | I hate you all. |
| 20:37 | technomancy | "Performs a bunch of housekeeping stuff. Don't sweat the details." |
| 20:37 | brehaut | technomancy: pity that goes against git's general philosophy of sweating the details |
| 20:38 | technomancy | (inc brehaut) |
| 20:38 | lazybot | ⇒ 10 |
| 20:39 | amalloy | technomancy: isn't the behavior of gc explained in the --auto option and CONFIGURATION section of that help page? |
| 20:39 | technomancy | amalloy: not really |
| 20:40 | technomancy | amalloy: it says it does two things: repack and prune, but I have a repo with 5MB of loose objects and no unreferenced objects, and a gc brings the size from 1.5GB to 35MB |
| 20:40 | technomancy | so either something else is happening, or the loose objects count is completely bollocks |
| 20:41 | ivan | what size were you expecting? |
| 20:42 | hyPiRion | well, 5 MB less I suppose. |
| 20:42 | amalloy | really, no unreachable objects? how did you get to that state? |
| 20:42 | technomancy | amalloy: well, ~0 |
| 20:43 | technomancy | amalloy: small enough that pruning had no effect on du -hs |
| 20:43 | technomancy | ivan: I'd expect count-objects to show ~1.5 GB of loose objects |
| 20:43 | amalloy | how did you determine 5MB of loose objects? |
| 20:43 | sattvik | Raynes: I'm not sure I'll be able to get to it in the next day or two since I am travelling. tcrawley should also be able to make a new release. |
| 20:43 | technomancy | amalloy: git count-objects |
| 20:44 | ivan | technomancy: but repack compresses tons of nearly-identical text files into one pack |
| 20:44 | ivan | see .git/objects before and after |
| 20:44 | technomancy | ah, because repack is overloaded; it's actually two operations? |
| 20:45 | technomancy | I guess by now I should expect that of git |
| 20:45 | amalloy | technomancy: i think that's the last paragraph of the --auto docs |
| 20:45 | amalloy | ie, it can operate on more than just loose objects |
| 20:46 | Raynes | tcrawley: Make a new release or I hurt you |
| 20:46 | Raynes | I cut you |
| 20:46 | technomancy | yeah, true |
| 20:47 | technomancy | they did tell me in #git that gc.auto is not actually used exactly; it uses an estimate to determine whether it's over the limit, but it's frequently wrong =\ |
| 20:49 | technomancy | hm; I don't think that's it; `git repack -A` actually increases the repo size |
| 20:49 | hyPiRion | I'm not saying I find Raynes threatening at times, but if someone would setup a donation for an anger management therapist to him, I would donate a significant amount of money to it. |
| 20:49 | hyPiRion | Clojure need healthy developers. |
| 20:49 | Raynes | I could probably use some anger management |
| 20:50 | dhm | I mean some people make the anger work for them. Like Rambo. |
| 20:50 | neilmock | damnit, I came to clojure to avoid the anger of ruby |
| 20:51 | technomancy | yeah, gc must be doing some other undocumented operation |
| 20:51 | hyPiRion | neilmock: It's only Raynes, everyone else are nice |
| 20:51 | technomancy | awesome |
| 20:51 | technomancy | and the only person who knows how it works in #git has me on ignore |
| 20:51 | neilmock | higher order functions be damned |
| 20:51 | technomancy | because I told him the man page was wrong |
| 20:52 | bbloom | technomancy: that'll teach you to correct people |
| 20:52 | hyPiRion | technomancy: You never tell people that they are wrong. You ask "hey, I see the documentation states X, but I see Y. Is there something I don't understand here?" |
| 20:53 | bbloom | Raynes: I get annoyed when i see API docs with no obvious link back to the README |
| 20:53 | bbloom | mainly b/c i hate API docs.... |
| 20:53 | technomancy | bbloom: I was actually just repeating what someone told me earlier; there was one nice guy in #git, but he went to bed |
| 20:53 | hyPiRion | People hate people correcting them, so better let them "figure" out errors themselves. |
| 20:53 | technomancy | hyPiRion: well this was just after he kept pointing me to the man page |
| 20:54 | brehaut | if someone doesnt like being corrected, they probably shouldnt use IRC |
| 20:54 | hyPiRion | technomancy: Oh, then it's rather fruitless, yeah. |
| 20:54 | bbloom | it's always entertaining how much the attitude of the BDFL for any community influences the tone of that community |
| 20:54 | technomancy | bbloom: sorry, it's done; I'm about to head to dinner =) |
| 20:59 | It_the_zfealian | Raynes, |
| 20:59 | It_the_zfealian | I Worship His Shadow. |
| 23:20 | crease | dnolen: can core.match take arbitrary predicates in the guards? |
| 23:25 | dnolen | crease: yes, :when is restricted, :guard is not |
| 23:25 | crease | dnolen: cool, thanks. |
| 23:50 | dnolen | gfredericks: hey the core.logic version of 4clojure is cool! :D |
| 23:50 | tcrawley | Raynes: sattvik: sure thing! I'll do a release tomorrow morning. FIRST THING |
| 23:51 | Raynes | Excellent, sir. |
| 23:51 | tcrawley | *phew* |