2013-09-22
| 00:00 | carlosgaldino | lordQuas: oh, that's cool |
| 00:00 | lordQuas | If you download emacs, I'd be happy to walk you through it. |
| 00:00 | lordQuas | Though I dont know if I could set up evil-mode, I've never done it before, I hear its easy |
| 00:00 | carlosgaldino | lordQuas: yeah, I was thinking about learning emacs when doing clojure |
| 00:01 | carlosgaldino | I have no idea how it works, if it's modal, or whatever. just know that it is better suited for clojure dev |
| 00:01 | carlosgaldino | and lisps in general |
| 00:02 | lordQuas | Its not modal by default, but the idea is that it is infinitely customizable. Given that you know clojure, customizing it would be trivial for you. |
| 00:02 | CuaThoXay | can I use emacs slime with clojure? |
| 00:02 | lordQuas | CuaThoXay: You can, but even better than slime is nrepl |
| 00:02 | lordQuas | IMO |
| 00:02 | CuaThoXay | thank, googling |
| 00:02 | carlosgaldino | lordQuas: haha, two problems then. I don't know clojure, I'm just starting |
| 00:03 | lordQuas | I think most people consider nrepl to be the successor to slime |
| 00:03 | lordQuas | Setting it up is cake too |
| 00:04 | lordQuas | M-x package-install <ret> clojure-mode <ret> |
| 00:04 | lordQuas | M-x package-install <ret> nrepl <ret> |
| 00:04 | lordQuas | And youre done |
| 00:04 | lordQuas | Eval code with C-x C-e (eval-last-s-expression) |
| 00:05 | lordQuas | Huh why havent you updated? |
| 00:05 | CuaThoXay | stock emacs version of ubuntu 12.04 |
| 00:07 | lordQuas | ah i see |
| 00:07 | CuaThoXay | I prefer to use software straight from the distro's repo, if possible |
| 00:07 | CuaThoXay | less maintenance work |
| 00:08 | lordQuas | Understandable. I would say 24 is stable and it's new package manager is worth the upgrade |
| 00:10 | Cua | I agree, installation from one's distro repo doesn't work so well with software with fast development pace such as clojure and its friends |
| 00:11 | Cua | the version of leiningen in ubuntu 12.04 repo is still 1.7.1 |
| 00:11 | Cua | yuck |
| 00:11 | lordQuas | yikes |
| 00:12 | lordQuas | When did OS X Homebrew surpass apt-get. Its a sad day. |
| 00:12 | Cua | well, 12.04 was released one and a half year ago |
| 00:27 | technomancy | when you don't have any quality guidelines, you can move faster |
| 00:28 | Brand0 | you don't need homebrew to install clojure/lein |
| 00:28 | Brand0 | or apt-get in linux |
| 00:30 | robink | Fastest way to turn a seq of characters into a String in Clojure? |
| 00:32 | coventry` | ,(str \a \b \c) |
| 00:32 | clojurebot | "abc" |
| 00:33 | coventry` | ,(apply str (\a \b \c)) for a seq, I guess. |
| 00:33 | clojurebot | #<ClassCastException java.lang.ClassCastException: java.lang.Character cannot be cast to clojure.lang.IFn> |
| 00:33 | coventry` | ,(apply str '(\a \b \c)) |
| 00:33 | clojurebot | "abc" |
| 00:36 | allenj12 | hey is there a replacement library for clojure.contrib.seq im paticularly interested in positions function |
| 00:42 | allenj12 | very quiet here |
| 00:42 | robink | coventry`: I guess that works. I was hoping for something a little less stack-hungry. |
| 00:46 | coventry` | robink: Oh. (String. (char-array '(\a \b \c))) maybe? |
| 00:46 | robink | coventry`: "IllegalArgumentException No matching ctor found for class java.lang.String clojure.lang.Reflector.invokeConstructor (Reflector.java:183)" |
| 00:47 | coventry` | Huh, it works in my repl. |
| 00:47 | chord | allenj12: lets stop the quietness and wark on starcraft clone in clojure |
| 00:47 | robink | Ah, forgot to cast to char-array |
| 00:48 | allenj12 | chord: xD |
| 00:48 | chord | what? |
| 00:48 | clojurebot | what is cells |
| 00:48 | allenj12 | chord: or even better a A* search on a eight puzzle :P (my intro to ai HW) |
| 00:52 | chord | allenj12: whatever you want just make the gaem |
| 00:55 | dirkdiggler | i'm new to emacs and just installed emacs-live and wondering how I can tell if emacs-live has been loaded |
| 00:57 | dirkdiggler | or i guess the more general question is how do i query emacs on what packages have been loaded |
| 01:14 | callen | dirkdiggler: https://www.google.com/search?q=emacs+query+packages&oq=emacs+query+packages&aqs=chrome..69i57j0l2j69i64l2.2635j0&sourceid=chrome&ie=UTF-8 |
| 01:20 | coventry` | callen: Doesn't emacs-live operate outside the standard package manager? |
| 01:21 | coventry` | https://github.com/overtone/emacs-live#live-packs |
| 01:25 | Frozenlock | Is there a way to get a project version for when running from leiningen and/or when running from a uberjar? I've seen different solutions for each of them, but I'm wondering if there's one for both. |
| 01:26 | callen | coventry`: it was a subtle way of making him feel pain for not just using emacs |
| 02:26 | chenjf | gi1 |
| 03:06 | chord | lets talk about something |
| 03:14 | dirkdiggler | what's up chord? |
| 03:15 | dirkdiggler | i like talking about development tools |
| 03:15 | dirkdiggler | new things beyond emacs |
| 04:02 | m00nlight | Can someone tell me how to get a field in a nested map? |
| 04:03 | scottj | ,(get-in {:a {:b 1}} [:a :b]) ; m00nlight |
| 04:03 | clojurebot | 1 |
| 04:04 | m00nlight | scottj: Thanks |
| 04:41 | klokbaske | ,(+ 1 1) |
| 04:41 | clojurebot | 2 |
| 04:48 | chord | you are all dumb |
| 05:00 | rlp10_ | I have a vector of maps, each with an ID key. How do I filter the vector so that any maps with an ID the same as one earlier in the list are filtered out (leaving only the first map in the vector that had that ID value)? |
| 05:11 | TEttinger | rlp10_, sounds like a use for distinct in some way |
| 05:13 | rlp10_ | TEttinger: Thanks, I'll check that out |
| 05:13 | TEttinger | http://clojuredocs.org/clojure_core/clojure.core/distinct |
| 05:14 | TEttinger | I'm thinking you could get the distinct IDs by mapping like (map :id [{:id 1234 :data "blah"}]) |
| 05:14 | TEttinger | ##(distinct (map :id [{:id 1234 :data "blah"} {:id 1234 :data "boo"} {:id 1235 :data "whee"}])) |
| 05:14 | lazybot | ⇒ (1234 1235) |
| 05:15 | TEttinger | but then you need to figure out which data to use |
| 05:15 | TEttinger | distinct is not sorted |
| 05:15 | TEttinger | oh! |
| 05:16 | TEttinger | you can get the distinct IDs that way, then use them as part of the filter or map-indexed |
| 05:16 | TEttinger | there's also reduce, which might be a good fit |
| 05:17 | rlp10_ | OK, TEttinger thanks for your help |
| 05:17 | rlp10_ | I think I've got enough to work on now - I appreciate your help |
| 05:17 | TEttinger | np |
| 06:03 | Jarda | (first (:content (first (filter #(= (:tag %) :ResponseCode) (xml-seq app-resp))))) |
| 06:03 | Jarda | is this really the best way to get a value of a xml element? |
| 06:03 | Jarda | app-resp is the result of xml/parse-str where xml is clojure.data.xml |
| 06:08 | TEttinger | Jarda, it looks to me like clojure.data.xml is not meant for reading xml so much as writing |
| 06:08 | TEttinger | I've never used it though |
| 07:16 | chord | YOU ARE ALL STUPID |
| 07:16 | chord | I AM TALKING |
| 07:16 | chord | I HAVE MENTAL PROBLEMS |
| 07:19 | s4muel | ,(reduce into (sorted-map) (for [e (reverse [{:id 1, :rec "one-rec"}, {:id 1, :rec "two-rec"}])] e)) |
| 07:19 | clojurebot | {:id 1, :rec "one-rec"} |
| 07:23 | s4muel | rlp10_ you could try the above, although, rseq might be faster than reverse |
| 07:24 | TEttinger | ,(reduce into (sorted-map) (rseq [{:id 1, :rec "one-rec"}, {:id 1, :rec "two-rec"}])]) |
| 07:24 | clojurebot | #<RuntimeException java.lang.RuntimeException: Unmatched delimiter: ]> |
| 07:24 | s4muel | hive mindin' |
| 07:24 | TEttinger | ,(reduce into (sorted-map) (rseq [{:id 1, :rec "one-rec"}, {:id 1, :rec "two-rec"}])) ; the point is the for is unneeded I think |
| 07:24 | clojurebot | {:id 1, :rec "one-rec"} |
| 07:25 | s4muel | ah! it always gets simpler :) |
| 07:26 | TEttinger | no, it doesn't quite work ##(reduce into (sorted-map) (rseq [{:id 1, :rec "one-rec"}, {:id 1, :rec "two-rec"}, {:id 2, :rec "eh-rec"}])) |
| 07:26 | lazybot | ⇒ {:id 1, :rec "one-rec"} |
| 07:27 | TEttinger | I think rlp10_ needs a vector of maps, rather than one sorted-map |
| 07:39 | s4muel | ,(reduce (fn [m {:keys [id rec]}] (if (contains? m id) m (assoc m id rec))) (sorted-map) [{:id 1, :rec "one-rec"}, {:id 1, :rec "two-rec"}, {:id 2, :rec "eh-rec"}]) |
| 07:39 | clojurebot | {1 "one-rec", 2 "eh-rec"} |
| 07:44 | mercwithamouth | question...do you all generally read from left to write when writing clojure or inwards and work your way out? |
| 07:44 | mercwithamouth | as if expanding on an idea? |
| 07:45 | TEttinger | s4muel, looks good |
| 07:45 | s4muel | iteratively, for sure. even just solving that little problem |
| 07:45 | hyPiRion | Well, it depends. |
| 07:45 | s4muel | (which is why this channel is awesome, its like learn by immersion in random real-world issues) |
| 07:46 | TEttinger | mercwithamouth, I generally iterate too. |
| 07:46 | jkj_ | mercwithamouth: if often go to threading macros -> ->> quite fast when there are many nested calls |
| 07:46 | mercwithamouth | so say you wanted to add 5+5 and then 18 to that value you would first think (+ 5 5) and then GO BACK and add another set of parenthesis around that and add the 18? |
| 07:47 | jkj_ | mercwithamouth: often yes. |
| 07:47 | mercwithamouth | or would you automatically think to start off with (+ 18 () ) ? |
| 07:47 | TEttinger | mercwithamouth, I think I would prefer (+ 5 5 18), but hey... |
| 07:47 | jkj_ | but then (->> (+ 5 5) (+ 18) ...) |
| 07:47 | mercwithamouth | TEttinger: well yes...that's a bad example =P |
| 07:47 | TEttinger | heh |
| 07:47 | mercwithamouth | jkj_: hrm!!! |
| 07:48 | TEttinger | yeah, I do wind up going back a lot |
| 07:48 | TEttinger | iterative is a good way to put it. writing one piece, scanning for what needs to change, adding it |
| 07:48 | TEttinger | and it's part of why clojurians prefer small single-use functions |
| 07:49 | mercwithamouth | i see |
| 07:49 | TEttinger | my clojure code is pretty terrible and tends toward massive one-liners |
| 07:50 | TEttinger | https://www.refheap.com/16011 |
| 07:50 | jkj_ | there should be ide support for automatically converting to threading macro style or so |
| 07:50 | mklappstuhl | I use korma for querying and jdbc for creation of tables |
| 07:51 | mklappstuhl | both of them need a connection but both have different ways to specify them |
| 08:00 | ambrosebs | Bronsa: what's post-GSoC look like for you? More CinC? |
| 08:00 | Bronsa | ambrosebs: definitely |
| 08:00 | ambrosebs | Bronsa: sweet! |
| 08:00 | Bronsa | ambrosebs: I have a few things in mind to extend CinC |
| 08:02 | ambrosebs | Bronsa: oh? |
| 08:02 | Bronsa | ambrosebs: I would like to have 2 eval targets: 1 normal compilation (like clojure does) and 1 more static, optimizing compilation that uses aggressive infer-tag and method specialization |
| 08:03 | Bronsa | like clojurescript's :optimizations :simple vs :advanced |
| 08:03 | ambrosebs | Bronsa: are you looking at the same unit of compilation, a form? |
| 08:04 | Bronsa | ambrosebs: yes, but I'm storing the result of tag inferring in the fn's metadata |
| 08:05 | ambrosebs | Bronsa: does that help resolve reflection calls at runtime? |
| 08:07 | ambrosebs | Bronsa: or, what does that do? :P |
| 08:07 | Bronsa | ambrosebs: yes, take for example (defn x [] "foo") (.hashCode (x)) |
| 08:08 | Bronsa | clojure compiles the latter to a call to Reflector/invokeNoArgInstanceMethod or how it's called because the defn is not manually tagged |
| 08:08 | ambrosebs | Bronsa: oh nice. |
| 08:09 | Bronsa | if you tag it ^String it will resolve to String#hashCode but you know that if you redefine x to e.g (defn x [] 1) the compiled (.hashCode (x)) will no longer work |
| 08:09 | Bronsa | I plan on keeping this behaviour in the normal eval |
| 08:09 | Bronsa | and aggressively inferring the return-tag of (x) to String in the optimizing call |
| 08:10 | Bronsa | eval* |
| 08:10 | Bronsa | ambrosebs: also I have a partially written pass that transforms forms like (.hashCode (if true 1 "")) in (if true (.hashCode 1) (.hashCode "")) |
| 08:11 | Bronsa | removing the need for reflection |
| 08:11 | ambrosebs | Bronsa: is it worth following instance? calls to infer accurate types for reflection? |
| 08:12 | Bronsa | ambrosebs: didn't think about it, certainly possible to do |
| 08:14 | ambrosebs | Bronsa: well core.typed uses branches to infer better types via occurrence typing. |
| 08:14 | ambrosebs | Bronsa: you could probably implement something similar. |
| 08:17 | Bronsa | ambrosebs: that would be sweet -- anyway I'm not going to do any of that until I get primitive support in there and make sure CinC can compile itself |
| 08:17 | ambrosebs | Bronsa: good plan |
| 08:22 | ambrosebs | Bronsa: is the analyzer getting close? |
| 08:23 | TEttinger | what's the goal of Clojure in C? better integration with C as opposed to Java? |
| 08:24 | TEttinger | or performance? |
| 08:24 | gleag | Clojure the language or Clojure the implementation? |
| 08:25 | gleag | Oh, "Clojure in C" is probably something I haven't been aware of. |
| 08:25 | Bronsa | ambrosebs: yes, it's actually already complete but I need to simplify the :tag/:cast/:box handling |
| 08:25 | ambrosebs | Bronsa: awesome |
| 08:25 | gleag | Why would such a thing be more desirable than Clojure in Clojure? |
| 08:26 | Bronsa | TEttinger, gleag CinC is a port of the clojure compiler/analyzer to clojure, not in C |
| 08:26 | TEttinger | oh. that makes more sense |
| 08:26 | ambrosebs | :) |
| 08:27 | TEttinger | isn't there a clojure in C project? |
| 08:27 | TEttinger | or am I thinking of something else |
| 08:27 | Bronsa | there should be one |
| 08:27 | TEttinger | well clojure in clojure sounds great |
| 08:27 | Bronsa | https://github.com/schani/clojurec |
| 08:38 | borkdude | I find this amazing… I wrote an fsharp script in 2008, compiled it then in Windows XP, 2008. I'm now installing mono and executing the .exe just works: http://twitter.com/borkdude/status/381751228017160192 |
| 08:38 | borkdude | on Mountain Lion |
| 08:41 | francis_wolke | Killing the JVM associated with nrepl locks my emacs for ~2 minutes. Offhand does anyone know of a way to prevent/bypass this? |
| 08:51 | TEttinger | borkdude, neat |
| 08:51 | TEttinger | now do it with lisp from the 60s |
| 08:53 | borkdude | TEttinger I doubt there are any scripts from the 60s that recursively delete .svn folders ;) |
| 08:54 | TEttinger | perhaps. |
| 10:57 | jave | I wish to build some clojure code within a larger java build. |
| 10:57 | jave | there seems to be a number of options. any hints which one to prefer? |
| 10:58 | jave | for instance, i could call lein from maven, or use the zi mvn plugin, or the clojure-maven-plugin |
| 11:16 | Bracki | How do I fix "No matching method found:" with polymorphic methods in the Java class I'm calling? |
| 11:22 | borkdude | Bracki that should just work I think |
| 11:22 | Bracki | reflect only prints two of the three methods. |
| 11:25 | borkdude | what fundamental difference does it make in having a concatenative style language or applicative - isn't it just the way you write it down? |
| 11:29 | TEttinger | jave, probably a sane option would be separating the clojure into a library |
| 11:30 | TEttinger | if that's not possible, uh... |
| 11:37 | technomancy | francis_wolke: kill all the *nrepl- buffers |
| 11:48 | munderwo | Hi all, I'm following a tutorial for getting started doing REST api with clojure, here is my code.. https://www.refheap.com/d4d4e459cdcd49ee0e2999b0a |
| 11:49 | munderwo | when I try to do leon ring server I get https://www.refheap.com/42fbcf3e33d7ebd78e9b0ca6e … any help? |
| 11:52 | technomancy | or maybe M-x nrepl-disconnect |
| 11:53 | munderwo | my bad. found it. Wrong name for the pool |
| 12:08 | vurma | Regarding the Ritz debugger: I cant seem to get the nrepl-dbg buffer to pop up when i hit breakpoint. Any ideas? |
| 12:09 | vurma | Kind of a pain to have to switch buffer and open the dbg buffer every time i need to sort out an exception. |
| 12:44 | jkj_ | I have an endless sequence coming from I/O. How do I munch the entries so that memory is also freed |
| 12:44 | jkj_ | i need to send each of the entries to another mq |
| 12:46 | jkj_ | i quess doseq |
| 13:12 | rurumate | Is transient recursive, on nested data structure? |
| 13:16 | rurumate | ,(type (:a (transient {:a {}}))) |
| 13:16 | clojurebot | clojure.lang.PersistentArrayMap |
| 13:29 | jowag | Is it valid to say that Clojure Function is a data type? |
| 13:32 | mtp | i would say yes |
| 13:32 | mtp | functions-as-data is an extremely powerful technique |
| 13:39 | indigo | Hm... travis-ci still uses lein1 as default :( |
| 13:42 | seangrov` | jowag: I don't think so no |
| 13:44 | seangrov` | Some things that should work for data types don't work for functions |
| 13:50 | jowag | I'm preparing some kind of a presentation and I want to find a common name for Numbers, Functions, Strings, Vectors. The best I could think of is "Abstractions", but this is too abstract :) |
| 13:50 | jowag | So I wonder if calling them a data types will be OK. More so that in Clojure, code is data |
| 13:50 | AimHere | Data types? |
| 13:51 | seangrov` | AimHere: Do funtions qualify as data types though? |
| 13:51 | AimHere | Isn't that the point of a functional language? |
| 13:52 | AimHere | Functions are 'first class citizens' in that you can do pretty much all of the things you do to other data |
| 13:52 | seangrov` | Yeah, I suppose they're data types then, but not values |
| 13:52 | seangrov` | You can't serialize them, identity fails on then, etc. |
| 13:52 | AimHere | ,(identity identity) |
| 13:52 | clojurebot | #<core$identity clojure.core$identity@c3a340> |
| 13:53 | seangrov` | ,(= "this" "this) |
| 13:53 | clojurebot | #<RuntimeException java.lang.RuntimeException: EOF while reading string> |
| 13:53 | seangrov` | ,(= "this" "this") |
| 13:53 | clojurebot | true |
| 13:53 | seangrov` | ,(= (fn [x] x) (fn [x] x)) |
| 13:53 | clojurebot | false |
| 13:53 | seangrov` | The concept of value/identity is different for functions that more "fundamental" data types |
| 13:54 | seangrov` | than* |
| 13:54 | seangrov` | That said, I'm sure it's fine for an introduction to call them data types |
| 13:54 | jowag | well that is an interesting issue, whether a concrete function can be called a "value" of a Function type |
| 13:55 | seangrov` | It's just a question that floats across #clojure every now and then |
| 13:55 | AimHere | Well the clojure equality function covers a multitude of sins. |
| 13:55 | AimHere | (= [1 2] '(1 2)) |
| 13:55 | AimHere | ,(= [1 2] '(1 2)) |
| 13:55 | clojurebot | true |
| 13:55 | AimHere | ,(= (type [1 2]) (type '(1 2))) |
| 13:55 | clojurebot | false |
| 13:56 | hyPiRion | "sins" |
| 13:58 | AimHere | Ask a mathematician how he feels about x=y being true when f(x)=f(y) is false, and you're fairly likely to get some synonym of 'sinful' ;) |
| 14:00 | hyPiRion | Or flip it around: x = y being false, even when x(a) = y(a) for any a |
| 14:01 | hyPiRion | that's how functional equivalence works in every language with HOF |
| 14:01 | hyPiRion | *function equivalence |
| 14:01 | jowag | ok, I suppose I can call Macro a data type too, but what about nil? :) |
| 14:01 | AimHere | It has a declared type of it's own |
| 14:01 | hyPiRion | nil is nil |
| 14:02 | mtp | a data type is a shape for data, and operations upon that data which may or may not change its shape |
| 14:02 | mtp | that's all |
| 14:02 | Chousuke | I would say a function is equivalent to another function if their definitions are equivalent, in the mathematical sense :P |
| 14:03 | AimHere | Very good. Is there 'data' in a function shape then? |
| 14:03 | Chousuke | well, in the context of a programming language, it's usually not possible to prove that one definition is equivalent to another |
| 14:04 | mtp | AimHere: data and code are the same thing |
| 14:05 | mtp | Chousuke: it's possible if you solve the halting problem! 8) |
| 14:05 | AimHere | There is a difference though; data isn't always considered 'executable' somehow |
| 14:06 | AimHere | Nobody thinks of a .csv file containing the grain exports of Namibia for 2006/2007 as 'code' |
| 14:06 | jowag | In Clojure, we do not execute, we evaluate :) |
| 14:07 | Chousuke | the whole "code is data" thing is supposed to refer to the fact that code can be represented as ordinary data structures which can be transformed just like all other data. |
| 14:07 | hyPiRion | code is data, not vice versa. |
| 14:07 | gfredericks | oh man guys elisp is nutso |
| 14:08 | gfredericks | (eq 42 42) but not (eq 4.2 4.2) |
| 14:08 | hyPiRion | gfredericks: heh, welcome to fixnums |
| 14:08 | Chousuke | comparing floats for equality is broken anyway |
| 14:08 | Chousuke | so it's actually sane behaviour to just return false |
| 14:09 | AimHere | .(= 1.0 (+ 2/3 1/3)) |
| 14:09 | gfredericks | o_O |
| 14:09 | AimHere | ,(= 1.0 (+ 2/3 1/3)) |
| 14:09 | clojurebot | false |
| 14:10 | gfredericks | the weird thing to me is that integers and floats have different object-uniqueness semantics |
| 14:10 | hyPiRion | gfredericks: eq is identical?, not equivalence (=) |
| 14:10 | gfredericks | hyPiRion: yeah, I get that part |
| 14:10 | hyPiRion | AimHere: ##(== 1.0 (+ 2/3 1/3)) |
| 14:10 | lazybot | ⇒ true |
| 14:10 | gfredericks | it's the fact that ints and floats behave differently |
| 14:10 | Chousuke | gfredericks: that's probably because integers have a unique bit pattern for each value |
| 14:10 | Chousuke | floats don't |
| 14:11 | gfredericks | for general numbers, or just infinity/nan/zero edge cases? |
| 14:11 | Chousuke | I'm not sure on the details |
| 14:11 | gfredericks | is there not a machine instruction for this? |
| 14:12 | Chousuke | how would such an instruction be implemented? |
| 14:12 | hyPiRion | gfredericks: ints below a certain size are "pointers" |
| 14:12 | clojurebot | Excuse me? |
| 14:12 | hyPiRion | afaik |
| 14:12 | gfredericks | hyPiRion: I'm getting eq true for arbitrary large integers |
| 14:13 | hyPiRion | gfredericks: (eq 1000000000000000000000 1000000000000000000000) ? |
| 14:13 | gfredericks | Chousuke: I think normally as subtraction and zero-check |
| 14:13 | gfredericks | hyPiRion: that's out of range |
| 14:13 | gfredericks | hyPiRion: I get (eq 500000000 500000000), which is close to the top of the int range |
| 14:15 | gfredericks | there seems to be a test for zero command, so presumably a subtract-and-test mechanism would work? |
| 14:19 | Chousuke | gfredericks: how do you implement subtraction? |
| 14:19 | Chousuke | gfredericks: it's easy for integers, but floats are complicated |
| 14:20 | gfredericks | Chousuke: chips implement subtraction |
| 14:20 | Chousuke | gfredericks: yes. how? |
| 14:20 | gfredericks | compare the exponents, do some shifting, subtract integers, compute new exponent... |
| 14:21 | gfredericks | lots of edge cases for nan/inf |
| 14:21 | munderwo | Hi all. Im using compojure and want to print out the body of a request in a handler. if the handler is declared as (defn get-data [request] …. how would I print out just the body of request? it looks like request is a org.eclipse.jetty.server.HttpInput ? |
| 14:22 | gfredericks | munderwo: you can slurp it |
| 14:22 | gfredericks | it's an InputStream |
| 14:22 | Chousuke | gfredericks: the precision problems with floats are what make equality problematic |
| 14:22 | munderwo | gfredericks: I'm an absolute newbie at clojure. So request is an Stream? so I need to read it rather than it being a java object? |
| 14:23 | Chousuke | gfredericks: so just subtracting and checking for 0 won't work since the result of subtracting two equal numbers might not be zero |
| 14:23 | gfredericks | Chousuke: under what circumstances is subtracting two "equal" numbers not zero? assuming we're aware that rounding happens during other operations |
| 14:24 | gfredericks | munderwo: the arg to your handler should be a map, with :body key. the value under that key should be an input stream that you can pass to slurp to get a string |
| 14:25 | munderwo | gfredericks: so I should be able to do (println {request :body}) to get the input stream? |
| 14:25 | gfredericks | munderwo: you want to print the body of the request? |
| 14:25 | Chousuke | gfredericks: eg. if you get to a number from addition of two numbers, and then compare it with another |
| 14:25 | munderwo | gfredericks: yup. |
| 14:25 | gfredericks | Chousuke: so (+ 2.0 2.0) might not equal 4.0? |
| 14:25 | Chousuke | yes. |
| 14:25 | gfredericks | munderwo: (println (slurp (:body request))) |
| 14:26 | gfredericks | Chousuke: I am skeptical |
| 14:26 | Chousuke | gfredericks: or rather, 4.0 - (2.0 + 2.0) might not equal exactly 0 |
| 14:26 | munderwo | gfredericks: thanks! Im still figuring out syntax. Im doing the dive in head first and hopefully learn my osmosis.. cheers!~ |
| 14:26 | gfredericks | ,(- 4.0 (+ 2.0 2.0)) |
| 14:27 | clojurebot | 0.0 |
| 14:27 | gfredericks | ,(= (- 4.0 (+ 2.0 2.0)) 0.0) |
| 14:27 | clojurebot | true |
| 14:27 | Chousuke | I'm not talking about those exact numbers mind you |
| 14:28 | gfredericks | I'm aware of the way that floating point numbers round under arithmetic operations |
| 14:28 | gfredericks | what is your concept of "equality" that is distinct from "zero after subtraction"? |
| 14:28 | gfredericks | are you simply pointing out the difference between mathematical reals and IEEE doubles? |
| 14:29 | Chousuke | mathematical equality is what I'm concerned with |
| 14:30 | Glenjamin | i usually do "near zero" after subtraction |
| 14:30 | Glenjamin | then you'll want some symbolic math stuff i guess |
| 14:30 | gfredericks | it sounded like you were saying that comparing two floats is not a useful thing to do. So if I do (= x y) and it returns false, what might I be accidentally missing if I assume they are not equal? |
| 14:31 | gfredericks | in what sense might those numbers, ignoring how I obtained them, still be equal? |
| 14:33 | Glenjamin | ,(= 1.2 (+ 1.0 1.2)) |
| 14:33 | clojurebot | false |
| 14:33 | Glenjamin | erm |
| 14:33 | Glenjamin | whoops! |
| 14:33 | Glenjamin | ignore me please. |
| 14:33 | Chousuke | :P |
| 14:33 | Glenjamin | ,(= 1.2 (+ 1.1 0.1)) |
| 14:33 | clojurebot | false |
| 14:33 | gfredericks | I wouldn't expect those two to be equal necessarily |
| 14:34 | gfredericks | I assume that they have been rounded slightly different and so are in fact distinct numbers |
| 14:34 | Chousuke | gfredericks: the equality check can return false even if two things are actually equal. that's the problem. |
| 14:34 | Glenjamin | thats what i meant. |
| 14:34 | Glenjamin | from a maths point of view, thats a weird statement, floating point is an implementation detail |
| 14:34 | gfredericks | Chousuke: I'm trying to get at what you mean by "actually equal" |
| 14:34 | Chousuke | gfredericks: like the above |
| 14:35 | gfredericks | Chousuke: but I don't expect those to be equal |
| 14:35 | Chousuke | 1.1 + 0.1 is equal to 1.2 |
| 14:35 | gfredericks | not for floating point numbers |
| 14:35 | Chousuke | but in the implementation, that equality is broken, so the implementation of equality is broken. |
| 14:35 | gfredericks | ,(- 1.2 (+ 1.1 0.1)) |
| 14:35 | clojurebot | -2.220446049250313E-16 |
| 14:35 | Chousuke | therefore it should not be trusted. |
| 14:35 | gfredericks | Chousuke: why is this not an issue with rounding rather than equality? |
| 14:36 | hyPiRion | what is "it"? |
| 14:36 | Chousuke | gfredericks: because the rounding appears in the implementation rather than explicitly. |
| 14:36 | gfredericks | Chousuke: IEEE does not specify how to round the result of an addition? |
| 14:37 | gfredericks | hyPiRion: I think he's arguing that (= x y) is never useful for floats |
| 14:37 | hyPiRion | oh |
| 14:37 | gfredericks | or rather |
| 14:37 | gfredericks | that it can return incorrect results |
| 14:37 | gfredericks | or is "broken" in some sense |
| 14:38 | gfredericks | I thought at first that he meant that e.g. you can represent 4 as both 1*(2^2) and 2*(2^1) and that = would consider them different |
| 14:38 | Glenjamin | i think it boils down to: is 1.2 a decimal, or a float? |
| 14:38 | gfredericks | in clojure it's a float |
| 14:39 | hyPiRion | gfredericks: nah, = handles that |
| 14:39 | hyPiRion | ,(= 0.0 (- 0.0)) |
| 14:39 | clojurebot | true |
| 14:39 | gfredericks | hyPiRion: and now that I think about it I don't think there can be distinct representations like that anyways |
| 14:39 | hyPiRion | gfredericks: except for zero, no. |
| 14:40 | Chousuke | gfredericks: the rounding behaviour of floats makes equality checks not robust, which makes it not very useful; unless I suppose you do explicit rounding of values. |
| 14:40 | hyPiRion | a number is always represented as [+-] 0.mantissa * 2^exponent |
| 14:40 | gfredericks | Chousuke: the equality check tells me if two numbers are equal. You can argue that this isn't very useful due to rounding, but I don't think you can argue that it doesn't do that at all. |
| 14:41 | hyPiRion | exponent minus base |
| 14:41 | gfredericks | hyPiRion: I remember there being an implicit first 1 digit but I can't remember where/why |
| 14:41 | Chousuke | gfredericks: well, it does it with some warped sense of equality |
| 14:41 | gfredericks | Chousuke: maybe we're just arguing semantics at this point but that seems like a misleading way to phrase it |
| 14:41 | Chousuke | but I guess this goes back to the implementation thing |
| 14:42 | hyPiRion | gfredericks: yeah, that may well be the case. I just remember that all but plus minus zero can only be represented in one way |
| 14:42 | gleag | gfredericks: Isn't any Lisp that converts 1.1 into FP sort of broken? |
| 14:42 | gfredericks | gleag: why broken? |
| 14:43 | gleag | gfredericks: Given that FP semantics isn't what you want for lispy numerals most of the time, intepreting 1.1 as anything else as 11/10 in the generic context seems like a language design bug to me. |
| 14:44 | gfredericks | gleag: "not being what you want" is different from "broken" |
| 14:45 | gfredericks | the word "broken" implies to me that it was meant to be something else |
| 14:45 | metellus | but at the same time "correct for a very specific thing nobody wants" is poor design |
| 14:45 | gfredericks | sure |
| 14:46 | gleag | gfredericks: Accoring to this logic, C has a non-broken memory management. Why would Clorure treat 1.1 as FP, when two decades of Common Lisp and Scheme yielded a more meaningful design? |
| 14:46 | hyPiRion | It sounds like you guys have been discussing definitions for some time now |
| 14:46 | gfredericks | I bet you could easily make the case that floating point should be no more accessible in clojure than java arrays |
| 14:46 | hyPiRion | gleag: (floatp 1.1) in CL is T, (rationalp 1.1) is NIL |
| 14:47 | gfredericks | gleag: hyPiRion is right, this is just definitions |
| 14:53 | gleag | hyPiRion: I'm not saying that CL in general is the pinnacle of the development of lispy arithmetics, but the Scheme way of exact-by-default makes much more sense to me. |
| 14:53 | gleag | (and the Scheme model certainly builds upon the CL model) |
| 14:53 | gfredericks | afaict 4.2 is not exact in scheme either |
| 14:54 | gfredericks | so I can't tell what difference you're trying to point out |
| 14:54 | gleag | That is weird. |
| 14:55 | gfredericks | I don't know that I've ever heard of a language that uses not-floats for that syntax |
| 15:01 | Scorchin | I've had a play around and core.async looks like a decent way to do the kind of small processing I need (I expect there to be at least ~500 go blocks at a time), but is there a an easy way to get a function to add itself onto a channel once it's completed with a schedule? e.g. run a go block and post to a channel every X milliseconds? The (timeout) channel |
| 15:01 | Scorchin | creator almost does it, but closes the channel after the time provided. |
| 15:02 | gfredericks | Scorchin: some combination of loop and sleep? |
| 15:03 | gfredericks | I guess that uses a thread |
| 15:03 | gfredericks | you could create a new timeout channel each time |
| 15:03 | Scorchin | Is that all? |
| 15:03 | Scorchin | gfredericks: I intend to split this channel for different output formats |
| 15:06 | Scorchin | erm, not split |
| 15:11 | gleag | gfredericks: I must have been spoiled by the HtDP languages! |
| 15:11 | gleag | gfredericks: (exact? 12.3) ==> true ; (exact? #i12.3) ==> false |
| 15:12 | gleag | It just seems such a reasonable idea (you can always coerce implicitly if needed) that I apparently assumed that it was more widespread. |
| 15:18 | allenj12 | hey im new to clojure and was wondering if i could make a priority map with two lists? |
| 15:18 | TimMc | allenj12: Remind me what a priority map does, again? |
| 15:19 | allenj12 | TimMc: it has a key and a value for each slot so like [:a 1 :b 2 :c 3] and sorts it by the value |
| 15:20 | allenj12 | so if i want one list to be the key |
| 15:20 | allenj12 | TimMc: and i wanted the other list to be the values |
| 15:21 | yazirian | ,(doc zipmap) |
| 15:21 | clojurebot | "([keys vals]); Returns a map with the keys mapped to the corresponding vals." |
| 15:21 | yazirian | like that? |
| 15:21 | metellus | you could also use sorted-map-by |
| 15:22 | metellus | instead of two lists |
| 15:23 | TimMc | sorted-map-by doesn't give you access to the values |
| 15:23 | TimMc | s/you/the comparator/ |
| 15:27 | yazirian | allenj12: https://github.com/clojure/data.priority-map |
| 15:28 | yazirian | so maybe pass a zipmap to that -- this depends on your needs re: duplicate values somewhat |
| 15:28 | allenj12 | yazirian: hmm kk ill try that |
| 15:41 | Bracki | What's the prefered way for default args? Multi arity fns or maps with defaults? |
| 15:42 | coventry` | I've seen multiarity more often than maps with defaults. |
| 15:43 | Bracki | coventry`: Also for stuff like: hostname, port, password, username etc? |
| 15:44 | coventry` | Haven't read much of that kind of code. |
| 15:48 | technomancy | depends on whether you care about getting errors when given too many args |
| 16:05 | Bracki | When wrapping Java libs, do I need to alias everything with my own names or can I expose the underlying API? |
| 16:05 | Bracki | s/need/should |
| 16:06 | gfredericks | I think clojure style is not to introduce unnecessary abstraction |
| 16:06 | coventry` | "It's complicated." http://www.infoq.com/presentations/Distilling-Java-Libraries |
| 16:06 | gfredericks | so if you're just wrapping it for the sake of using kebab-case, then don't |
| 16:06 | hhenkel | Hi all, I got a a map that represents config data. This config contains a subtree with multiple "domains" and one domain could habe multiple "servers". What is the clojure way of iterating over such thing? |
| 16:07 | hhenkel | I got a working code, but it "feels not right" as a I use nesed "doseq"... |
| 16:07 | callen | I broke the Clojure Cup layout :) http://clojurecup.com/apps.html |
| 16:08 | technomancy | gfredericks: but completion |
| 16:08 | gfredericks | technomancy: you talkin bout stuff not appearing in your source? |
| 16:08 | technomancy | just messing with you |
| 16:08 | gfredericks | PHEW |
| 16:08 | technomancy | gfredericks: were you at strange loop? |
| 16:09 | gfredericks | technomancy: no I just had a babby |
| 16:09 | technomancy | oh that's right; congrats |
| 16:09 | gfredericks | thx |
| 16:10 | gfredericks | did hofstadter reveal the essence of conciousness? |
| 16:11 | technomancy | that man has some ideas. |
| 16:11 | gfredericks | when I make a list that contains itself does the list become conscious? |
| 16:12 | technomancy | you're thinking of thermostats |
| 16:13 | callen | (inc gfredericks) |
| 16:13 | lazybot | ⇒ 30 |
| 16:15 | Bracki | Can anybody point me to a leiningen setup that requires a vagrant box to be spun up for integration testing? |
| 16:16 | callen | That sounds like a lot of work. Not it. |
| 16:16 | Bracki | Not it what? |
| 16:17 | callen | Not it. Can't draw my straw. |
| 16:17 | sandbags | if i am running a clojure app via java -jar on the command line is there a way to drop into a repl at a certain point in my program and query the local variables? (similar to using the Pry utility if you're familiar with that from Ruby)? |
| 16:17 | callen | sandbags: embedding an nrepl instance came up not too long ago. |
| 16:17 | callen | common request. |
| 16:18 | sandbags | callen: ah so requested, but not doable? |
| 16:18 | sandbags | i'm googling embedded nrepl now |
| 16:18 | callen | perfectly doable. |
| 16:18 | callen | as your google will show you. |
| 16:18 | Bracki | callen: Can your paraphrase "Not it. Can't draw my straw." for a non native speaker please. |
| 16:18 | coventry` | sandbags: http://clojure-log.n01se.net/date/2013-09-21.html#22:35 |
| 16:19 | sandbags | callen: got you, misread you as meaning common request for clojure, not here. thanks. |
| 16:19 | sandbags | coventry`: oh, thank you |
| 16:19 | callen | Bracki: amongst children, if a chore or unpleasant task is mentioned, people will declare, "not it" immediately after its mention so as to disinclude themselves from having to do it. |
| 16:19 | coventry` | Oh, if you want access to the local variables, that's not going to give it to you, I think. |
| 16:19 | callen | then you're in Ritz territory. |
| 16:19 | coventry` | callen: not necessarily. https://coderwall.com/p/xayyvq |
| 16:20 | Bracki | callen: Ah as in "not me". |
| 16:20 | callen | Bracki: yep |
| 16:20 | callen | coventry`: eh. that's like jahad's thingy and limit-break. |
| 16:20 | callen | coventry`: the locals clearing fucks you anyway. |
| 16:20 | coventry` | Yeah. |
| 16:21 | sandbags | coventry`: i want to be able to explore the state of a function at a certain point, yes .. is this related to eval? I've bumped into a related issue in the past i think |
| 16:23 | Bracki | Since I didn't do Clojure in a long while, does this look alright? https://github.com/bracki/clj-nsca/blob/master/src/clj_nsca/core.clj |
| 16:25 | callen | Bracki: ideally there'd be an actual API separating the Java objects from the Clojure. |
| 16:27 | coventry` | It's typical to thread strings of java method calls with (doto) rather than (->), but it doesn't make any difference in this case. http://clojuredocs.org/clojure_core/1.2.0/clojure.core/doto |
| 16:29 | Bracki | callen: What kind of separation? |
| 16:32 | sandbags | coventry`: that's odd, i can't find that macro in my copy of joy of clojure |
| 16:33 | coventry` | sandbags: Its in one of the later chapters. There's a subheading in the TOC which mentions debugging, I think. |
| 16:33 | sandbags | i think it's the Preview search that's at fault |
| 16:34 | sandbags | possibly this MEAP copy isn't well indexed |
| 16:34 | sandbags | ah found it in my copy of 1st which does have an index :) |
| 16:35 | coventry` | print-dup is outputting "#=(clojure.lang.APersistentVector/create [x])" in a certain context. It should be just outputting "[x]". Anyone know what prefer-method command I want to persuade it to do that? |
| 16:35 | sandbags | okay so is it likely to be a problem combining that break macro with running via lein uberjar/java? |
| 16:36 | sandbags | the break part works but anything I try to do from that REPL seems to give me some variation on "Invalid method Code length 105966 in class file clojure/core$eval12, compiling:(NO_SOURCE_PATH:0:0)" |
| 16:38 | coventry` | Is there an easy way to figure out which multimethod a given argument is dispatched to? |
| 16:41 | AimHere | You could just call the dispatch function and inspect the answer! |
| 16:42 | coventry` | Dispatch function is (class). (ancestors clojure.lang.APersistentVector) returns 22 possibilities. |
| 16:45 | AimHere | But the dispatch function only has one value and I think defmethod only takes one dispatch value |
| 16:46 | AimHere | The only source for confusion is if you don't know what class the object you're passing in is |
| 16:46 | coventry` | AimHere: The dispatch can be ambiguous. That is the reason for multimethods. See 3rd paragraph of http://clojure.org/multimethods |
| 16:46 | coventry` | "reason for prefer-method" |
| 16:49 | coventry` | How the hell is it getting APersistentVector anyway? That's an abstract class. |
| 16:51 | callen | sandbags: that's because it's not a real debugger :) |
| 16:52 | callen | sandbags: Ritz is possibly closer to what you want |
| 16:52 | sandbags | callen: ah, thanks ... i'll have a look at Ritz |
| 16:53 | sandbags | or maybe i'll just go back to repetitive pprint |
| 16:54 | sandbags | if only clojure.inspector/inspect worked properly |
| 16:54 | sandbags | it's pretty much all i need |
| 16:55 | callen | sandbags: I've been having a nice time with clojure.tools.trace lately. |
| 16:55 | callen | I found clojure.tools.trace more efficient in terms of debugging time than a stepping debugger |
| 16:56 | callen | less manual, you just read what happened. |
| 16:57 | sandbags | i've gotten used, in Ruby, to being able to just drop into any context using pry and poke around ... not so much single-stepping as being able to x-ray a point from different perspectives |
| 16:57 | coventry` | sandbags: ritz has an inspector. I don't remember how good it is for exploring large hierarchical datastructures, though. |
| 16:57 | sandbags | i'll have a look at trace also |
| 16:57 | coventry` | trace is great if the data structures are simple. |
| 16:58 | sandbags | the problem with embedding traces in my experience is that it may take several goes to figure out what you really need to see, so being able to poke about with the tools of your language |
| 16:58 | napper | hey all, python convert here. I want to do this: self._item = container OR "this instead" - how do I accomplish this in clojure? |
| 16:58 | sandbags | is a good thing |
| 16:59 | coventry` | napper: if-let for the RHS. You may not need a LHS. |
| 16:59 | sandbags | i guess lein-ritz is what i'm after |
| 17:01 | coventry` | napper: Sorry, that's wrong. (or container "this instead.") |
| 17:01 | sandbags | but - googling - it looks like it may be something of a labour to get it all setup for a relative newcomer like myself |
| 17:01 | coventry` | sandbags: Yes, ritz was pretty hard to get going when I looked at it about 6 weeks ago. |
| 17:01 | napper | coventry: perfect |
| 17:02 | napper | coventry, thanks |
| 17:02 | sandbags | hrmm.. it looks above my paygrade right now and i fear i am losing sight of solving my actual problem :) |
| 17:05 | sandbags | hrmmm inspect-table actually seems to work reasonably well |
| 17:35 | callen | napper: (let [item (or container "this instead")] ) |
| 17:36 | callen | coventry: that's not a very idiomatic recommendation if you look at how Python uses what he's asking about. |
| 17:36 | callen | if-let is for fallback behavior after the binding, not falling back the binding itself. |
| 17:36 | callen | falling back the binding itself is what the Python code is doing. |
| 17:38 | indigo | Race conditions ftw |
| 17:46 | coventry | callen: Yes, it was a mistake to recommend if-let. Thanks for re-iterating that. |
| 17:47 | callen | ,(let [items (or [] "[] isn't falsy") item (or nil "but nil is")] [items item]) |
| 17:47 | clojurebot | [[] "but nil is"] |
| 17:48 | callen | napper: ^^ |
| 17:48 | callen | napper: do the Clojure Koans, they hammer this stuff in. |
| 17:59 | mklappstuhl | (csv/read-csv file :seperator \t)) |
| 18:00 | mklappstuhl | how do I get clojure.csv to use a tab character as seperator? |
| 18:01 | mklappstuhl | ok, first mistake was mistyping sepArator |
| 18:01 | allenj12 | is there any place where i can paste code and share a link of that code so i can ask a question? |
| 18:01 | s4muel | allenj12: refheap.com |
| 18:01 | mklappstuhl | allenj12: gist.github,com |
| 18:07 | allenj12 | https://www.refheap.com/18898 can anyone help me with this i asked the question in the a-star defn |
| 18:11 | metellus | allenj12: (filter #(possible-move % board) *moves*) I think |
| 18:13 | allenj12 | metellus: yes! ty really should get use to thos anonymous functions |
| 18:13 | gaYak | Yuck "not=". |
| 18:13 | allenj12 | lol? is that bad? |
| 18:14 | allenj12 | im new to clojure so critques on everything would be great :) |
| 18:14 | gaYak | I'm not an expert on Clojure, but looking with Scheme eyes.. it looks horrible ;) |
| 18:15 | gaYak | To me (not (= .. )) just looks more readable. |
| 18:16 | allenj12 | ahh k thanks for the tip i kinda like that to |
| 18:20 | mklappstuhl | how do I get a tab character as java.lang.Character? |
| 18:20 | Bronsa | \tab |
| 18:25 | TEttinger | gaYak, not= is the same as != in java. I think ! is used primarily for other stuff, like swap! and reset! so they spelled it out |
| 18:25 | TEttinger | I think there may be some tiny speed difference, but I don't think it's obvious |
| 18:26 | TEttinger | (not (= ... is two function lookups is all |
| 18:26 | gaYak | That's the compiler's job to fix |
| 18:26 | gaYak | Well, JITs in this case. |
| 18:26 | TEttinger | well yes, JIT will kick in after 20,000 calls |
| 18:27 | gaYak | That brings me thinking, are there any blog posts about JIT & Clojure? For Java I've seen many, where it's been discussed how often JIT will inline some methods, based on their length etc |
| 18:27 | TEttinger | that's a good question |
| 18:28 | s4muel | forgive me if this sounds crazy but is there a notion of 'warming' the JIT for optimizing certain code paths? |
| 18:28 | TEttinger | AOT I think does a good job, s4muel, but I don't know if JIT works after AOT has been done |
| 18:29 | TEttinger | s4muel, I think it is done, but in the apps where it really matters those code paths get called 20,000 times anyway |
| 18:29 | s4muel | True |
| 18:52 | TEttinger | looks like AOT does not prevent JIT from occuring later, it just prevents the startup compilation to .class files |
| 18:52 | TEttinger | so s4muel, warming would still be useful if you can predict the path the code will take |
| 19:30 | rhg | i have a small question how can you write a fn to use in the ns macro, i was hoping for a :require-nodejs |
| 19:32 | brehaut | rhg: i dont know if ive ever seen that documented anyway; might be time to hit the source for core |
| 19:32 | brehaut | https://github.com/clojure/clojure/blob/master/src/clj/clojure/core.clj#L5214-L5268 |
| 19:34 | rhg | thx |
| 19:35 | brehaut | rhg i would guess you are looking at references and process-reference but im not 100% on that |
| 19:35 | brehaut | ,`(~(symbol "clojure.core" (clojure.core/name kname)) |
| 19:35 | brehaut | ~@(map #(list 'quote %) args)) |
| 19:35 | clojurebot | #<RuntimeException java.lang.RuntimeException: EOF while reading> |
| 19:36 | ToBeReplaced | generally, should i try to keep my go blocks close to my puts, or does it not matter? |
| 19:36 | rhg | ah |
| 19:37 | ToBeReplaced | ex (go (with-open (doseq (>! ... )))) or (with-open (go (doseq (>! ...)))) |
| 19:37 | rhg | well id now if it was a ns but nodes modules are js "objects" |
| 19:37 | rhg | know* |
| 19:38 | brehaut | rhg: oh, i might have sent you to clojure.core rather than cljs.core btw |
| 19:38 | rhg | basically how can i declare a var in a fn |
| 19:40 | brehaut | rhg: it looks like what clojure.core/ns does is get the name of the keyword and then look it up in the clojure.core namespace and pass the rest in as arguments. as you wont be able to jam anythign into clojure.core, i think augmenting ns is out of bounds |
| 19:41 | brehaut | also |
| 19:41 | brehaut | ,,(ns foo.bar (:print [1])) |
| 19:41 | clojurebot | [1] |
| 19:41 | brehaut | lol |
| 20:01 | rhg | so it's a dead-end |
| 20:01 | rhg | oh well back to the refer-node macro |
| 20:09 | SegFaultAX | bbloom: Watched your talk on Factjor last night. Seems like a pretty interesting project. I especially like the direction you took it with domscript. Is that a project you're still actively hacking on? |
| 20:16 | rhg | ugh i can't even compile js now i get java.io.FileNotFoundException: out/constants_table.js running ./bin/cljsc |
| 20:17 | rhg | im begginning to think cljsc hates me |
| 20:19 | rhg | hmm, advanced optimizations are broken |
| 20:22 | srruby | How do I get ["john" "jane"] from [ {:name "john"} {:name "jane" } {:name "fred"} ] I can use filter and map but I'm thinking there must be a more idiomatic way. Thanks. |
| 20:23 | llasram | srruby: Is this for a programming exercise, or just something you're trying to do? |
| 20:23 | srruby | Sorry, I meant this: How do I get ["john" "jane"] from [ {:name "john"} {:name "jane" } {:type "foo"} ] I can use filter and map but I'm thinking there must be a more idiomatic way. Thanks. |
| 20:24 | brehaut | srruby: keep |
| 20:24 | brehaut | ,(keep :name [ {:name "john"} {:name "jane" } {:type "foo"} ] ) |
| 20:24 | clojurebot | ("john" "jane") |
| 20:24 | srruby | I'm trying to do it as I hack away at clojure. Thanks!! |
| 20:25 | brehaut | ,(keep identity [true false nil ""]) |
| 20:25 | clojurebot | (true false "") |
| 20:26 | srruby | llasram: Not sure what you mean by programming excercise... I'm not in a clojure class. |
| 20:26 | brehaut | srruby: sure, but some people are and they just want their exercises done for them |
| 20:26 | brehaut | which is a waste of everyones time |
| 20:27 | llasram | srruby, brehaut: Well, I was more assuming that if it was for like a 4clojure problem, srruby wouldn't want me just giving away the full answer :-) |
| 20:28 | rhg | how do you require macros in cljs? |
| 20:28 | rhg | require-macros? |
| 20:31 | ToBeReplaced | rhg: yes |
| 20:31 | rhg | how excatly |
| 20:31 | rhg | do you pass the ns |
| 20:44 | rhg | ,(doc split-at) |
| 20:44 | clojurebot | "([n coll]); Returns a vector of [(take n coll) (drop n coll)]" |
| 20:44 | rhg | oops |
| 20:45 | rhg | wrong chan |
| 21:20 | callen | I'm pondering a wrapper DSL for datalog. |
| 21:20 | brehaut | codatalog |
| 21:21 | callen | Well there are a few design parameters I have in mind. One is that I'd rather not directly link the query patterns to datomic if possible. |
| 21:21 | callen | datalog is abstractable, so that's not too big of a problem, but I'd also like to enable some custom post-processing. |
| 21:21 | callen | brehaut: cute. |
| 21:21 | coventry | Is there a way to add metadata to a var? |
| 21:21 | coventry | ,(with-meta #'clojure.core/map {:foo true}) |
| 21:21 | xeqi | coventry: looks like your analyzer is further then I got, thanks for the reference |
| 21:21 | clojurebot | #<ClassCastException java.lang.ClassCastException: clojure.lang.Var cannot be cast to clojure.lang.IObj> |
| 21:21 | callen | I'm also concerned datalog might intimidate people. |
| 21:22 | coventry | xeqi: No worries. |
| 21:22 | coventry | The research was actually useful in extending riddley to deal with the dot special form. :-) |
| 21:22 | xeqi | i had played some with jvm.analyze, and was leary to pull it in here cause I don't want to eval the forms |
| 21:23 | callen | xeqi: leery* |
| 21:23 | callen | you're not taking LSD, you're just mistrustful. |
| 21:26 | ToBeReplaced | with core-async, if you want to drain a channel into a seq, is the "right" way (take-while (complement nil?) (repeatedly #(<!! channel))) |
| 21:29 | callen | ToBeReplaced: seems like a standard naive channel drain. Maybe toss in an alt and a timeout? |
| 21:29 | callen | I don't mean naive pejoratively, to be clear. |
| 21:29 | ToBeReplaced | callen: thanks, just sanity checking -- not using it for prod code, just testing |
| 21:30 | ToBeReplaced | i've got readers that need to be parsed... previously was dumping the elements onto LBQ, trying it out with channels |
| 21:30 | callen | ToBeReplaced: seems reasonable for poking around. In production you have to be a bit more paranoid/Erlang-esque about it. |
| 21:31 | ToBeReplaced | callen: does it seem reasonable for a function to accept an input stream and return a channel? i can't really follow the implications |
| 21:33 | callen | ToBeReplaced: do whatever works if you're learning/experimenting. Don't tread lightly when experimenting, just ruins opportunities for learning (breakage) |
| 21:33 | callen | if something broke that you didn't expect to - you're about to learn something. Do not fear that. |
| 21:34 | ToBeReplaced | callen: word |
| 21:35 | munderwo | hey has anyone use debug-repl? is there something better to use? if you want to break into an inline debugger? |
| 21:35 | callen | munderwo: there's limit-break as well. You're going to need to turn off locals clearing as well. |
| 21:35 | callen | (alter-var-root #'*compiler-options* assoc :disable-locals-clearing true) |
| 21:35 | callen | otherwise shit won't be there that should be :) |
| 21:36 | munderwo | callen: is that line put in the module that I'm breaking into? or like the project.clj ? |
| 21:36 | callen | just somewhere top-level that gets loaded in your actual code, not project.clj |
| 21:36 | munderwo | callen: also is it a 50/50 between them? |
| 21:36 | callen | the project.clj is closer to a (but not precisely) data structure than code. |
| 21:36 | callen | munderwo: debug-repl and limit-break are both done'ish to the extent they are designed to handle. They're based on the same code. |
| 21:37 | munderwo | callen: cool. I thought that might be the case. just starting out, so getting a handle on the tooling etc. |
| 21:37 | callen | munderwo: limit-break was kind of a post-debug-repl wrap-up by technomancy. jahad pokes at debug-repl occasionally if I irritate the shit out of him about it. |
| 21:37 | callen | munderwo: Clojure's interactive debugging story isn't great right now. I've had more successful using clojure.tools.trace, michael drogalis' night-vision and plain old thinking. |
| 21:38 | callen | particularly given that most of my code is pure anyway, debugging is of limited use. if I understand the code, there's not much else to think about, hypothetically. |
| 21:38 | munderwo | callen: ahh ok. I might be a little spoiled from python. :) |
| 21:38 | callen | munderwo: I came here from Python too. you think it was being spoiled, but eventually you learn referential transparency and the like was more valuable anyway. |
| 21:38 | callen | I don't find I miss debuggers when dealing with my own code anymore. |
| 21:39 | callen | munderwo: I used to think as you do. I wouldn't sweat it. |
| 21:39 | callen | I might start using debug-repl/limit-break again just to see if things can be improved. |
| 21:39 | callen | I want a real injectable REPL someday. |
| 21:40 | munderwo | callen: good to know. I thought that perhaps a debugger might help me learn the syntax, like step through some stuff. I've basically just dived into porting a simple rest api over to clojure. |
| 21:40 | munderwo | callen: yeah I think its helpful sometimes to be able to do that. especially if you have a chain of execution that your not sure of whats happening. That might be less of an issue in clojure. |
| 21:42 | munderwo | callen: oh also, is there a way around the slow startup time of the JVM? I had a look at drip and installed it, but it hasn't made a dramatic improvement. |
| 21:44 | munderwo | hmm… anybody any idea about whats wrong with this? https://www.refheap.com/abec9999a49cf668cca3bc4f1 |
| 21:46 | callen | munderwo: if you're learning, just live in the REPL. |
| 21:46 | callen | munderwo: this is why you need to be in the REPL, so you can inspect foodtruck |
| 21:47 | munderwo | callen: yeah at the moment i'm firing http queries at my app through the repl. |
| 21:47 | callen | munderwo: if you did, you'd see that your keyword against the foodtruck var is producing nil, causing your slurp to fail. |
| 21:47 | callen | it doesn't know how to do IO against a nil. |
| 21:47 | callen | that's what the protocol error means. |
| 21:47 | munderwo | but how do I get the repl to be in the midst of a request? |
| 21:48 | callen | munderwo: if you were using clojure.tools.trace, you would've seen log output for your request handler, thereby dumping foodtruck to the terminal. |
| 21:48 | callen | then you'd see exactly what is going on |
| 21:48 | callen | just change the defn to deftrace for your create-new-foodtruck handler. |
| 21:49 | callen | after loading deftrace from c.t.t |
| 21:49 | callen | munderwo: also there's nothing special about web apps, you can load them from your REPL and interact with them like any other code. |
| 21:49 | munderwo | right. do I need to do a (:use clojure.tools.trace) ? up the top of the module? |
| 21:49 | callen | there's no magic here. |
| 21:49 | callen | munderwo: try to avoid use. Use require instead. |
| 21:50 | munderwo | why avoid use? |
| 21:50 | callen | it's very bad form. |
| 21:50 | callen | the same thing in Python is very bad. |
| 21:50 | callen | you shouldn't from module import * in Python either. |
| 21:50 | muhoo | ~use |
| 21:50 | clojurebot | I am putting myself to the fullest possible use, which is all I think that any conscious entity can ever hope to do. |
| 21:50 | callen | it makes it impossible to know what the fuck is going on. |
| 21:50 | callen | munderwo: (:require [clojure.tools.trace :refer [deftrace]]) |
| 21:51 | munderwo | ahhh I see. cool. understand now. |
| 21:51 | callen | When my coworkers use 'use, I let them pick which limb they're giving up. |
| 21:51 | callen | There's a wall of limbs, but not many. They learn fast that way. |
| 21:52 | munderwo | nice :) |
| 21:53 | callen | muhoo: pretty terrible response from the bot. It needs retaught. |
| 21:53 | callen | batty bastard bot. |
| 21:53 | munderwo | is there a difference between (:require [compojure.handler :as handler][ring.middleware.json :as middleware]) and (:require [compojure.handler :as handler])(:require [ring.middleware.json :as middleware]) |
| 21:53 | callen | munderwo: the latter is bad style. |
| 21:53 | callen | munderwo: one :require form per ns decl plz. |
| 21:53 | callen | munderwo: do you have a book? |
| 21:54 | callen | munderwo: http://clojurebook.com/ |
| 21:54 | munderwo | good to know. not yet. just going through tutorials. |
| 21:56 | sinistersnare | hello, im trying to get libgdx setup with clojure. im running into an error which ill post in a second. from what ive read it has to do with some mistaken syntax somewhere, and i was wondering if anyones open to helping. https://gist.github.com/sinistersnare/6665526 heres the code so far |
| 21:56 | munderwo | callen: is clojure.tools.trace in the standard lib? or needs to be dep for lein to download? |
| 21:57 | sinistersnare | actually i think i fixed that |
| 21:57 | sinistersnare | https://www.refheap.com/18904 |
| 21:57 | sinistersnare | ok, so my actual problem is of scoping |
| 21:58 | sinistersnare | where can i put spawn-raindrop so that it has access to all of the variables of screen? |
| 22:01 | callen | munderwo: google it |
| 22:02 | munderwo | I think i found it on clojars |
| 22:02 | sinistersnare | im not the best at clojure, so im not good at idiomatic stuff, so if you want to criticize my imperative style too, please help me :p |
| 22:02 | munderwo | which to me would indicate that its a third party |
| 22:03 | callen | munderwo: get in the habit of googling for your libraries and lining up github with what's in clojars. |
| 22:03 | callen | don't expect other people to do it for you. waste of time. |
| 22:04 | callen | Ask other people for help when you've exhausted all sensible means in front of you (google, stack overflow, reading the damn code) |
| 22:04 | callen | asking trivial questions just makes people not want to help you. |
| 22:05 | munderwo | yeah, just found the github page. the namespace for it 'clojure.tools.trace' seemed to indicate it was in the stdlib |
| 22:05 | munderwo | (or equivalent) |
| 22:05 | noonian | sinistersnare: too many arguments to def usually means you used a def where you wanted a defn |
| 22:05 | sinistersnare | I JUST FIGURED THAT OUT! |
| 22:05 | sinistersnare | :p now im getting a runtime error i guess |
| 22:05 | sinistersnare | Exception in thread "LWJGL Application" java.lang.IllegalStateException: Function is not supported |
| 22:05 | sinistersnare | LibGL error though |
| 22:12 | sinistersnare | ok so i guess i cant use libgdx because im using openGL 1.4, even though it works in java! |
| 22:12 | sinistersnare | weird |
| 22:13 | ToBeReplaced | i'm seeing reflection in clojure core.async go blocks -- others see this? |
| 22:17 | sinistersnare | how can i use a sontype repo for my leiningen setup? |
| 22:22 | bbloom | $mail segfaultax I'm not hacking on factor & domscript directly, but some of the core ideas & learnings live on in other projects I'm working on |
| 22:22 | lazybot | Message saved. |
| 22:26 | timvisher | any way to increase the heap size for the compiler run by cljsbuild? |
| 22:28 | gfredericks | is there any reason why attaching metadata to a lazyseq should force the first element? |
| 22:28 | bbloom | timvisher: use the jvm opts for lein |
| 22:29 | gfredericks | ,(let [s1 (map println '(1 2 3))] (with-meta s1 {}) nil) |
| 22:29 | clojurebot | 1\n |
| 22:29 | brehaut | gfredericks: because a lazy seq can be empty? |
| 22:29 | gfredericks | ,(with-meta () {:this :is :empty :too}) |
| 22:29 | clojurebot | () |
| 22:29 | brehaut | ,(seq nil) |
| 22:29 | clojurebot | nil |
| 22:30 | gfredericks | maybe rich thinks it's weird to be able to pull metadata off an unrealized object |
| 22:30 | timvisher | bbloom: thanks! |
| 22:31 | sinistersnare | https://gist.github.com/sinistersnare/6665526 ok sorry again, but can anyone check to see if this project.clj is correct? it says it cannot find the jars, https://oss.sonatype.org/index.html#nexus-search;quick~badlogic here is the repo im looking for |
| 22:31 | sinistersnare | specifically the gdx one |
| 22:31 | sinistersnare | and gdx-backends-lwjgl |
| 22:33 | sinistersnare | oh god, i just cant spell badlogic -> badlogicgames |
| 22:40 | sinistersnare | is there any way that i can use a lib/ folder and just add that to my build path? |
| 22:40 | sinistersnare | with lein |
| 22:41 | sinistersnare | technomancy: libgdx provides a lot of its jars through maven, but the natives are built from a build server, and need to be downloaded manually and placed manually. how can i deal with this? |
| 22:41 | bbloom | anybody know if there is anyway to get a view-count from infoq? my vanity requires i know how many people watched my talk :-) |
| 22:42 | sinistersnare | bbloom: which talk? |
| 22:42 | bbloom | aw, dammit. i didn't mean to self promote |
| 22:42 | sinistersnare | oh but im curious now! |
| 22:42 | bbloom | http://www.infoq.com/presentations/concatenative-clojure |
| 22:43 | sinistersnare | ahh i saw this on /r/clojure |
| 22:43 | bbloom | ah cool |
| 22:43 | sinistersnare | i think there was some comment about the video and slides not syncing? |
| 22:43 | bbloom | really? dammit. |
| 22:43 | sinistersnare | or was that some other video....idk |
| 22:44 | sinistersnare | ill make sure to watch it later, my speakers are super quiet on linux and i dont feel like headphones |
| 22:44 | havenwood | just ordered an AR.Drone 2.0 quadracopter, pretty excited about playing with clj-drone library |
| 22:47 | tufflax | Sometimes my prints just don't print anything. What could be wrong? |
| 22:48 | sinistersnare | i guess local maven repo is only answer :p |
| 22:48 | gfredericks | tufflax: clojure.core/print doesn't flush |
| 22:49 | tufflax | gfredericks: yeah but even the ones that does flush. Sometimes I get no output from my logging. After I restart the repl, I do. |
| 22:51 | gfredericks | tufflax: maybe something wrt nrepl server/client? |
| 22:52 | tufflax | gfredericks: maybe. It's like it working depends on something like which thread is running the code or something like that |
| 22:52 | gfredericks | bbloom: there may have been a comment about your talk actually being on agglutinative clojure |
| 22:53 | bbloom | gfredericks: ? |
| 22:53 | gfredericks | tufflax: with nrepl the *out* is specially bound. are you doing anything with threading that would lose its thread-local value? |
| 22:53 | gfredericks | bbloom: making lame language jokes |
| 22:53 | bbloom | heh ok |
| 22:55 | tufflax | gfredericks: Hm don't think so. I use with-out-str in one place just for one call, but that shouldn't matter, right? Other than that I don't touch out |
| 22:55 | tufflax | *out* |
| 22:56 | tufflax | I do (println ... (with-out-str (pprint something))) |
| 22:57 | gfredericks | tufflax: yeah that should be fine |
| 22:58 | gfredericks | tufflax: but e.g. if you start up a new thread manually, use a thread pool, that sort of thing |
| 22:58 | gfredericks | not necessarily having anything to do with *out* directly |
| 22:59 | tufflax | Yeah I start a few new threads. |
| 22:59 | tufflax | But I don't get how that could matter |
| 23:16 | s4muel | new threads don't have their out bound to the same stringwriter that the repl does |
| 23:20 | ToBeReplaced | how do you avoid reflection when you have a doseq in a go block? i'm getting call to nth can't be resolved |
| 23:21 | callen | you're doing something for side effects in a go block? |
| 23:21 | ToBeReplaced | callen: >! |
| 23:21 | callen | oh, pumping a seq into a channel? |
| 23:21 | ToBeReplaced | yeah |
| 23:22 | callen | ToBeReplaced: refheap plz |
| 23:25 | s4muel | tufflax: (alter-var-root #'*out* (constantly *out*)) |
| 23:25 | ToBeReplaced | callen: https://www.refheap.com/18905 |
| 23:26 | callen | ToBeReplaced: the doseq and doall are making me cry tears of blood. |
| 23:26 | tufflax | s4muel: ok. I'll try. But it works sometimes (and it's always new threads). |
| 23:26 | ToBeReplaced | callen: just trying to create simple case obv |
| 23:27 | ToBeReplaced | doseq is what i was interested in... same issue as from before -- i've got an input stream that's being parsed on the fly... don't see any reasonable alternative |
| 23:28 | callen | ToBeReplaced: type-hint whack-a-mole. Have fun. |
| 23:30 | s4muel | ,(class *out*) |
| 23:30 | clojurebot | java.io.StringWriter |
| 23:31 | s4muel | ,(class (System/out)) |
| 23:31 | clojurebot | java.io.PrintStream |
| 23:31 | s4muel | tufflax: new threads use the latter by default |
| 23:33 | tufflax | s4muel: Sorry if I'm slow but I still don't get how it comes that it works sometimes :p |
| 23:33 | ToBeReplaced | callen: doseq reflects, loop/recur doesn't |
| 23:33 | ToBeReplaced | callen: clojure.core.async.lab/spool demonstrates |
| 23:34 | s4muel | tufflax: Well sans code I don't see how either, but that's the general idea. :) |
| 23:34 | tufflax | s4muel: Ok thanks. I'll try it next time it disappears |
| 23:35 | allenj12 | https://www.refheap.com/18906 can someone help me with this i asked the question in the comments by where i need help |
| 23:37 | srruby | I saw here a command that tries all clojure functions, something like (which-function [1 2] 1) ==> first . Can anyone help? |
| 23:38 | tufflax | allenj12: I have not read everything, but it looks like you are calling man-dist with the wrong args order |
| 23:39 | sinistersnare | im having some problems using a local maven repository with clojure (leiningen). |
| 23:39 | sinistersnare | https://www.refheap.com/18907 is my maven directory tree, and my project.clj is here https://gist.github.com/sinistersnare/6665526#file-project-clj |
| 23:39 | sinistersnare | im not sure what im doing wrong... |
| 23:43 | amalloy | $findfn [1 2] 1 |
| 23:43 | lazybot | [clojure.core/first clojure.core/rand-nth] |
| 23:45 | marcopolo | Hey I'm using core.async in clojurescript, but order seems to matter? here is some demo code http://sprunge.us/VaBV ,should that work? |
| 23:45 | amalloy | srruby: ^ |
| 23:46 | srruby | (^ [1] 1) |
| 23:47 | srruby | ^([1] 1) |
| 23:47 | allenj12 | tufflax: woops cant believe i missed that... when i try to run it still using light table live im getting an error https://www.refheap.com/18906 |
| 23:47 | srruby | help |
| 23:47 | srruby | \help |
| 23:47 | allenj12 | eduarj:' |
| 23:48 | allenj12 | the error is at the bottom and i posted it |
| 23:49 | tufflax | allenj12: #(...) creates a function, and you have not called it to get a number back |
| 23:49 | tufflax | allenj12: you are trying to add up the function |
| 23:51 | tufflax | allenj12: maybe you wanted to use (map #(...) board) or something? |
| 23:54 | allenj12 | tufflax: yea i think the apply is the problem ill play with map and see what i get |
| 23:55 | tufflax | allenj12: The apply is fine I think |
| 23:55 | tufflax | allenj12: but maybe you wanted (apply + (map #(...) board)) |
| 23:55 | allenj12 | tufflax: oo ill try it |
| 23:57 | tufflax | allenj12: I don't really understand the comment though, about "as well as the board itself" |
| 23:58 | allenj12 | tufflax: o so the board itself would be (1 2 3 4 5 6 7 8 0) as each number is the tile and the % argument that i had mixed up |