2015-07-16
| 00:02 | TEttinger | ,(boolean 0) |
| 00:02 | clojurebot | true |
| 00:02 | TEttinger | ,(boolean (/ 0.0 0.0)) |
| 00:02 | clojurebot | true |
| 00:02 | TEttinger | ,(if Double/NaN true "wat") |
| 00:02 | clojurebot | true |
| 00:07 | whomp | is traversal of a set as a sequence deterministic? |
| 00:25 | tomjack | whomp: I _think_ (= (seq xs) (seq xs)), but definitely not necessarily (if (= xs ys) (= (seq xs) (seq ys))) |
| 00:36 | vas | So I want to make a "remember which page the user requested and forward them after they log in" feature |
| 00:39 | H4ns | vas: popular solutions include including the original url in the login form as hidden parameter, in a query parameter of the login page, using an extra cookie or storing the url in the user's session if you already have session tracking set up at that point. |
| 00:40 | vas | H4ns: thank you so very much. My login system is a bit different in that a user just gives me their email and I send them a login link which they must click to login. I'm going to try setting a session variable and see if that does the trick (assuming the user uses the same browser for both accesses)... perhaps it makes sense to encode it into the login link. |
| 00:42 | H4ns | vas: a session variable is unlikely to work unless you have persistent sessions and can refer to them through the url that you send out. i'd just use a parameter in the url. |
| 00:44 | H4ns | vas: ah, i did not read carefully. anyway, an extra parameter will be more robust. you could also store the "initial url" in the user's record in the database if you want to avoid the extra parameter. |
| 00:49 | vas | H4ns: Thanks, that makes sense. I think I'll just tag it onto the link. I'm avoiding database reads/writes by just checking a hash in the provided link/URL instead of reading to see if the user has the credentials so avoiding a db read would be in keeping with that. |
| 00:50 | vas | H4ns: there is an initial read to make sure the user has the right privs and all when they request a link, but the handler just checks a hash (which can only be received with proper creds). ... dunno if i explained that well enough but you might get the picture |
| 00:52 | crocket | Hello clojour guys |
| 00:52 | crocket | multimethod rocks. |
| 00:52 | crocket | It lets me code polymorphic behaviors without types. |
| 00:57 | vas | H4ns: anyway, thanks for your help :D |
| 00:57 | H4ns | vas: yw |
| 01:12 | bcham | Can someone help me? |
| 01:12 | bcham | I can't seem to find why these two functions aren't equivalent |
| 01:13 | bcham | (defn clean-code [class-name] |
| 01:13 | bcham | #((html/wrap :pre) (html/wrap :code '{class (str "src" class-name)}) (html/text %))) |
| 01:13 | bcham | (defn clean-code [class-name] |
| 01:13 | bcham | (fn [x] ((html/wrap :pre) ((html/wrap :code '{:class (str "src " class-name)}) (html/text x))))) |
| 01:13 | bcham | why aren't those equivalent? |
| 01:21 | crocket | bcham, Do you want (= f1 f2) to return true? |
| 01:22 | bcham | I get an arity issue when I use the first one in another function, but not if i use the second function |
| 01:22 | crocket | Plus, your functions are awfully difficult to read. |
| 01:22 | bcham | and I can't seem to figure out why. |
| 01:22 | bcham | baby steps crocket :) |
| 01:23 | bcham | I don't want to functions themselves to be equal, rather i want what they do to be equal. |
| 01:24 | crocket | They are not equal |
| 01:25 | bcham | empirically I know that, I'm wondering why. |
| 01:25 | crocket | bcham, I formatted those functions in emacs clojure-mode, and I got http://dpaste.com/1KTZV06 |
| 01:25 | crocket | They are not equal. |
| 01:25 | crocket | You got parens wrong. |
| 01:26 | crocket | Also, there are other differences. |
| 01:26 | crocket | You should look for differences. |
| 01:26 | bcham | what's the hot key to format in clojure-mode? |
| 01:26 | bcham | I will thank you. |
| 01:26 | crocket | bcham, tab |
| 01:27 | crocket | bcham, You should seriously learn emacs. |
| 01:27 | bcham | I use emacs |
| 01:27 | crocket | I don't think you use emacs effectively. |
| 01:28 | crocket | By the fact that you don't know how to use TAB in emacs, I think you're a newbie. |
| 01:28 | bcham | I am. |
| 01:28 | amalloy | crocket: this is not very welcoming behavior |
| 01:28 | crocket | And, you should use a pastebin to paste codes. |
| 01:29 | bcham | Thank you for the feedback, as I sated above. I'm just learning. "Baby steps" means I don't know what I'm doing, and am trying to figure it out. |
| 01:30 | amalloy | bcham: you're doing just fine. do keep in mind refheap.com for pasting larger snippets in future |
| 02:11 | crocket | How do I call a function whose symbol obtained by (symbol "log" "info")? |
| 02:12 | H4ns | if you're thinking clojure.tools.logging/log, then that is a macro and cannot be called. |
| 02:12 | crocket | no |
| 02:13 | crocket | It's taoensso.timber/info |
| 02:13 | crocket | (require '[taoensso.timber :as log]) |
| 02:14 | rpaulo_ | is there any lisp language that you can compile and deploy? |
| 02:14 | TEttinger | rpaulo_: sorta an odd question, what do you mean by deploy? |
| 02:14 | rpaulo_ | I'm looking for something small that can be run standalone on a server |
| 02:15 | H4ns | crocket: ((resolve (symbol "log" "info")) [arg]) |
| 02:15 | rpaulo_ | i.e., without installing the actual VM (it would be bundled in the file) |
| 02:15 | TEttinger | small as in language or small as in installation requirements? |
| 02:16 | rpaulo_ | installation requirements |
| 02:16 | TEttinger | there are almost certainly Common Lisp implementations that produce somewhat small binaries. there's more work done at the embedded-ish hardware field with Scheme variants than Common Lisp ones. |
| 02:17 | rpaulo_ | scheme would work too |
| 02:17 | TEttinger | I'd look into Chicken Scheme and maybe Gambit Scheme |
| 02:17 | TEttinger | I'm no expert there though |
| 02:17 | rpaulo_ | nice, thanks |
| 02:27 | crocket | H4ns, good |
| 02:55 | crocket | http://dpaste.com/2G6Y88A is a config file for DDNS client I'm writing. |
| 02:56 | crocket | I want a function named update! to behave differently according to provider name. |
| 02:56 | crocket | How should I implement it? |
| 02:56 | H4ns | so you're doing the resolve/symbol thing to log at the correct level? sounds gross. |
| 02:56 | crocket | Protocol + record, multimethod, or ??? |
| 02:56 | lazybot | crocket: How could that be wrong? |
| 03:00 | crocket | hmm.... |
| 03:00 | crocket | Currently, it separates provider name from config. |
| 03:00 | crocket | This justifies passing two arguments to a multimethod. |
| 03:07 | crocket | https://github.com/crocket/clj-ddns-client/blob/master/src/clj_ddns_client/providers/dnsever.clj#L28 |
| 03:07 | crocket | I feel that this is wrong. |
| 03:08 | crocket | Why should I have to pass the name of provider to a log function? |
| 03:08 | crocket | I shouldn't have to |
| 03:19 | crocket | Ok, this is ok. |
| 04:09 | crocket | Wow |
| 04:10 | crocket | Is there an eager version of map? |
| 04:12 | crocket | (doall (map... |
| 04:40 | crocket | Do you usually avoid dynamic vars? |
| 04:49 | magnars | crocket: if you want an eager map, you could use mapv - but maybe you are doing side-effects and should look at doseq? |
| 05:37 | Pupeno | Is it possible to somehow resolve a symbol to the namespace it is located in lexically, and not dynamically? Inside the namespace korma.db I'm doing this (ns-resolve 'korma.db (symbol protocol)) and I would like not to have to repeat myself with korma.db there. |
| 05:42 | oddcully | Pupeno: just `resolve`? |
| 05:43 | Pupeno | oddcully: that resolves to the current dynamically scoped namespace, not the lexically one. |
| 05:44 | Phoh4ang | So I've tried clojurescript with figwheel+cider and it's totally awesome, everything works, super cool! But now I want to have not only cljs repl, but the clojure one too. I'm not sure how can I get one more repl buffer in cider without starting another jvm process. Can anybody give a direction? |
| 05:45 | Phoh4ang | Pupeno: there is no such thing as "lexical namespace". I guess you are writing macro; google about &env and &syms hidden arguments. |
| 05:46 | Pupeno | Phoh4ang: no, I'm not writing a macro, I'm calling a function by having the name on a string. Since there's no lexical namespace, I'll have to hard-code it. |
| 05:47 | Phoh4ang | Pupeno: I'm not sure what do you mean... So you have to call a function by its name given as a string, and the function is defined in a let block? |
| 05:47 | Phoh4ang | So (let [foo (fn ...)] (magic "foo")) something like this? |
| 05:47 | Pupeno | Phoh4ang: no, the function is a top level function in the namespace 'korma.db. |
| 05:48 | Phoh4ang | Pupeno: well then you don't need anything "lexical" at all, just use ns-resolve or whatever. |
| 05:49 | Pupeno | Phoh4ang: well, with ns-resolve I have to specify the namespace 'korma.db when this function I'm writing is already in the 'korma.db namespace and I was hopping to be able to infer it (so that for example, if the name of the namespace changes, it doesn't break). |
| 05:50 | Phoh4ang | Pupeno: eh, what's wrong with just `resolve` then? |
| 05:51 | Pupeno | If I'm in namespace foo.bar and I call korma.db/db-uri and db-uri evaluates (resolve :func), it evaluates to foo.bar/funk, not korma.db/func. I want korma.db/func. |
| 05:51 | Pupeno | (db-uri is the function I'm writing) |
| 05:52 | Phoh4ang | Ah, you have a function, not a macro, right. Well just save the *ns* somewhere when you defining your function. |
| 05:52 | Phoh4ang | Like (let [my-ns *ns*] (defn my-fn ...)) or something similar. It should work, if I undestand thing correctly. |
| 05:57 | Phoh4ang | Pupeno: yep, just quickly checked it: https://www.refheap.com/106617 that's what you want, right? |
| 05:57 | Pupeno | Phoh4ang: yes. |
| 05:58 | Pupeno | Phoh4ang: I don think the loss in readability of having a defn inside a let is not worth the gains in the case the namespace name changes or something like that. |
| 05:59 | Pupeno | Phoh4ang: but it does answer my question. |
| 05:59 | Phoh4ang | Pupeno: well, having defn inside a let doesn't reduce readibility at all in my opinion. |
| 06:00 | Pupeno | I can see that. I'm contributing to someone else's code, so I'm trying to stay as readable and clean as possible |
| 06:02 | Phoh4ang | Oh, I see. Actually it's kinda interesting. I can't imagine why such weird thing with all that resolving stuff is required. |
| 06:04 | Pupeno | Phoh4ang: in korma.db there's a set of functions named after database protocol, postgres, mysql, oracle, etc. They enhance a database connection specification with some sane defaults. I'm making a function that takes a jdbc uri (instead of a hashmap with user, pass, host, db, port, etc) and calls the appropriate function, mysql, postgresql, etc. So I'm extracting the name of the function I'm calling from the jdbc uri: ht |
| 06:04 | Pupeno | tps://gist.github.com/pupeno/bc0363f61e0da2d73da4 |
| 06:09 | Phoh4ang | Pupeno: hm, I see. That makes sense, though imho it would be somewhat clearer to explicitly define these functions with a special macro which would maintain a map of strings->functions. |
| 06:09 | Phoh4ang | On the other hand, less code is better. |
| 06:21 | Akshay | why clojure not lisp |
| 06:21 | Akshay | ?? |
| 06:21 | lazybot | Akshay: What are you, crazy? Of course not! |
| 06:21 | clojurebot | BOT FIGHT!!!!!111 |
| 06:25 | loke | Note that Akshay just asked the opposite thing on #lisp |
| 06:25 | oddcully | what was the bot response there? |
| 06:28 | loke | oddcully: No bot response. |
| 06:28 | ronh | <loke> There are no benefits to clojure compared to Lisp |
| 06:28 | loke | Yep |
| 06:28 | oddcully | then clojure wins clearly in terms of bot hilarity |
| 06:28 | loke | oddcully: Indeed |
| 06:28 | loke | I somewhat intentionally fed the troll |
| 06:29 | tdammers | bot hilarity is strictly the most important factor in a programming language's success |
| 06:29 | loke | tdammers: the #lisp bot used to do meme quotes |
| 06:29 | loke | Like doge |
| 06:29 | H4ns | back in the day, when it still worked |
| 06:29 | loke | Since it doesn't do that anymore, I guess that's the death of lisp :-( |
| 06:31 | tdammers | death of lisp... not again... |
| 06:34 | loke | tdammers: None of us want that, I think. Therefore the #lisp bot must immediately be fixed. |
| 06:34 | H4ns | loke: you can discuss #lisp's problems in #lisp, i guess :) |
| 06:34 | loke | H4ns: Yes |
| 06:35 | loke | H4ns: But you'd kick me if I did :-) |
| 06:35 | H4ns | loke: i got no ops and with my temper, it is good that way |
| 06:48 | crocket | less is better |
| 07:14 | crocket | Does anyone know a good clojure logging library than timbre? |
| 07:14 | crocket | Does anyone know any other good clojure logging library than timbre? |
| 07:14 | crocket | timbre doesn't have a decent rolling appender. |
| 07:17 | oddcully | unilog? |
| 07:21 | crocket | unilog? |
| 07:22 | crocket | unilog uses logback. |
| 07:22 | crocket | an uberjar would have to include logback as well. |
| 07:33 | crocket | So, I'd have to choose between small and big. |
| 07:40 | xificurC | yesterday I got a recommendation for fighweel and react from justin_smith. Can anyone point me to some nice guide to cljs in general and possibly these libs? I did clojure for a couple of months when it was 1.3 so I'm not completely clueless, but not up to speed either |
| 07:41 | kwladyka | if i want to do random test x times should i use "dorun" or is there something better? |
| 07:43 | oddcully | xificurC: have you seen the figwheel quickstart? https://github.com/bhauman/lein-figwheel/wiki/Quick-Start |
| 07:45 | oddcully | xificurC: there are lots of libs around react (om, reagent, rum, ...) |
| 07:45 | oddcully | xificurC: also clojurescript has it's own irc channel - just fyi |
| 07:49 | xificurC | oddcully: no I haven't, and that actually links to a quick start for cljs as well, thanks |
| 07:58 | kwladyka | https://www.refheap.com/3fc8e81c4cf03e0631232fb53 - how to run this test x times? The problem is when i do (dorun x (deftest)) or (deftest foo (dorun x (testing))) etc. it wouldn't work because deftest has to be first and is has to be first in testing etc. |
| 08:14 | noncom | kwladyka: what? |
| 08:15 | noncom | kwladyka: can you describe more? i don't get your question |
| 08:15 | kwladyka | noncom, i want run this test x times, how to do that? |
| 08:15 | kwladyka | it is random test so i want run it more then once |
| 08:16 | kwladyka | and it is not so simple as it looks :) |
| 08:17 | noncom | kwladyka: are you using this? https://clojuredocs.org/clojure.test/deftest |
| 08:18 | kwladyka | noncom, as i shown https://www.refheap.com/3fc8e81c4cf03e0631232fb53 |
| 08:18 | noncom | so, yeah |
| 08:18 | kwladyka | the problem is about "is" in tests |
| 08:18 | kwladyka | because of java.lang.IllegalArgumentException: Don't know how to create ISeq from: java.lang.Boolean |
| 08:19 | kwladyka | this exception occur when somebody is between is and testing or between testing and deftest |
| 08:19 | noncom | can you post full stack trace? |
| 08:19 | kwladyka | "is" has to be always just behind "testing" or "deftest" |
| 08:20 | kwladyka | noncom, https://www.refheap.com/e18f0703e8291bc76681dcc15 |
| 08:20 | kwladyka | *somebody - something |
| 08:21 | kwladyka | you can do this in repl, just change my code to anything else, even (= 1 1) |
| 08:21 | kwladyka | and try do it 5 times |
| 08:25 | kwladyka | maybe what i am trying to do is impossible with clojure.test and i have to use additional library like test.check |
| 08:25 | kwladyka | but honestly i dont want in this case |
| 08:30 | m-erger | is closure a good first language? |
| 08:30 | kwladyka | mmm but maybe i will do (for) or something like that in condition and i will return list of true/false.... i don't see better solution |
| 08:31 | kwladyka | m-erger, i don't know. I am not sure somebody try. It is still new technology :) |
| 08:32 | kwladyka | m-erger, i think it is like question about is it better to start play on violin or guitar or something like that |
| 08:32 | wasamasa | m-erger: closure is a concept, not a language |
| 08:32 | noncom | m-erger: from me, i'd say "yes" |
| 08:33 | noncom | kwladyka: hmmm, honestly i never used the testing framework... |
| 08:33 | noncom | kwladyka: so, you need to run this very test like 100 times and get the 100 results, right? |
| 08:34 | kwladyka | wasamasa, i guess it is misspell and he wanted write clojure? |
| 08:34 | kwladyka | noncom, yes |
| 08:35 | kwladyka | first i wanted to run test x times, but now i see only one solution using clojure.test is return '(true true true true true ....) to check condition |
| 08:35 | kwladyka | it is still good but no so elegant :) |
| 08:36 | kwladyka | just it makes code more unreadable |
| 08:37 | m-erger | closure is a concept? |
| 08:38 | oddcully | m-erger: cloJure vs cloSure |
| 08:38 | noncom | m-erger: https://en.wikipedia.org/wiki/Closure_(computer_programming) |
| 08:40 | kwladyka | which function works like (for [x (1 2 3 4 5)] body) but like (f 5 body)? I mean i want this function to return results like for, but i don't need input as x |
| 08:41 | kwladyka | i can't find function like this, maybe is it just doesn't exist? :) |
| 08:43 | lumafi_ | how about repeatedly |
| 08:43 | noncom | repeatedly, yes |
| 08:45 | kwladyka | (repeat x body) :) |
| 08:50 | kwladyka | so if somebody is interested in it is my solution https://www.refheap.com/106622 |
| 08:50 | kwladyka | i am not repeating tests, but i am repeating the condition |
| 08:51 | kwladyka | i don't see any other way |
| 08:59 | tgoossens | is it possible (not just plain JavaCompiler) in clojure to take clojure code and compile it |
| 08:59 | tgoossens | and how? |
| 09:01 | tgoossens | as far as I understand clojure |
| 09:01 | tgoossens | this should be extremely easy |
| 09:01 | puredanger | call the http://clojure.github.io/clojure/clojure.core-api.html#clojure.core/compile function |
| 09:02 | tgoossens | -.- |
| 09:02 | tgoossens | thanks puredanger |
| 09:02 | puredanger | most build tools have a way to ahead-of-time (AOT) compile many source files |
| 09:05 | tgoossens | puredanger, What I actually am going to do is (using instaparse) to convert a DSL into clojure code wich then needs to be compiled to a java class |
| 09:05 | tgoossens | *which |
| 09:06 | puredanger | I presume you have requirements that rule out the option of gen-class ? |
| 09:07 | tgoossens | not that I'm aware of |
| 09:07 | tgoossens | (yet) |
| 09:07 | tgoossens | that might be a good idea actually |
| 09:08 | puredanger | well depends on your process a bit but it's effectively a Clojure DSL to generate Java classes |
| 09:08 | kwladyka | is function like repeatedly but without lazy-seq? |
| 09:08 | puredanger | but it can't do everything |
| 09:08 | kwladyka | i don't wont unnecessary (take x) |
| 09:08 | tgoossens | puredanger, thanks for the hint :) |
| 09:08 | kwladyka | i just want something like (repeatedly 5 f) |
| 09:09 | tgoossens | puredanger, now i'm going to try and figure out how to take a string of generated clojure code and use core.compile on it |
| 09:09 | kwladyka | or in another words something like (for [x (range 5)] body) but (for 5 body) |
| 09:10 | kwladyka | what i did last time when i asked doesn't work |
| 09:10 | kwladyka | so problem coming back :) |
| 09:11 | snowell | kwladyka: repeatedly takes an optional length arg |
| 09:11 | snowell | So (repeatedly 5 f) should work |
| 09:11 | puredanger | loop? |
| 09:11 | clojurebot | loop is https://www.refheap.com/90332 |
| 09:11 | kwladyka | snowell, thx! |
| 09:12 | kwladyka | puredanger, loop is not the same, because it return values in another way |
| 09:14 | puredanger | if you're collecting results in addition to running side-effecty functions, you should look at run! (new in 1.7) |
| 09:14 | puredanger | actually I guess you can't return results with run! |
| 09:15 | puredanger | but you could get similar eager return with reduce |
| 09:17 | fourq | Anyone here know the answer to Anna's clojure question posted on Twitter? I'm curious too. https://twitter.com/AnnaPawlicka/status/621667387847348224 "#clojure folks, why isn't x cleared when it’s a number in a ^:once-decorated function, but is for strings & keywords? " |
| 09:18 | Bronsa | fourq: Herwig responded |
| 09:18 | fourq | Is that the answer? |
| 09:18 | kwladyka | huh so who can explain this magic ? https://www.refheap.com/b41e5a2b51028306dbefb883d for [x (range 3)] works but repeatedly 3 throw exception |
| 09:18 | Bronsa | fourq: only Objects can be set to null, x is a primitive long in that binding |
| 09:18 | fourq | he said "i bet" |
| 09:18 | kwladyka | ClassCastException java.lang.Boolean cannot be cast to clojure.lang.IFn clojure.core/repeatedly/fn--4750 (core.clj:4716) |
| 09:19 | Bronsa | fourq: well that's the right answer anyway :) |
| 09:19 | kwladyka | so magic :) |
| 09:19 | fourq | =) |
| 09:19 | fourq | thanks Bronsa |
| 09:20 | snowell | kwladyka: Try putting a # before the call to make it an anonymous function. |
| 09:21 | snowell | Right now it's using the return value, where repeatedly needs a Fn |
| 09:21 | kwladyka | snowell, oh.... |
| 09:22 | kwladyka | snowell, thx |
| 09:23 | kwladyka | i need a brake |
| 09:31 | kaiyin | how can i `lein deploy clojars` without entering password every time? |
| 09:32 | tcrawley | kaiyin: take a look at https://github.com/technomancy/leiningen/blob/master/doc/DEPLOY.md#gpg |
| 09:54 | kaiyin | tcrawley: thanks! |
| 10:18 | kwladyka | what is the best way to not pass all the time the same parameters to all functions? i have parameter cols and rows which mean number of columns and number of rows. I need this information in almost every function in namespace. Should i use ref or atom or something like that or another solution? |
| 10:19 | snowell | You could always (defonce cols 8) at the top of the ns |
| 10:19 | snowell | Who doesn't like a good global variable? :D |
| 10:20 | kwladyka | snowell, but rows and cols are not constant |
| 10:20 | snowell | Ha, oh... |
| 10:21 | kwladyka | i have to operate on board |
| 10:21 | kwladyka | but board can have different dimension each time |
| 10:21 | kwladyka | but i have many operations on each board and each operation need to know about size of this board |
| 10:21 | snowell | You can probably make a Board object with things like deftype and just pass that around |
| 10:22 | snowell | Having no experience with that sort of thing in clojure, however, I will defer to others :) |
| 10:22 | kwladyka | but still in all function i need to add additional parameter, i am not sure it is good way |
| 10:22 | kwladyka | or maybe it is |
| 10:23 | kwladyka | i have this code to remember terminal size: |
| 10:23 | kwladyka | (def terminal-size (ref [0 0])) |
| 10:23 | kwladyka | (defn handle-resize [cols rows] |
| 10:23 | kwladyka | (dosync (ref-set terminal-size [cols rows]))) |
| 10:23 | kwladyka | and maybe it is good idea to remember board size |
| 10:23 | kwladyka | or maybe i shouldn't do that and i should pass this as parameter |
| 10:24 | kwladyka | i am not sure how looks the best practice |
| 10:24 | snowell | I might consider using deftype to define a Board, with cols and rows fields |
| 10:24 | snowell | Then you can pass the Board into your function and read the cols and rows from it |
| 10:25 | snowell | Differently-sized boards would then just be separate Board objects |
| 10:25 | kwladyka | and also i have to pass iteration, because i draw many boards on screen and i have to know which one it is |
| 10:25 | kwladyka | and again i have to pass to all functions additional parameter |
| 10:26 | kwladyka | but maybe it is like it should be |
| 11:04 | justin_smith | kwladyka: the error you got with the test was not related to testing or is or deftest, it is some issue with your code https://www.refheap.com/106627 |
| 11:05 | kwladyka | justin_smith, the problem wasn't about that |
| 11:05 | justin_smith | kwladyka: also, you can run is inside a doseq or loop |
| 11:05 | kwladyka | but it is solved anyway |
| 11:05 | justin_smith | OK |
| 11:06 | kwladyka | justin_smith, hmm i tried with (dorun 5 (is)) and it didn't work |
| 11:06 | kwladyka | but maybe i did some mistake |
| 11:10 | justin_smith | kwladyka: that's not how dorun works... |
| 11:10 | kwladyka | 5 |
| 11:11 | justin_smith | kwladyka: test updated to use totimes to run is 100 times https://www.refheap.com/106627 |
| 11:11 | justin_smith | *dotimes |
| 11:12 | kwladyka | oh yes dotimes not dorun, sorry i have mess in my head after all day |
| 11:12 | kwladyka | but for me it wasn't work... mmm so good to know it works |
| 11:17 | kwladyka | justin_smith, hmm and why it doesn't work with dorun? Is any function works like dotimes but without x? (dotimes [x 5]) - i know i can use _ |
| 11:18 | kwladyka | it didn't work because i was trying use dorun... |
| 11:18 | justin_smith | kwladyka: dorun is a function that forces a lazy value without holding onto the results |
| 11:18 | justin_smith | that is all it does |
| 11:18 | justin_smith | ,(dorun (map inc (range 100))) |
| 11:18 | clojurebot | nil |
| 11:18 | justin_smith | ,(dorun (map inc (range 1000000000))) |
| 11:19 | clojurebot | eval service is offline |
| 11:19 | kwladyka | oh... |
| 11:19 | justin_smith | that timed out |
| 11:19 | justin_smith | because it was evaluating every inc |
| 11:22 | kwladyka | do you have maybe any idea can i find font with size NxN (square)? I need that for console to draw board |
| 11:23 | justin_smith | kwladyka: quick google finds this http://www.dafont.com/theme.php?cat=301 |
| 11:23 | kwladyka | yeah but i didin't mention as default system font :) |
| 11:24 | justin_smith | kwladyka: what system? |
| 11:24 | kwladyka | every :) |
| 11:24 | justin_smith | that's a really tall order |
| 11:24 | kwladyka | i need only numbers, Q, K, B, N, B letter |
| 11:24 | kwladyka | and space |
| 11:25 | kwladyka | i know :) |
| 11:25 | justin_smith | wouldn't it just be easier to make some tiles and use those instead of a font? |
| 11:25 | kwladyka | but my purpose is to have board to be square on screen |
| 11:26 | kwladyka | justin_smith, i use clojure-lanterna |
| 11:26 | kwladyka | i don't know any better solution |
| 11:30 | kwladyka | i don't know any better solution to draw in console board |
| 11:31 | kwladyka | chess board exactly |
| 11:33 | justin_smith | and you control the font of the console? |
| 11:34 | kwladyka | justin_smith, yes it has option to set font http://sjl.bitbucket.org/clojure-lanterna/reference/#font-names |
| 11:35 | justin_smith | oh, it launches a new terminal window, you could do it that way, of course :) |
| 11:35 | kwladyka | this is just to be good if i achieve square but it is not the main problem |
| 11:36 | justin_smith | at first I thought that meant it was somehow changing the font from inside the terminal (which afaik is not possible) |
| 11:37 | kwladyka | but still i don't know how to draw square board :) |
| 11:37 | kwladyka | because font is not square |
| 11:39 | kwladyka | but... maybe it is just mission impossible :) |
| 11:39 | TimMc | mission improbable |
| 11:40 | justin_smith | TimMc: cue theme music. Zoom in on man in black, climbing down a rope, to buy a lottery ticket. |
| 11:42 | TimMc | "The Terms and Conditions, should you choose to accept them..." |
| 11:42 | justin_smith | rofl |
| 11:43 | kwladyka | i need definitely break, going train Wing Tsun. See you later! :) |
| 11:46 | sdegutis | Hello. This is my question. Is Instaparse suitable for parsing an INI file. Thank you for your time. Good bye. |
| 11:46 | blkcat | um |
| 11:48 | wasamasa | this is even weirder than that guy's requests over at #emacs |
| 11:48 | hellofunk | clj ninja: two maps, same keys. want new map containing only keys where value is different, always using the second map's values where applicable. what's a good one-liner to do this? |
| 11:53 | oddcully | the ninja disqualifies me, but i'll give it a shot ,(into {} (let [old {:a 1 :b 2} new {:a 1 :b 3}] (filter (fn [[k v]] (not (= (k old) v))) new))) |
| 11:55 | justin_smith | oddcully: that's better than mine was going to be |
| 11:57 | hellofunk | oddcully: was hoping for something even more elgant. i asked because i too come up with these little monsters |
| 11:58 | hellofunk | where is amalloy when you need him |
| 11:58 | justin_smith | ,(first (reduce (fn [[m' m] [k :as e]] (if (= (find m k) e) m' (conj m' e))) [{} {:a 0 :b 1 :c 2}] {:a 0 :b 1 :c 3}) |
| 11:58 | clojurebot | #<RuntimeException java.lang.RuntimeException: EOF while reading> |
| 11:58 | justin_smith | err |
| 11:58 | hellofunk | glad to know this simple task requires much verbosity from others than just me :) |
| 11:59 | sdegutis | Does anyone know whether this is the case or not. Thank you. |
| 12:00 | ambrosebs | hellofunk: tried clojure.data/diff ? |
| 12:00 | amalloy | (into {} (remove (set m1) (select-keys m2 (keys m1))))? |
| 12:01 | amalloy | ,((fn [m1 m2] (into {} (remove (set m1) (select-keys m2 (keys m1))))) {:a 1 :b 2} {:a 1 :b 3}) |
| 12:01 | clojurebot | {:b 3} |
| 12:01 | justin_smith | ,(let [m {:a 0 :b 1 :c 2}] (reduce (fn [m' [k :as e]] (if (= (find m k) e) m' (conj m' e))) {} {:a 0 :b 1 :c 3})) |
| 12:01 | hellofunk | amalloy: since both maps will always have same keys, select-keys is probably unnecessary? |
| 12:01 | clojurebot | {:c 3} |
| 12:01 | amalloy | oh, same keys |
| 12:02 | amalloy | then sure |
| 12:02 | sdegutis | I am finding it difficult to get started with a sample of Instagram. |
| 12:02 | sdegutis | Thanks in advance. |
| 12:02 | hellofunk | amalloy wins |
| 12:02 | sdegutis | I mean Instaparse. |
| 12:02 | crocket | Why does clojure say "clojure.lang.Symbol cannot be cast to clojure.lang.IPersistentVector" when it compiles https://www.refheap.com/106630 ? |
| 12:02 | amalloy | (into {} (remove (set m1) m2)) |
| 12:02 | hellofunk | amalloy: totally awesome. i knew it was out there |
| 12:02 | hellofunk | (inc amalloy) |
| 12:02 | amalloy | ,(disj {1 2} [3 4]) |
| 12:02 | lazybot | ⇒ 287 |
| 12:02 | clojurebot | #error {\n :cause "clojure.lang.PersistentArrayMap cannot be cast to clojure.lang.IPersistentSet"\n :via\n [{:type java.lang.ClassCastException\n :message "clojure.lang.PersistentArrayMap cannot be cast to clojure.lang.IPersistentSet"\n :at [clojure.core$disj invoke "core.clj" 1452]}]\n :trace\n [[clojure.core$disj invoke "core.clj" 1452]\n [sandbox$eval101 invoke "NO_SOURCE_FILE" 0]\n [cloj... |
| 12:03 | hellofunk | amalloy: funny how three of us had these paragraph-long ideas. if there's one thing 4clojure has taught me, there is almost always a simple expression for stuff like this |
| 12:04 | wasamasa | sdegutis: well, it requires you to already know the theory behind parsing |
| 12:04 | sdegutis | Thank you. |
| 12:04 | wasamasa | sdegutis: perhaps you find it easier to get into https://github.com/youngnh/parsatron |
| 12:04 | crocket | Help |
| 12:05 | sdegutis | I have a simple INI file. |
| 12:05 | sdegutis | Please if you know how these two libraries compare in terms of community mentality. |
| 12:05 | crocket | Ah... |
| 12:05 | sdegutis | wasamasa: Thank you in advance, best regards. |
| 12:06 | wasamasa | sdegutis: the former does a lot more than the latter |
| 12:06 | wasamasa | sdegutis: basically it supports every approach to parsing you'd encounter in the wild |
| 12:06 | sdegutis | wasamasa: I only need to parse a simple INI format. So it sounds like the latter might be suitable. However if it is completely terrible, and everybody hates it, that might be a problem. |
| 12:06 | wasamasa | sdegutis: while the latter does recursive-descent parser combinators only |
| 12:06 | crocket | I should surround an anonymous function in parentheses in -> |
| 12:07 | sdegutis | I admire that it uses ClojureScript however this is not a feature I have absolutely any need for. So if this is the primary target of this library then we have differing philosophies and thus should part ways. |
| 12:07 | sdegutis | Thank you. |
| 12:08 | wasamasa | wat |
| 12:08 | wasamasa | could you please drop this superfluous speak, this isn't email |
| 12:09 | wasamasa | asides from that, I find it very hard to believe there's no existing library for parsing ini files: https://clojars.org/search?q=ini |
| 12:09 | sdegutis | I do not really have an INI file, it is very similar though. It is a custom text based format that we employ and which is very similar to INI format and simply has a defined text-based format. |
| 12:10 | sdegutis | It has a simple specification, mostly using newlines for delimiters, but at one well-defined point also using brackets. |
| 12:10 | sdegutis | Our CEO asked me originally to just use an Excel file as the format but I had to explain why this was not an appropriate idea. |
| 12:12 | sdegutis | It might even be simple enough to use simple Clojure sequence processing to transform it. However this is not strictly a good idea and thus I want to use some technique and/or methodology that is quite a bit more appropriate. |
| 12:12 | sdegutis | However that is why I have considered Instaparse and now Parsatron. |
| 12:12 | sdegutis | Thank you for your advice and continued help. |
| 12:13 | wasamasa | have fun learning parsing theory then |
| 12:13 | sdegutis | This person suggests that Parsatron is dead: https://twitter.com/kurisuwhyte/status/382699042938974208 |
| 12:13 | wasamasa | suuure |
| 12:14 | wasamasa | that must be why I had to extend its grammar for a work project |
| 12:14 | sdegutis | That does make sense. |
| 12:15 | sdegutis | wasamasa: I may be able to come up with an EBNF grammar, will that suffice for this? |
| 12:15 | sdegutis | Thanks in advance. |
| 12:17 | wasamasa | sdegutis: if you get it perfectly right the first time, yes |
| 12:19 | sdegutis | Thank you. |
| 12:24 | sdegutis | How do you specify "any alphanumeric, punctuation, or whitespace character except newline"? |
| 12:24 | sdegutis | In other words "any printable character except newline" in Instaparse? |
| 12:25 | blkcat | have you considered using a regex? |
| 12:28 | wasamasa | lol, you write parsers *because* you're doing something better than merely using regex |
| 12:28 | wasamasa | anyhow, I'm out as this is as far as my knowledge on the topic goes |
| 12:28 | blkcat | haha, that's fair :P |
| 12:37 | sdegutis | blkcat: that might be appropriate |
| 12:37 | Shayanjm | Does anyone here have implementation experience in quantum computing? |
| 12:39 | sdegutis | I don't think that's a real thing yet. |
| 12:39 | sdegutis | I think it's mostly theoretical. |
| 12:39 | justin_smith | Shayanjm: gfredericks has done some qc related projects |
| 12:39 | Shayanjm | sdegutis: nah there are tons of quantum simulators |
| 12:39 | sdegutis | Oh. |
| 12:40 | justin_smith | Shayanjm: simulator related, of course |
| 12:40 | sdegutis | Brb writing Clojure instead of Haskell or JavaScript. |
| 12:40 | Shayanjm | justin_smith: great, thanks. I'm trying to build my own simulator on clj |
| 12:40 | tolstoy | Is there a way to make lein use the latest clojure when running outside a project context? |
| 12:40 | Shayanjm | @ gfredericks - would love to pick your brain a little bit when you have a moment |
| 12:40 | justin_smith | Shayanjm: yeah, you could probably start with one of his |
| 12:40 | tolstoy | Corollary: Is leiningen ever going to be updated? |
| 12:41 | Shayanjm | justin_smith: creeping his site, checking out his quantum circuit visualization. Looks really cool |
| 12:43 | sdegutis | I am attempting the following: Str = #'\\w|\\W'+ |
| 12:43 | sdegutis | Please advice. |
| 12:45 | sdegutis | Anyone here prefer Boot over Lein? |
| 12:48 | puredanger | they serve different users imo - for a basic Clojure project, lein is going to satisfy most of your needs for a long while |
| 12:48 | justin_smith | puredanger: who do you see as the target demographic for boot? |
| 12:48 | puredanger | boot is better the more customization you have to do, particularly intermediate file generation type tasks |
| 12:48 | puredanger | most cljs builds can probably benefit from it (I think) and more advanced large-project builds |
| 12:49 | rhg135 | puredanger is correct. I do my plain clj in lein |
| 12:50 | gfredericks | Shayanjm: what's up? |
| 12:50 | hiredman | I disagree |
| 12:50 | puredanger | I'd love to hear your opinion |
| 12:52 | rhg135 | Simpler cljs builds are fine with figwheel imo |
| 12:52 | hiredman | generally, builds are terrible, and javascript builds (for whatever reason) are the worst |
| 12:52 | puredanger | I think the other thing is that lein comes at the problem from the "declarative project model / lifecycle" perspective (like Maven) and boot comes more from an imperative "task" perspective - assembling pipelines of things that are useful for your particular build. |
| 12:53 | puredanger | those might fit different projects and people differently |
| 12:53 | cfleming | I agree that the more complicated the build, the more flexible something like boot will end up being. |
| 12:53 | hiredman | people generally react to that by calling for more tooling, I've already seen people calling for tooling above and beyond boot for wiring together all the cljs build parts |
| 12:53 | hiredman | but the tooling is more strata to dig through when it breaks |
| 12:54 | hiredman | it is terrible |
| 12:54 | sdegutis | I am successfully using Instagram to parse my text file format. |
| 12:54 | rhg135 | I'm hoping for a lein update soon |
| 12:55 | rhg135 | I like my 1.7 |
| 12:56 | sdegutis | Is Clojure 1.7 released then? |
| 12:56 | rhg135 | Yeah |
| 12:57 | hiredman | boot may or may not be good, but I think it's adoption is driven by an need to escape the terribleness of ui builds and a willingness to try anything to do that, without much reflection about if a solution actually solved anything |
| 12:59 | rhg135 | It's better than writing dozens of shell scripts |
| 12:59 | puredanger | I'm looking at it for stuff that has nothing to do with ui and there many things I like about it |
| 12:59 | hiredman | the same impluse behind all the javascript build tools that make it impossible to get a node project up and running from source |
| 13:00 | sdegutis | I had to add this rule: Str = #'.+' |
| 13:01 | rhg135 | It'd be useful for post/pre processing |
| 13:01 | rhg135 | Like js gen or dexing |
| 13:04 | sdegutis | puredanger: Thanks for the comprehensive analysis and comparison of Boot vs Lein. I appreciate it. And it seems very accurate and compatible with my own experience using both and reading their documentations. |
| 13:05 | puredanger | my opinions are still forming on it, so for sure, do your own analysis |
| 13:06 | sdegutis | My understanding is that Lein + a few mainstream plugins are what most Clojure people will use, since they share the common mentality of wanting to as much as possible in Clojure, and letting other libraries and plugins help them with the common cases, such as building dependencies, uploading to EC2, etc. |
| 13:06 | sdegutis | And that Boot is a reaction to this, to try simplifying it when you want more flexibility in any of these steps, which currently is a headache involving creating custom Lein plugins etc. |
| 13:07 | sdegutis | I am a fan of neither and would prefer to just use GNU Make. |
| 13:07 | sdegutis | But alas we're in the Java world here. |
| 13:07 | puredanger | sdegutis: you might want to look at cmma |
| 13:07 | puredanger | https://github.com/ohpauleez/cmma/ |
| 13:07 | puredanger | Paul uses it pretty extensively to manage Clojure apps with make |
| 13:08 | sdegutis | Its README's rhetoric is too vague: cannot tell what it does, and how it's different than anything else. |
| 13:08 | puredanger | it uses make to manage Clojure projects |
| 13:08 | sdegutis | Oh! |
| 13:08 | puredanger | it wraps other build systems (lein, boot, etc) to steal the dep-mgmt parts |
| 13:09 | sdegutis | Ahh crap. |
| 13:09 | sdegutis | Implies: So many JVMs starting and stopping constantly. |
| 13:10 | puredanger | mmm, don't think so? once you grab jars, you have them. no need to do that on every build. |
| 13:10 | sdegutis | Every `lein run` rebuilds my Clj source and runs it. |
| 13:10 | sdegutis | That's where this would come in. |
| 13:14 | slester | Hello hello; I'm sure this channel gets this question frequently, but since I can't use Clojure at work, I'm looking for a project (pref. GPL) to work on. Any suggestions? Sometimes it's a bit opaque how to get started in a community |
| 13:15 | justin_smith | slester: is epl good enough? there isn't much gpl clojure |
| 13:15 | justin_smith | but there is a lot of epl clojure |
| 13:16 | justin_smith | slester: the leiningen project has a tag for issues that would be easy for a newcomer to work on in their github issue tracker |
| 13:17 | justin_smith | It's EPL |
| 13:17 | sdegutis | Is there a better way to write (fn [s & _] s) ? |
| 13:17 | justin_smith | first |
| 13:17 | justin_smith | well, no, not first |
| 13:17 | justin_smith | (comp first list) |
| 13:18 | justin_smith | ,((comp first list) :a :b :c :d :e) |
| 13:18 | sdegutis | I tried `first` at first. |
| 13:18 | clojurebot | :a |
| 13:18 | sdegutis | justin_smith: Thanks. Which way do you think is clearer? |
| 13:19 | justin_smith | sdegutis: probably your version |
| 13:19 | justin_smith | sdegutis: also (apply (comp first list) (range)) goes into a loop, (apply (fn [s & _] s) (range)) returns 0 immediately |
| 13:20 | TMA | sdegutis: if you need a name, in common lisp this function is called prog1 |
| 13:20 | sdegutis | TMA: Thank you. That fully solidifies my distaste for CL. |
| 13:21 | justin_smith | clearly program-one is the right name for it |
| 13:22 | TMA | sdegutis: maybe you shall restructure the solution to avoid the need for such a distasteful function :) |
| 13:22 | slester | justin_smith: whoa, thanks, for some reason my IRC client/internet connection just sent me 20 messages at once |
| 13:23 | justin_smith | slester: yeah, the IRC protocol is kind of weird, things like this are not uncommon |
| 13:23 | slester | justin_smith: and yep, EPL is fine. |
| 13:23 | slester | justin_smith: leiningen seems kind of massive, I'll have a look through its issues though. I do like it a lot and would like to help. |
| 13:24 | justin_smith | another bonus to working on leiningen is that nearly all of us use it |
| 13:24 | justin_smith | which amplifies the warm-fuzzies of contribution |
| 13:24 | slester | a very important part of contribution, if often not spoken of :) |
| 13:24 | sdegutis | TMA: I am interfacing with Instaparse. It is impossible to rework anything. |
| 13:25 | sdegutis | Oops. It's actually (fn [s _] s) that I wanted to investigate replacing. |
| 13:25 | sdegutis | It's a two-argument thingy. |
| 13:26 | sdegutis | Actually, wait. Is it possible to just tell Instaparse to omit a certain thing from the output tree? |
| 13:26 | sdegutis | I have a literal '\n' in my rule (to indicate end of line as the terminator for that rule). But it keeps emitting this stupid character in my output tree. |
| 13:27 | TimMc | slester: lein has some issues marked "newbie" which don't require as much background |
| 13:27 | justin_smith | TimMc: yeah, that's why I brought it up |
| 13:27 | sdegutis | Anyone know if this is possible somehow? |
| 13:27 | sdegutis | To tell it "hey don't omit this character in my rule"? |
| 13:28 | xemdetia | sdegutis, did you look at 'transform' |
| 13:28 | sdegutis | I am currently using it. |
| 13:29 | sdegutis | That's where I'm putting (fn [s _] s) |
| 13:30 | sdegutis | One way would be to give a name to my Newline character and then transform it into nil in the transform, if that even works. But that might not work. And even if it does, I don't want to name Newline. |
| 13:30 | xemdetia | can't you just do :newline-token nil |
| 13:30 | xemdetia | well it is a token in your input stream? |
| 13:30 | sdegutis | xemdetia: It's a literal '\n' |
| 13:30 | xemdetia | since you are using it as a meaningful delimiter instead of whitespace? |
| 13:31 | sdegutis | Entry = Thing+ '\\n' |
| 13:31 | xemdetia | so for the grammar to accept the input it must have a literal newline token |
| 13:31 | xemdetia | so it makes sense it would be in your output |
| 13:32 | sdegutis | Not with how well-structured Instaparse's output tree already is. |
| 13:32 | sdegutis | I don't need the newline in my output, it's just there for the sake of the parser. Now that it's parsed, I don't need this token anymore. |
| 13:33 | xemdetia | so tag it as a token and do a tree transform to get rid of it, that's really the answer if you are not able to override how the newline token is added to the tree |
| 13:33 | xemdetia | this is more general parser theory than exactly instaparse |
| 13:36 | sdegutis | Oh. |
| 13:36 | sdegutis | Thanks xemdetia for your expert help. |
| 13:36 | xemdetia | accepting a grammar in a parser is one job, the data structure it emits as a representation is a separate part, if the path between lexer and tree is a black box to you |
| 13:36 | xemdetia | you just have to deal with it on the output side |
| 13:37 | sdegutis | Most excellent. |
| 13:38 | sdegutis | Transforming it into `nil` does not help. |
| 13:38 | sdegutis | It is still present, only now as nil. |
| 13:38 | sdegutis | (hehehehehheh) |
| 13:39 | justin_smith | sounds like a job for mapcat |
| 13:40 | xemdetia | only when you need mapcat to be |
| 13:40 | xemdetia | during the day mapcat is just cat, a noble blue collar worker |
| 13:40 | xemdetia | taking files from over there and dumping them to screens for the luxurious |
| 13:40 | xemdetia | but at night |
| 13:40 | xemdetia | mapcat gets lispy |
| 13:40 | justin_smith | haha |
| 13:40 | justin_smith | (doc cat) |
| 13:40 | clojurebot | "([rf]); A transducer which concatenates the contents of each input, which must be a collection, into the reduction." |
| 13:42 | xemdetia | sdegutis, will nil be happily handled by the reader of that tree |
| 13:42 | xemdetia | if not maybe you just have to do some dissoc/remove-keys magic |
| 13:42 | sdegutis | xemdetia: no, it still requires me to use (fn [s _] s) |
| 13:43 | xemdetia | well I didn't mean through instaparse transfor |
| 13:43 | xemdetia | just use it like a tree |
| 13:43 | sdegutis | It ends up inside a ["mystring" "\n"], where I ultimately just want to get "mystring" out. |
| 13:44 | xemdetia | I mean you have a ref to a map that is your output, just use it like a map? filter maybe? |
| 13:44 | xemdetia | I am not remembering how instaparse emits |
| 13:44 | xemdetia | been playing with antlr more lately |
| 13:45 | sdegutis | How do you match the very end of a file? |
| 13:45 | sdegutis | Should I just append \0 to the file and match for that? |
| 13:47 | xemdetia | we're talking about a few different things? when/how do you want to match the eof? |
| 13:48 | xemdetia | I mean from lexer/parser land usually you just invent an eof token so you don't have to worry about it |
| 13:48 | sdegutis | Pretend that, in the file my professor will give us, there may not be a trailing newline at the end of the file, whereas it belongs to a repeating rule. |
| 13:49 | sdegutis | For example if Line was a rule to match a line and ends in '\n', and you might have many lines, but the last one doesn't end in a newline. |
| 13:49 | sdegutis | Does this make sense? |
| 13:49 | snowell | sdegutis: You can use brackets to exclude it from the output: Entry = Thing <'\n'>? |
| 13:49 | sdegutis | snowell: Awesome!!! |
| 13:50 | sdegutis | Let me try. |
| 13:50 | sdegutis | Ahhh: "Angle brackets on the right-hand side of a rule correspond to the hide combinator." |
| 13:50 | sdegutis | I did not look for "hide" anywhere ever. Only "ignore" and "omit". |
| 13:56 | sdegutis | Yes, <> works perfect. To ignore the token itself but leave the rule name, I put it on the right side. To ignore both, I put it on both sides. |
| 13:56 | sdegutis | I never even saw the "Controlling the tree structure" section! This is useful. |
| 13:56 | xemdetia | sorry, haven't used instaparse enough |
| 13:57 | xemdetia | but yeah there is a separation between 'accept grammar' and 'data structure' |
| 13:57 | xemdetia | you either have hooks or you don't |
| 14:06 | sdegutis | So if you have a file with multiple Lines, each Line ending in '\n', but the last line omits the newline -- how do you express this? |
| 14:06 | sdegutis | Or do you just add an \n at the end of the file just in case, ignoring a second \n that might be at the end? |
| 14:08 | xemdetia | sdegutis, one way could just accept '\n'+ |
| 14:08 | sdegutis | xemdetia: But it might have 0 newlines on the last line |
| 14:09 | xemdetia | or I might have misread it |
| 14:09 | sdegutis | And * doesn't work since every line before it requires at least one |
| 14:09 | snowell | ? translates to 0 or 1 |
| 14:09 | sdegutis | It's a text file where each line is an entry, but the whole file might not end with a newline |
| 14:09 | xemdetia | right, are you slurping the input file directly into instaparse or are you buffering it first |
| 14:09 | sdegutis | (slurp) |
| 14:10 | sdegutis | (->> file (slurp) (parse)) |
| 14:10 | xemdetia | can you just stick an extra newline on the end? *_* |
| 14:10 | sdegutis | Yep. That's my current plan. |
| 14:10 | snowell | I would use ? |
| 14:10 | xemdetia | he can't |
| 14:10 | sdegutis | But it makes me feel dirty. |
| 14:10 | xemdetia | newline is a meaningful character |
| 14:10 | hellofunk | cljs repl experiments by mfikes are trending high on HN right now |
| 14:11 | sdegutis | (inc mfikes) |
| 14:11 | lazybot | ⇒ 1 |
| 14:11 | xemdetia | sdegutis, its not really dirty. massaging input before lexing is just something you have to do |
| 14:11 | sdegutis | It's a thing? |
| 14:11 | sdegutis | Phew. |
| 14:11 | sdegutis | xemdetia++ |
| 14:11 | xemdetia | well I mean in most of my grammars I have an end of input thing |
| 14:12 | xemdetia | and usually that is something I glue in lexer - EOF APPEND - parser |
| 14:12 | xemdetia | if it is not convenient to do another way |
| 14:13 | snowell | You could parse with a regex |
| 14:13 | justizin | anyone using clojure to test existing java code with no coverage? |
| 14:13 | snowell | sdegutis: Entry = Thing + <# |
| 14:13 | snowell | bah |
| 14:14 | hiredman | justizin: yes |
| 14:14 | snowell | Entry = Thing + <#"[\n|\Z]"> |
| 14:14 | sdegutis | xemdetia: I've done that too in the past -- my lexer would append a special :EOF token to the end of the token stream. |
| 14:14 | sdegutis | xemdetia: But Instaparse is fun.' |
| 14:14 | snowell | That will match on \n or end of string |
| 14:14 | hiredman | well, maybe "that depends" |
| 14:14 | xemdetia | that's true |
| 14:15 | xemdetia | but yeah just throwing an eof on the token string is easiest |
| 14:15 | xemdetia | because then you aren't relying on some condition of the input to be exactly right |
| 14:15 | xemdetia | which makes debugging easier |
| 14:15 | snowell | Easiest, sure. But like sdegutis I feel dirty doing something like that :D |
| 14:16 | xemdetia | well |
| 14:17 | xemdetia | this is why using whitespace as a delimiter is awkward |
| 14:17 | xemdetia | if you used semis for every line you wouldn't have this problem at all |
| 14:17 | xemdetia | and you would have a clean token string to feed the parser |
| 14:17 | sdegutis | +1 |
| 14:17 | snowell | Of course then a user comes along and puts a semi in the input |
| 14:18 | sdegutis | xemdetia: the real problem is having to parse something that humans edited |
| 14:18 | xemdetia | yes |
| 14:18 | justizin | hiredman: any tips on where to start? examples? |
| 14:18 | sdegutis | *and assembled |
| 14:18 | xemdetia | the real problem is the people |
| 14:18 | xemdetia | remove the people |
| 14:18 | sdegutis | OF COURSE |
| 14:18 | sdegutis | ROBOTICIZE THIS JOB |
| 14:18 | sdegutis | how could i not think of this |
| 14:18 | sdegutis | Welp, at least I'm not parsing Excel files. |
| 14:19 | slester | this is how the robot wars begin |
| 14:19 | hiredman | justizin: the first thing you'll need to figure out is how to tie the clojure tests in to your java project, the easiest way to do that is to build the java project using lein, then you can run with tests with `lein test` and write them using clojure.test |
| 14:20 | hiredman | if you can't do that you can look at clojure, it is a java and clojure project, built using maven, tested in clojure |
| 14:21 | sdegutis | Thanks in advance, regards. |
| 14:21 | justizin | hiredman: tks |
| 14:22 | sdegutis | My awful hacky solution: https://gist.github.com/sdegutis/7ca83a4a4a61b7ced970 |
| 14:22 | sdegutis | Passes all tests! |
| 14:22 | sdegutis | And now I'm done 3 hours early. |
| 14:22 | sdegutis | Time to convert Sass to Stylus. |
| 14:23 | sdegutis | I really want to convert it to Clj to be honest. But let's face it JVM startup time won't be acceptable for 15 more years. |
| 14:24 | justizin | hiredman: somehow this idea came out of the thought of using lein instead of maven |
| 14:24 | justizin | i have a little experience with lein from working with jepsen and LightTable |
| 14:25 | hiredman | sure, lein does well building java, and then you can point test.check at your java, it is great |
| 14:25 | justizin | sweet |
| 14:25 | justizin | it feels like it might be less typing to write lots of new tests of a java module with clojure |
| 14:26 | bauhaus | anyone seen a deps error in the latest version of datomic: I/O exception caught when processing request to {}->http://jline.sourceforge.net:80: Connection reset >.< |
| 14:28 | sdegutis | We are very far behind in Datomic versions. Years old. |
| 14:29 | sdegutis | Also in Clojure version. |
| 14:29 | sdegutis | We can't update. Too expensive. |
| 14:30 | bauhaus | thought the sourceforge ship had sunk |
| 14:31 | bauhaus | guess not |
| 14:31 | sdegutis | bauhaus: yes it has |
| 14:31 | bja | just submitted a PR to a project that introduces eval, preparing to get roasted... |
| 14:34 | wasamasa | for what reason? |
| 14:34 | wasamasa | inb4 it's in a macro |
| 14:38 | bja | I'm generating destructure arguments and have a macro that does let passing those bindings in (manual-let), I need to eval the result of that along with the symbols I want out |
| 14:38 | bja | at least as far as I can tell |
| 14:39 | bja | so the macro builds a let*, then I want to eval it so I can grab the result of the destructuring |
| 14:39 | justizin | hiredman: any examples of java projects built with lein? the documentation is all like 'clojure clojure clojure' |
| 14:39 | bja | https://github.com/stuartsierra/component/pull/37/files#diff-998bb67cf5bc59512267d4e162873450R137 |
| 14:40 | hiredman | https://github.com/sonian/Greenmail/blob/master/project.clj |
| 14:40 | bja | justizin: storm used to be built with lein, but it's moved to straight maven during the 0.9 cycle |
| 14:43 | wasamasa | bja: can I get a cookie for guessing right? |
| 14:43 | bja | well, the eval isnt' in a macro |
| 14:44 | bja | but I guess you can have a cookie anyway, since it's pretty close |
| 14:44 | wasamasa | yay |
| 14:45 | bja | (inc wasamasa) |
| 14:45 | lazybot | ⇒ 1 |
| 14:56 | sdegutis | Is there a nice way to prettily diff two not-too-deep maps. Thanks? |
| 14:56 | H4ns | sdegutis: https://clojuredocs.org/clojure.data/diff |
| 14:58 | H4ns | minus the "nice" and "pretty", i fear |
| 14:58 | sdegutis | Sorry I mean to print. |
| 14:59 | snowell | ,(doc prn) |
| 14:59 | clojurebot | "([& more]); Same as pr followed by (newline). Observes *flush-on-newline*" |
| 14:59 | snowell | sdegutis: ^ |
| 15:00 | sdegutis | snowell: Thanks. I fear prn does not work well for many vectors. |
| 15:01 | snowell | Well you said they weren't too deep. pr-str / pr / prn are about as pretty as you can print |
| 15:02 | snowell | You could try clojure.pprint/pprint I suppose |
| 15:03 | xemdetia | you could print to legal and get out some highlighters |
| 15:03 | xemdetia | I think I still have some stickers in a drawer somewhere |
| 15:21 | atyz | Does anyone know where I can find information on how to efficiently query nested entities (of the same type, they all have the same ref - like a tree) in datomic? |
| 15:41 | iwillig | atyz: you might want to try the datomic channel |
| 15:41 | iwillig | but would the pull api be enough for you ? |
| 15:41 | fredfe | Is net.mikera/core.matrix a prefered/stable matrix match lib? |
| 15:59 | gfredericks | sdegutis: the puget library might be useful |
| 16:09 | hcumberdale | Hi! :) |
| 16:09 | hcumberdale | How to register a log4j.properties file during a lein plugin execution ? |
| 16:10 | hcumberdale | Files under ./resources does not seem to be seen during plugin execution |
| 16:21 | nicola | i'm having a similar issue - my (clojure) code uses cassandra which logs A LOT of stuff on the console; is there a simple way to turn it off? |
| 16:24 | hcumberdale | nicola: generally you can set things via resources/log4j.properties |
| 16:24 | hcumberdale | but this isn't recogniced during a plugin run |
| 16:24 | nicola | i'll try that, thanks |
| 16:27 | justin_smith | nicola: another option is to use lein repl in the console, which will start a repl and also start listening on a port, then you can use 'lein repl connect' in another terminal. The logging goes to the first one, and will not interrupt your work in the second. |
| 16:27 | justin_smith | in place of lein repl :connect, you can also use a client like cider of course |
| 16:28 | nicola | hcumberdale: didn't seem to work :( still logs a lot of stuff |
| 16:29 | hcumberdale | nicola: depends on what logging framework loggs this stuff. |
| 16:29 | nicola | justin_smith: by console i meant stdout, not repl/cider |
| 16:29 | nicola | hcumberdale: i'm pretty sure it's log4j (at least from looking at cassandra's source code) but i'm still trying to sort this out so i might be wrong |
| 16:29 | justin_smith | nicola: then explicitly open a file handle and output to that instead of using stdout? |
| 16:29 | hcumberdale | nicola: what is writing to stdout? A framework? Yur application |
| 16:30 | hcumberdale | nicola: it might be java commons logging |
| 16:30 | nicola | i'm calling some function from cassandra; these functions in turn log a bunch of stuff to stdout, which i don't want |
| 16:30 | justin_smith | nicola: that would be the hack version at least. if you figure out what logger it is using, you can configure that logger of course. |
| 16:30 | hcumberdale | you can bundle all logs into a slf4j adapter |
| 16:30 | hcumberdale | see: https://github.com/kremers/clojurewebtemplate/blob/master/project.clj << logging |
| 16:31 | hcumberdale | it is using logback as backend |
| 16:31 | justin_smith | nicola: what is consuming your stdout? |
| 16:31 | hcumberdale | configured here: https://github.com/kremers/clojurewebtemplate/blob/master/src/logback.xml |
| 16:32 | hcumberdale | nicola: the java driver for cassandra is using slf4j |
| 16:33 | nicola | justin_smith: i'm just printing to console; i mean lein uberjar, then java -jar target/...-standalone.jar; i'm not piping this to anything |
| 16:33 | nicola | hcumberdale: oh interesting |
| 16:35 | justin_smith | nicola: the reason I ask, is if nothing is programatically consuming it in real time, you can even just use something like grep |
| 16:35 | nicola | justin_smith: oh i see; i'd want to take it out anyway though |
| 16:36 | justin_smith | clearly a misunderstood a few things, heh |
| 16:40 | nicola | YES! here's the solution (set to only warnings) (.setLevel (org.slf4j.LoggerFactory/getLogger ch.qos.logback.classic.Logger/ROOT_LOGGER_NAME ) ch.qos.logback.classic.Level/WARN) |
| 16:40 | nicola | thanks for the tip about slf4j hcumberdale |
| 16:41 | hcumberdale | nicola: better you use a file. So you are able to adjust it later without redeployment etc. |
| 16:42 | nicola | true |
| 16:49 | hcumberdale | hmmm technomancy not here |
| 16:51 | slester | Just read this on HN: "Slow launch means you tend to write monolithic applications. You can't write cli tools with Clojure. You can't compose Clojure applications. You have to write a big bulky JVM app. Which definitely has its place, but ClojureScript is expanding Clojure's reach." -- Is that true? I mean the repl does take forever to start, but does that inhibit CLI? |
| 16:54 | hiredman | it is ridiculous |
| 16:54 | hiredman | my ~/src has 18 shebang scripts written in clojure in it |
| 16:55 | blkcat | the jvm startup time is not what i would call ideal |
| 16:55 | hiredman | (counted via find $PWD -name \*.clj -exec head -1 {} \;|grep '#!'|grep jar|wc -l) |
| 16:55 | blkcat | just getting usage from lein takes a little under 4 seconds on my system |
| 16:56 | hiredman | the shebang lines for those 18 files are some variation of #!/usr/bin/java -jar /Users/hiredman/src/clojure/target/clojure-1.7.0-master-SNAPSHOT.jar |
| 16:56 | justin_smith | blkcat: the lein repl startup time is not caused by the jvm, the culprits are mainly nrepl, lein, and clojure.core, in that order last I checked |
| 16:57 | justin_smith | if you can avoid the lein and nrepl parts of the equation, you'll like your startup time much more |
| 16:57 | slester | hiredman: and I guess the responsiveness is fast? |
| 16:57 | slester | I searched and found https://en.wikibooks.org/wiki/Clojure_Programming/Tutorials_and_Tips#Shebang_Scripting_in_Clojure |
| 16:59 | hiredman | I have no idea, they are not interactive, there is one to delete old clojurebot postgres backups from s3, one to launch the daily show on my roku, one to generate a youtube playlist from the gist of songs played in the strange loop main hall |
| 17:00 | hiredman | I've never cared, or used time on them, and they work great |
| 17:00 | puredanger | I can run this in 0.893 sec: time java -cp clojure.jar clojure.main -e "(+ 1 1)" |
| 17:00 | puredanger | which starts a repl, evaluates an expr and shuts down |
| 17:00 | slester | hiredman: launch the daily show on your roku? :O |
| 17:00 | puredanger | well I guess starts a runtime, not a repl |
| 17:01 | hiredman | slester: sure, that script is retired, replaced by a little web app that I used from phone, and then I moved and never set it up again |
| 17:03 | hiredman | the webapp was sweet, I ran it on a beaglebone and could use it to drive my tv, roku, even the fireplace |
| 17:04 | hiredman | I touching a single button it would turn on the tv, set it to right input, then launch the hulu roku app, search of the daily show, then launch the most recent episode |
| 17:05 | hiredman | I do a lot of stuff, and I do with clojure, and it works great |
| 17:07 | hiredman | https://gist.github.com/hiredman/7682917 |
| 17:08 | vas | hiredman; that's impressive. |
| 17:11 | csd_ | does there exist some macro that makes it easy to thread a async channel through a stateful series of functions for testing purposes? is this even a good practice to consider? |
| 17:26 | adrians | Anyone around who is using Emacs/cider and who could answer a few questions? |
| 17:27 | mk | adrians: best way to find out is to just ask :) |
| 17:29 | Seylerius | adrians: I'm not massively experienced, but I'm using CIDER atm and could experiment. Speak your queries.'' |
| 17:37 | adrians | for some reason I don't seem to be getting the doc popup in my editor buffer when using cider/company-mode, but I do have it in my *cider-repl* buffer - same minor modes seem to be in effect for both buffers |
| 17:42 | adrians | Would anyone know what I should look for to determine why I'm not getting the help popup in the editor? |
| 17:45 | adrians | Seylerius, mk: still around? |
| 17:45 | Seylerius | adrians: Yep. |
| 17:46 | adrians | Any suggestion? |
| 17:46 | mk | yes, but I don't use either of those |
| 17:46 | Seylerius | adrians: Which help popup? |
| 17:46 | adrians | one that comes up after the auto completion popup appears |
| 17:54 | Seylerius | adrians: The one that's supposed to provide the argument possibilities? |
| 17:56 | adrians | Seylerius: the package is called company-quickhelp |
| 17:56 | Seylerius | Ah, that one. |
| 17:56 | adrians | it shows the function signature plus the doc string |
| 17:56 | adrians | is this meant to work only in the repl buffer? |
| 17:56 | arrdem | there's also eldoc-mode |
| 17:57 | adrians | arrdem: yes, I'm using that too, but I like the multi-line popup in addition to that |
| 17:57 | arrdem | and no both will work fine in both code and the repl |
| 17:58 | arrdem | assuming you're in cider-mode with a live connection among other things |
| 17:58 | adrians | aardem: so what could be a reason not to see it in a regular editor? |
| 17:58 | adrians | aardem: I am connected - I get the popup in the repl buffer |
| 17:59 | adrians | and on the github page, I see no configuration other than for turning it on and setting the delay |
| 17:59 | arrdem | so you have to hook company-quickhelp-mode to cider-mode |
| 17:59 | arrdem | or turn it on yourself |
| 17:59 | arrdem | I don't think cider does that automagically |
| 18:00 | arrdem | that's something I think got added to the README recently along with adding company-mode to cider-mode. if not then it needs to be in the README |
| 18:02 | arrdem | adrians: did/does that help? |
| 18:02 | adrians | yes, thanks aardem |
| 18:16 | broma0 | a good data structure for O(1) push/pop at both the front and back? |
| 18:20 | arrdem | broma0: doubly linked list |
| 18:20 | arrdem | not immutable tho. |
| 18:21 | arrdem | finger trees may be able to do that as well, but they're gonna be O(log32(n)) push/pop |
| 18:21 | amalloy | i think the main persistent options are finger trees and RRB trees |
| 18:21 | amalloy | arrdem: really? i know that's true of RRB trees, but i don't think finger trees have and kind of 32-wide branching |
| 18:21 | arrdem | amalloy: I don't remember the specifics of finger trees, maybe I have them confused with vectors |
| 18:21 | arrdem | s/maybe/probably/g |
| 18:22 | amalloy | i think so. RRB trees are the thing bagwell gave a talk about, as a way to improve clojure's vectors |
| 18:22 | arrdem | heh |
| 18:24 | hcumberdale | How to enable the log4j debug logger on root level when executing leiningen plugins |
| 18:38 | broma0 | arrdem: amalloy: Thank you |
| 18:39 | TEttinger | gfredericks: I have some RNG puzzling to do that perhaps you are already an expert on |
| 18:39 | TEttinger | gfredericks: I'm interested in implementing the PCG family of RNGs in Java (making them usable to Clojure as well, of course) |
| 18:40 | TEttinger | http://www.pcg-random.org/ |
| 18:43 | TEttinger | they're a very conceptually simple modification on a linear congruential generator (or multiplicative congruential generator, which is what I'm interested in) where they use the values in the low-period low bits as shift or rotation operands, and/or use them to perform a xorshift on the high bits of the LCG output |
| 18:45 | TEttinger | downside is I need a better LCG than Java's, since java will only produce 32 bits with a period of 2^48, and there aren't nearly enough bits to work with there |
| 19:03 | crocket | Can anyone recommend a good command line parser? |
| 19:04 | Surgo | tools.cli |
| 19:04 | Surgo | https://github.com/clojure/tools.cli |
| 19:04 | Surgo | your definition of good may vary |
| 19:05 | crocket | Is tools.cli simple and small? |
| 19:05 | Surgo | simple, you can decide on that yourself by checking the readme |
| 19:06 | Surgo | small, it has no dependencies aside from clojure |
| 20:57 | jhn | if I have a set of maps, how can I test if there is some key in any of the maps that has a particular value? |
| 20:59 | scriptor | ,(map #(contains? % :key) [[:key 1] [:bar 2]]) |
| 20:59 | clojurebot | (false false) |
| 20:59 | scriptor | sorry |
| 20:59 | scriptor | ,(map #(contains? % :key) [{:key 1} {:bar 2}]) |
| 20:59 | clojurebot | (true false) |
| 21:03 | jhn | ty |
| 21:16 | julianleviston | um |
| 21:17 | julianleviston | that’s not going to test if there’s a key that has some particular value… unless you mean “how can I test that the map has a particular key”? which wasn’t what you asked. |
| 21:18 | julianleviston | jhn Precision of language: This is a set of maps: #{{:a 1} {:b 2}} is this what you meant when you said “if I have a set of maps”? |
| 21:19 | jhn | julianleviston Yes, I noticed, but that gave me the hint as to what I could do. |
| 21:19 | jhn | And yes, I meant an actual set. |
| 21:21 | julianleviston | good o |
| 21:23 | gfredericks | TEttinger: was there a question associated with that? |
| 21:24 | TEttinger | gfredericks: ah I assumed you weren't around and it was going to get passed out of history |
| 21:25 | TEttinger | gfredericks: are you familiar with L'Ecuyer's LCG constants? |
| 21:26 | TEttinger | I was having a hard time understanding why he claims certain numbers for MCGs produce reversed-order generators compared to certain other numbers, and I think I don't understand his meaning |
| 21:26 | gfredericks | it doesn't sound familiar |
| 21:26 | TEttinger | http://www.ams.org/journals/mcom/1999-68-225/S0025-5718-99-00996-5/S0025-5718-99-00996-5.pdf |
| 21:26 | gfredericks | the most I looked into LCGs was to read the knuth volume without doing any of the exercises |
| 21:27 | TEttinger | I gotta say I still haven't finished watching your splittable RNG talk :( |
| 21:27 | TEttinger | it was starting to go over my head when I stopped |
| 21:27 | TEttinger | I did look into Java 8' SplittableRandom source |
| 21:28 | TEttinger | http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8-b132/java/util/SplittableRandom.java |
| 21:28 | gfredericks | what part was head-over? the algorithm descriptions? |
| 21:28 | gfredericks | yeah I looked at that file quite a lot :) |
| 21:28 | TEttinger | I can't remember, I don't understand the threading stuff that well |
| 21:28 | TEttinger | why you would want splittability, I mean |
| 21:28 | gfredericks | oh there are different reasons |
| 21:28 | gfredericks | doesn't have to be threading |
| 21:29 | gfredericks | e.g. test.check more or less needs it and is single-threaded |
| 21:29 | TEttinger | ah |
| 21:29 | gfredericks | laziness is the key factor in the test.check case |
| 21:29 | gfredericks | but the biggest reason is just that the state monad is a giant pain |
| 21:29 | gfredericks | especially if the haskell compiler is not holding your hand |
| 21:29 | TEttinger | hm. |
| 21:30 | gfredericks | so if you want to write complex deterministic programs that depend on pseudorandomness, you can't give them an arbitrary structure, you have to manually linearize the program |
| 21:30 | gfredericks | I will admit this probably doesn't matter for most people |
| 21:31 | TEttinger | I think I can implement PCG-Random's bit-fiddling over any 64-bit-state, 64-bit-output generator and get a 32-bit generator out of it |
| 21:31 | gfredericks | if you're using a haskellesque language though, the language forces this to be important |
| 21:32 | TEttinger | gfredericks, are you using SplittableRandom now or your own RNG? |
| 21:32 | TEttinger | (in test.check) |
| 21:32 | gfredericks | I ported it to clojure |
| 21:32 | TEttinger | ah! |
| 21:32 | gfredericks | SplittableRandom is OOP style |
| 21:32 | gfredericks | the port is clojure/functional style |
| 21:32 | TEttinger | cool |
| 21:32 | gfredericks | but it gives you identical results |
| 21:33 | TEttinger | can you skip ahead? |
| 21:33 | TEttinger | (efficiently?) |
| 21:33 | gfredericks | I don't think there's a need to? |
| 21:33 | gfredericks | I'd be curious to hear a use for that |
| 21:33 | gfredericks | that can't be met by general splittability |
| 21:33 | gfredericks | (you might still be able to, I just haven't thought about it) |
| 21:34 | TEttinger | eh, it's sometimes a handy feature. you can do it regardless of having been split, so it could be added onto a SplitMix style RNG |
| 21:35 | TEttinger | you could have a decent-sized collection of SplitMix RNGs, right? each has tiny state so having lots isn't a problem |
| 21:36 | julianleviston | is there a flip combinator in clojure? |
| 21:36 | gfredericks | I'm not sure what splitmix means exactly |
| 21:36 | TEttinger | gfredericks: it's the type of generator SplittableRandom uses |
| 21:36 | gfredericks | oh that sounds familiar |
| 21:36 | gfredericks | the "skipping ahead" question doesn't actually fit well with the API I aimed at because it's not linear at all |
| 21:36 | gfredericks | there is no inherent "sequence of numbers" to skip ahead in |
| 21:37 | gfredericks | though the SplittableRandom algorithm is more sequence-like |
| 21:37 | gfredericks | I just decided to more or less ignore that sequence |
| 21:37 | TEttinger | they could all be seeded with the same state. the update step for SplittableRandom adds the gamma to state, then takes that value (not modifying state anymore) and xorshifts/multiplies it some |
| 21:38 | TEttinger | it's fairly straightforward to add gamma many times and only get the overflow out of it |
| 21:38 | gfredericks | oh yes, that's right |
| 21:38 | TEttinger | that would be equivalent to skipping ahead |
| 21:38 | gfredericks | yep |
| 21:39 | gfredericks | f(state + gamma * n) |
| 21:39 | TEttinger | yes, but not quite |
| 21:40 | gfredericks | eh? |
| 21:40 | TEttinger | if you wanted to skip ahead 1000 iterations, will that be OK with regards to overflow? |
| 21:40 | TEttinger | hm, to the clojurebot |
| 21:40 | gfredericks | I believe the unchecked jvm arithmetic ops Just Work |
| 21:40 | gfredericks | you just want to do modular arithmetic |
| 21:41 | TEttinger | oh, also: do you know how to get either of the bots to do *unchecked-math* ? |
| 21:41 | gfredericks | ,(set! *unchecked-math* true) |
| 21:41 | clojurebot | #error {\n :cause "Can't change/establish root binding of: *unchecked-math* with set"\n :via\n [{:type java.lang.IllegalStateException\n :message "Can't change/establish root binding of: *unchecked-math* with set"\n :at [clojure.lang.Var set "Var.java" 221]}]\n :trace\n [[clojure.lang.Var set "Var.java" 221]\n [sandbox$eval25 invoke "NO_SOURCE_FILE" -1]\n [clojure.lang.Compiler eval "Compile... |
| 21:41 | gfredericks | you can always just call unchecked-foo directly |
| 21:41 | gfredericks | ,(unchecked-multiply 382947923 723782542342) |
| 21:41 | clojurebot | 469860187885181426 |
| 21:42 | TEttinger | ,(unchecked-multiply (quot Long/MAX_LONG 2) (quot Long/MAX_LONG 2)) |
| 21:42 | clojurebot | #error {\n :cause "Unable to find static field: MAX_LONG in class java.lang.Long"\n :via\n [{:type clojure.lang.Compiler$CompilerException\n :message "java.lang.RuntimeException: Unable to find static field: MAX_LONG in class java.lang.Long, compiling:(NO_SOURCE_PATH:0:0)"\n :at [clojure.lang.Compiler analyze "Compiler.java" 6543]}\n {:type java.lang.RuntimeException\n :message "Unable to f... |
| 21:43 | TEttinger | ,(unchecked-multiply (quot Long/MAXVALUE 2) (quot Long/MAX_VALUE 2)) |
| 21:43 | clojurebot | #error {\n :cause "Unable to find static field: MAXVALUE in class java.lang.Long"\n :via\n [{:type clojure.lang.Compiler$CompilerException\n :message "java.lang.RuntimeException: Unable to find static field: MAXVALUE in class java.lang.Long, compiling:(NO_SOURCE_PATH:0:0)"\n :at [clojure.lang.Compiler analyze "Compiler.java" 6543]}\n {:type java.lang.RuntimeException\n :message "Unable to f... |
| 21:43 | TEttinger | ,(unchecked-multiply (quot Long/MAX_VALUE 2) (quot Long/MAX_VALUE 2)) |
| 21:43 | clojurebot | -9223372036854775807 |
| 21:43 | TEttinger | NICE |
| 21:43 | gfredericks | you gotta be careful with them though |
| 21:43 | TEttinger | yeah I got some weird thrown errors |
| 21:43 | gfredericks | there's this goofy half-bug where they do checked arithmetic if you're not using primitives |
| 21:43 | gfredericks | ,((fn [a b] (unchecked-multiply a b)) 2984289278487 472737237232) |
| 21:43 | clojurebot | #error {\n :cause "integer overflow"\n :via\n [{:type java.lang.ArithmeticException\n :message "integer overflow"\n :at [clojure.lang.Numbers throwIntOverflow "Numbers.java" 1501]}]\n :trace\n [[clojure.lang.Numbers throwIntOverflow "Numbers.java" 1501]\n [clojure.lang.Numbers multiply "Numbers.java" 1867]\n [clojure.lang.Numbers$LongOps multiply "Numbers.java" 467]\n [clojure.lang.Numbers ... |
| 21:44 | TEttinger | that helps a lot thanks |
| 22:33 | bcham | Quick question: In this test, the code isn't being executed and I'm not sure why. The result of the expression ((clean-code "python") ...) is the correct answer, but when I run the test it just shows the unexecuted code. http://pastebin.com/bpv1K7bF |
| 22:36 | bcham | Actually I think I figured it out |
| 23:55 | lvh | In Compojure, how do I spell "anything with this route match *prefix*, go to this handler fn" |
| 23:57 | lvh | basically /xyzzy, /xyzzy/ and /xyzzy/* (where the asterisk means "anything") should be handed off to this ring handler fn |