2015-06-05
| 00:00 | crocket | gfredericks, Why doesn't https://www.refheap.com/102108 work? |
| 00:01 | crocket | (if-let [a 2] (if-let [b 2] [a b])) is going to evaluate to [a b] |
| 00:01 | crocket | It's like (if-let [[a b] [a b]] "ok" "no") |
| 00:03 | crocket | Why does (if-let [a 2 b 3] a b) not work? |
| 00:04 | crocket | Why does (if-let-all [a 2 b 3] a b) not work? |
| 00:09 | crocket | ok |
| 00:09 | crocket | I understood why it doesn't work. |
| 00:12 | crocket | I need something like https://www.refheap.com/102109 |
| 00:14 | crocket | All right.... |
| 00:17 | turbofail | er, i don't think that's quite what you want either |
| 00:18 | turbofail | then again i just got here so i'm not entirely certain what it is you want |
| 00:20 | turbofail | i think that macroexpansion would always return either else or nil |
| 00:21 | turbofail | and never then |
| 00:26 | crocket | Wow it works.... |
| 00:26 | crocket | https://www.refheap.com/102107 works |
| 00:27 | crocket | https://www.refheap.com/102107 does what I want. |
| 00:28 | turbofail | ah yeah, that looks more like it |
| 00:42 | crocket | I forgot to give credit to "Gary Fredericks" |
| 00:43 | crocket | Don't worry I will mention your name in a reply. |
| 02:02 | m1dnight_ | Is there somethig like compare-and-set! but with multiple values, or a custom predicate? |
| 02:03 | m1dnight_ | Now I have this code: (if (not (compare-and-set! (:status @tx) :RUNNING :COMMITTING)) (tx-retry tx)) |
| 02:04 | m1dnight_ | But I would like to change it to either equal to :RUNNING or :SOMETHINGELSE |
| 02:04 | m1dnight_ | derp, regular swap will do |
| 02:05 | m1dnight_ | oh no, that doesnt return true or false |
| 05:06 | xiang_wang | Is there any library which has implemented rfb protocol in clojure? |
| 06:20 | morfeen_ | Hey guys, what sort of projects do you guys use Clojure for? Thanks. |
| 06:21 | ddellacosta | web applications, machine learning, and more |
| 06:21 | H4ns | data processing, conversion, generation and extraction (xml, custom formats, csv, x12) |
| 06:24 | ddellacosta | folks, I've got a library that, when I load up the cljc namespaces in the repl they work fine, but when I start up the app that uses the library as a dependency, it fails claiming that some references don't exist |
| 06:25 | ddellacosta | I'm wrapping chunks of clj specific namespaces like so: (ns my.namespace #?(:clj (:import [...]) (:require [...]))) ... is this incorrect? |
| 06:26 | ddellacosta | previously this was cljx of course: (ns my.namespace #+cljx (:import [...]) #+cljx (:require [...]))) ...etc. |
| 06:32 | ddellacosta | neeeeevermind, needed #?@(:clj [(:import ...) (:require ...)]), lesson learned... |
| 08:42 | nano- | clojurescript here as well? I want to pass a clojurescript function to an audiocontext node's onaudioprocess member. How do I do this? |
| 08:43 | oddcully | you might be better off with #clojurescript, but there is some overlap |
| 08:43 | nano- | cool, thanks. |
| 09:54 | tahmid | is there a way to integrate figwheel with Immutant 2 ? |
| 10:01 | jcrossley3 | tahmid: i don't see why not |
| 10:04 | tahmid | jcrossley3: The problem I am facing is that figwheel needs a ring handler and starts a jetty or http-kit server. But when I upgrade the request map of ring to handle websocket requests , I get some errors . |
| 10:05 | tahmid | jcrossley3: Figwheel works fine as long as the request and responses are just simple GET / POST etc |
| 10:07 | jcrossley3 | tahmid: i know a lot more about immutant than figwheel, but if you can give me some steps to reproduce, i can take a look locally |
| 10:14 | tahmid | jcrossley3: please take a look here. Git repo https://github.com/tahmidsadik112/immutant-reagent-template |
| 10:18 | jcrossley3 | tahmid: i'll take a look in a few |
| 10:18 | tahmid | jcrossley3: Steps to reproduce : 1. lein run will start the immutnat server without figwheel, go to localhost:9000, everything works there. 2. lein figwheel will start figwheel server. Then go to localhost:3449 , you will get some error. |
| 10:19 | tahmid | by the way Immutant 2 is fantastic. |
| 10:20 | jcrossley3 | tahmid: :) |
| 10:30 | jcrossley3 | tahmid: so yeah that trace clearly shows that figwheel is using http-kit which will cause as-channel to barf |
| 10:30 | jcrossley3 | looks like figwheel is pretty adamant about running http-kit and there doesn't appear to be a hook to run a different server |
| 10:35 | tahmid | jcrossley3: Thanks for confirming. |
| 10:35 | jcrossley3 | tahmid: seems like you could omit :ring-handler in figwheel's config to prevent it from starting a server, and then add its required routes to your handler started by immutant.web/run |
| 10:35 | jcrossley3 | maybe? |
| 10:35 | jcrossley3 | look at figwheel-sidecar.core/server |
| 10:36 | tahmid | jcrossley3: okay , tahking a look now, will confirm you if that works. |
| 10:36 | tahmid | taking* |
| 10:37 | jcrossley3 | tahmid: i expect bruce may be open to adding a hook for another server, possibly has an optional param to that server fn |
| 10:53 | fourq | Would someone mind helping me understand this line "let [[selected-id :as selected-id-cursor] (:selected-contact-id data)]" . I don't understand why "selected-id" is being referenced as "selected-id-cursor", couldn't this be accomplished by doing this instead: "let [:selected-id-cursor (:selected-contact-id data)]". Here's the full gist of the function: https://gist.github.com/fourq/fd848150aedb6c850db9#file-core-cljs-L18 |
| 10:53 | fourq | someone (it's always about you ;)) |
| 10:54 | justin_smith | fourq: the :as binds the whole collection |
| 10:54 | justin_smith | selected-id is only the first element |
| 10:54 | justin_smith | ,(let [[a :as numbers] (range 5)] numbers) |
| 10:54 | clojurebot | (0 1 2 3 4) |
| 10:55 | justin_smith | ,(let [[a :as numbers] (range 5)] a) |
| 10:55 | clojurebot | 0 |
| 10:55 | fourq | justin_smith, thank you. I'll look over the code again now that I know. |
| 10:55 | justin_smith | also, :selected-id-cursor is not a valid lhs of a let |
| 10:56 | fourq | oh right |
| 10:56 | fourq | ty |
| 10:56 | gfredericks | ,(deftype Foo [] Object (equals [_ o] true)) |
| 10:56 | clojurebot | sandbox.Foo |
| 10:56 | gfredericks | ,(deftype Foo [] Object (equals [_ ^Object o] true)) |
| 10:56 | clojurebot | #error {\n :cause "Mismatched return type: equals, expected: boolean, had: java.lang.Object"\n :via\n [{:type clojure.lang.Compiler$CompilerException\n :message "java.lang.IllegalArgumentException: Mismatched return type: equals, expected: boolean, had: java.lang.Object, compiling:(NO_SOURCE_PATH:0:0)"\n :at [clojure.lang.Compiler analyzeSeq "Compiler.java" 6740]}\n {:type java.lang.IllegalAr... |
| 10:56 | gfredericks | ^ wat? |
| 10:57 | justin_smith | looks like metadata sticking to the wrong thing? |
| 10:57 | gfredericks | ,(deftype Foo [] Object (equals [_ ^Long o] true)) |
| 10:57 | clojurebot | #error {\n :cause "Can't find matching method: equals, leave off hints for auto match."\n :via\n [{:type clojure.lang.Compiler$CompilerException\n :message "java.lang.IllegalArgumentException: Can't find matching method: equals, leave off hints for auto match., compiling:(NO_SOURCE_PATH:0:0)"\n :at [clojure.lang.Compiler analyzeSeq "Compiler.java" 6740]}\n {:type java.lang.IllegalArgumentExce... |
| 10:57 | gfredericks | dunno :/ |
| 10:58 | gfredericks | I realized I didn't need the hint anyhow so it doesn't matter I guess |
| 10:59 | mmeix | Greetings from Austria ... |
| 10:59 | mmeix | I'm thinking about a proper data structure to represent musical notes, which gets needed to a placement machinery (SVG). This is purely graphical, as I want to keep semantics strictly separated for some very good reasons. Now, there are notes with accidentals and some without. |
| 10:59 | mmeix | Four possibilities to encode this: |
| 10:59 | mmeix | [ [1 :none] [3 :flat] [5 :none] ] |
| 10:59 | mmeix | [ [1 nil] [3 :flat] [5 nil] ] |
| 11:00 | mmeix | [ [1] [3 :flat] [5] ] |
| 11:00 | mmeix | Which would be the clojuriest way to do this? |
| 11:00 | justin_smith | {:value 1 :accidental :flat} |
| 11:00 | dysfun | is anyone using cemerick's "friend" i'm having difficulty using the interactive form workflow behind a proxy |
| 11:01 | mmeix | so a map buys me more flexibility in this case? |
| 11:01 | justin_smith | mmeix: the advantage being that if you need to expand, it's painless |
| 11:01 | dysfun | and makes everything more readable |
| 11:01 | justin_smith | as compared to adding more and more things to a vector |
| 11:01 | mmeix | ah, ok |
| 11:01 | mmeix | thnks |
| 11:01 | justin_smith | mmeix: also, if the wrong data ends up in the wrong place, it becomes easier to figure out what kind of data it was *meant* to be :) |
| 11:02 | justin_smith | mmeix: also, if you end up wanting to use protocols for behaviors, maps are easy to upgrade to records |
| 11:03 | mmeix | these are two strong points |
| 11:03 | mmeix | ok |
| 11:04 | mmeix | (inc #clojure) :-) |
| 11:09 | Bronsa | lazybot: you there? |
| 11:09 | Bronsa | :( |
| 11:10 | Bronsa | &(inc 1) |
| 11:10 | lazybot | ⇒ 2 |
| 11:10 | justin_smith | (inc #clojure) |
| 11:10 | lazybot | ⇒ 9 |
| 11:10 | Bronsa | uh |
| 11:10 | mmeix | sorry for appending a smiley ... |
| 11:10 | justin_smith | (inc #clojure) :-) is different |
| 11:10 | justin_smith | yeah |
| 11:11 | mmeix | didn't know, there is collective #clojure-Karma too |
| 11:12 | justin_smith | (inc anything at all can have karma) |
| 11:12 | lazybot | ⇒ 1 |
| 11:12 | mmeix | I see |
| 11:12 | justin_smith | (identity anything at all can have karma) |
| 11:12 | lazybot | anything at all can have karma has karma 1. |
| 11:12 | fourq | justin_smith, it just sank in. =) thanks again |
| 11:12 | justin_smith | fourq: np |
| 11:13 | justin_smith | (identity karma karma karma karma chameleon) |
| 11:13 | lazybot | karma karma karma karma chameleon has karma 1. |
| 11:14 | Phagus | Should one learn Java before learning Clojure? |
| 11:15 | wink | no, please don't :) |
| 11:15 | justin_smith | Phagus: absolutely not neccessary |
| 11:15 | wink | in all seriousness, it depends what you want to do. |
| 11:15 | znurgl | Phagus: just learn Clojure, you don't really need Java for that. Just have a look at JVM stuff. |
| 11:15 | justin_smith | Phagus: if you can read a javadoc, that suffices (interop is neccessary) |
| 11:15 | wink | if you plan to interface with java code a lot, the basics help. like when creating wrapper libs |
| 11:16 | wink | if you just want to learn and use a language, ignore Java and read up as you stumble upon stufff |
| 11:16 | justin_smith | wink: even for that, being able to read the javadoc is not the same as knowing the language syntax - former is needed, latter is not |
| 11:16 | Phagus | Thanks. I just find Clojure tracebacks a little obscure |
| 11:16 | justin_smith | Phagus: java syntax and rules won't help with that, but knowing its vm model will - those are not the same |
| 11:17 | wink | justin_smith: I'm not sure I'm buying this. the java syntax is one of the easiest there is. but just doing some try/catch in clojure without ever having done java... |
| 11:17 | justin_smith | we don't use the lang (clojure emits bytecode directly not java source) but we do use their vm |
| 11:17 | Phagus | I see. |
| 11:17 | justin_smith | wink: I don't find it easy |
| 11:17 | justin_smith | wink: I have done a lot of interop, and always get java syntax wrong when I try to write it |
| 11:18 | Phagus | Another thing I've found. Clojure seems to be painstakingly slow to run on the OpenJDK... or is it just me? |
| 11:18 | justin_smith | Phagus: slow to run, or to start up? |
| 11:18 | tbaldridge | Phagus: define "slow to run..." |
| 11:18 | Phagus | Start-up I should say |
| 11:18 | Phagus | Runtime is fine, startup is a pain. |
| 11:18 | wink | justin_smith: in my experience everyone who can do C and/or PHP can also use Java in a week. syntactically, not the best practices etc |
| 11:19 | tbaldridge | Phagus: clojure starts up pretty quickly (1.5 sec on my box), but things like lein, and other libs tend to slow down the startup process |
| 11:19 | Phagus | wink: Well, my question was more, "is it a necessary prereq to learn Java first?" |
| 11:19 | justin_smith | Phagus: if you break it down, in most cases when you run "lein repl", just over a third of the time is spent starting lein, just over a third of the time is spent starting up nrepl, and just under a third is clojure itself. If you use a cached classpath and invoke the clojure jar directly you can easily get a repl in under half a second. |
| 11:19 | tbaldridge | Phagus: No, absolutely not. I had written about 10 lines of Java when I learned Clojure |
| 11:20 | justin_smith | (without any of your project code loaded yet) |
| 11:20 | Bronsa | on my box java -jar clojure.jar starts in 0.5s compared to 5.3s of lein repl |
| 11:20 | Phagus | Yes, it tends to be Lein that has the slow start-up times |
| 11:20 | wink | Phagus: it won't hurt (as with every language) but absolutely not necessary, especially beforehand. |
| 11:21 | Bronsa | i wonder how much startup times of lein would improve if lein and its deps were distributed AOT |
| 11:21 | Phagus | wink: Dully noted. |
| 11:21 | justin_smith | ~faster |
| 11:21 | clojurebot | I don't understand. |
| 11:21 | justin_smith | ~faster-lein |
| 11:21 | clojurebot | It's greek to me. |
| 11:22 | justin_smith | anyway - the best guide to faster clojure startup: https://github.com/technomancy/leiningen/wiki/Faster |
| 11:22 | Phagus | clojurebot should learn Greek then. |
| 11:22 | justin_smith | ~faster is https://github.com/technomancy/leiningen/wiki/Faster |
| 11:22 | clojurebot | Ik begrijp |
| 11:22 | Phagus | Thanks all |
| 11:23 | xeqi | Bronsa: they are AOTed |
| 11:24 | Bronsa | welp |
| 11:29 | cemerick | dysfun: probably looking for https://github.com/cemerick/friend/blob/master/src/cemerick/friend.clj#L42 |
| 11:32 | timvisher | ,(rand-nth nil) |
| 11:33 | clojurebot | nil |
| 11:33 | timvisher | ,(rand-nth []) |
| 11:33 | clojurebot | #error {\n :cause nil\n :via\n [{:type java.lang.IndexOutOfBoundsException\n :message nil\n :at [clojure.lang.PersistentVector arrayFor "PersistentVector.java" 153]}]\n :trace\n [[clojure.lang.PersistentVector arrayFor "PersistentVector.java" 153]\n [clojure.lang.PersistentVector nth "PersistentVector.java" 157]\n [clojure.lang.RT nth "RT.java" 839]\n [clojure.core$rand_nth invoke "core.clj... |
| 11:33 | timvisher | should that be? |
| 11:33 | timvisher | ,(rand-nth (seq [])) |
| 11:33 | clojurebot | nil |
| 11:33 | timvisher | ,(rand-nth (list)) |
| 11:33 | clojurebot | #error {\n :cause nil\n :via\n [{:type java.lang.IndexOutOfBoundsException\n :message nil\n :at [clojure.lang.RT nthFrom "RT.java" 871]}]\n :trace\n [[clojure.lang.RT nthFrom "RT.java" 871]\n [clojure.lang.RT nth "RT.java" 840]\n [clojure.core$rand_nth invoke "core.clj" 6941]\n [sandbox$eval97 invoke "NO_SOURCE_FILE" 0]\n [clojure.lang.Compiler eval "Compiler.java" 6792]\n [clojure.lang.C... |
| 11:33 | timvisher | ,(rand-nth '()) |
| 11:33 | clojurebot | #error {\n :cause nil\n :via\n [{:type java.lang.IndexOutOfBoundsException\n :message nil\n :at [clojure.lang.RT nthFrom "RT.java" 871]}]\n :trace\n [[clojure.lang.RT nthFrom "RT.java" 871]\n [clojure.lang.RT nth "RT.java" 840]\n [clojure.core$rand_nth invoke "core.clj" 6941]\n [sandbox$eval121 invoke "NO_SOURCE_FILE" 0]\n [clojure.lang.Compiler eval "Compiler.java" 6792]\n [clojure.lang.... |
| 11:34 | timvisher | seems like rand-nth on an empty seq should be nil. |
| 11:34 | timvisher | ,(doc rand-nth) |
| 11:34 | clojurebot | "([coll]); Return a random element of the (sequential) collection. Will have the same performance characteristics as nth for the given collection." |
| 11:34 | justin_smith | timvisher: a related fun one I discoverd in cljs - (rand-int Infinity) is always Infinity (I mean statistics would agree, but ...) |
| 11:34 | justin_smith | timvisher: agreed that the behavior for nil and () should be the same |
| 11:35 | justin_smith | timvisher: also ##(= '() ()) |
| 11:35 | lazybot | ⇒ true |
| 11:35 | timvisher | @justin_smith: heh. :) |
| 11:43 | dysfun | cemerick: awesome, thanks :) |
| 11:54 | mmeix | justin_smith ok, everything gets a lot easier with maps ... feeling dumb again ... thanks for ongoing help |
| 11:54 | mmeix | (especially with juxt to pull out things for calculations) |
| 12:04 | justin_smith | ~everything |gets| a lot easier with maps |
| 12:04 | clojurebot | Ik begrijp |
| 12:05 | mmeix | lesson learned |
| 12:13 | mmeix | Is this the shortest form to find all maps containing :accidental? |
| 12:13 | mmeix | (filter #(contains? % :accidental)) |
| 12:13 | mmeix | with the coll at the end of course |
| 12:14 | mmeix | ,(def n1 {:step 1 }) |
| 12:14 | clojurebot | #'sandbox/n1 |
| 12:14 | mmeix | ,(def n2 {:step 2 :accidental :flat}) |
| 12:14 | clojurebot | #'sandbox/n2 |
| 12:15 | mmeix | ,(def notes [n1 n2]) |
| 12:15 | clojurebot | #'sandbox/notes |
| 12:15 | mmeix | ,(filter #(contains? % :accidental) notes) |
| 12:15 | clojurebot | ({:step 2, :accidental :flat}) |
| 12:17 | mmeix | (I guess I'm not supposed to litter the sandbox with my vars, sorry) |
| 12:18 | gfredericks | mmeix: litter all you want |
| 12:19 | mmeix | ok |
| 12:19 | mmeix | (a let would have been better) |
| 12:19 | gfredericks | ,(defmacro def-a-thousand-things [name] (cons 'do (for [i (range 1000)] (list 'def (symbol (str name) "-" i))))) |
| 12:19 | clojurebot | #'sandbox/def-a-thousand-things |
| 12:19 | gfredericks | ,(def-a-thousand-things haha) |
| 12:19 | clojurebot | #error {\n :cause "Wrong number of args (3) passed to: core/symbol"\n :via\n [{:type clojure.lang.ArityException\n :message "Wrong number of args (3) passed to: core/symbol"\n :at [clojure.lang.AFn throwArity "AFn.java" 429]}]\n :trace\n [[clojure.lang.AFn throwArity "AFn.java" 429]\n [clojure.lang.AFn invoke "AFn.java" 40]\n [sandbox$def_a_thousand_things$iter__118__122$fn__123$fn__124 invo... |
| 12:20 | gfredericks | ,(defmacro def-a-thousand-things [name] (cons 'do (for [i (range 1000)] (list 'def (symbol (str name "-" i)))))) |
| 12:20 | clojurebot | #'sandbox/def-a-thousand-things |
| 12:20 | gfredericks | ,(def-a-thousand-things haha) |
| 12:20 | clojurebot | #'sandbox/haha-999 |
| 12:20 | gfredericks | ,haha-42 |
| 12:20 | clojurebot | #object[clojure.lang.Var$Unbound 0x7b036374 "Unbound: #'sandbox/haha-42"] |
| 12:20 | gfredericks | now that's what I call littering |
| 12:20 | mmeix | ok :D |
| 12:21 | mmeix | coming back to my beginner's question: (filter #(contains :% :mykey) coll) |
| 12:22 | mmeix | is this the shortest form? |
| 12:22 | gfredericks | (filter :mykey coll) is very similar |
| 12:22 | mmeix | ah ok |
| 12:22 | mmeix | thanks |
| 12:23 | mmeix | learning, learning ... |
| 12:41 | Reefersleep | Hello everyone |
| 12:41 | gfredericks | hello |
| 12:41 | mmeix | hi! |
| 12:41 | Reefersleep | Does anyone here know how to do the equivalent of Thread/sleep 500 inside a loop/recur in ClojureScript? |
| 12:42 | Reefersleep | I just want the recur to occur (hehe) in steps |
| 12:42 | Reefersleep | of a length that I can adjust :) |
| 12:42 | mmeix | maybe ask in #clojurescript ... |
| 12:42 | Reefersleep | ah |
| 12:42 | Reefersleep | I will |
| 12:43 | Reefersleep | I'm using a web client, how do you join a different channel? /join #clojurescript ? |
| 12:44 | Reefersleep | Guess so :) |
| 12:44 | Reefersleep | Been a while since I used IRC. |
| 12:47 | gfredericks | Reefersleep: I'm not sure you'll have that option in cljs; might have to look at core.async |
| 12:48 | Reefersleep | gfredericks: I stumbled upon a gist by David Nolen that accomplished the task using core.async, but thought that it seemed superfluous and assumed that he was solving a different problem - however, upon asking in #clojurescript, he said that it was indeed the only way |
| 12:49 | Reefersleep | Here it is: https://twitter.com/swannodette/status/350489657395523587 |
| 12:52 | gfredericks | Reefersleep: so goes javascript |
| 13:04 | mmeix | Looking for further enlightenment ... I'm still not sure, how this works: |
| 13:04 | mmeix | ,(let [c [{:foo 1} {:foo 3 :mykey 7}]] (filter :mykey c)) |
| 13:04 | clojurebot | ({:foo 3, :mykey 7}) |
| 13:05 | mmeix | Does "filter :somekey" carry an implicit "contains?" ? |
| 13:06 | tbaldridge | ,(:foo {:bar 42}) |
| 13:06 | clojurebot | nil |
| 13:06 | tbaldridge | mmeix: if the key doesn't exist ^^ it returns nil |
| 13:06 | tbaldridge | mmeix: nil is falsey so yes, it happens to work like a implicit contains? but it doesn't include a contains? |
| 13:09 | mmeix | those are fine points ... |
| 13:09 | mmeix | thanks |
| 13:27 | mmeix | (inc tbaldridge) |
| 13:27 | lazybot | ⇒ 21 |
| 13:35 | ciphergoth | I use lein to pull in clj-time 0.9.0. I was using clj-time.format.instant->map on the Mac, then I moved over to my Linux machine and it vanished. How should I investigate? |
| 13:38 | ciphergoth | as in I get "java.lang.RuntimeException: No such var: f/instant->map" |
| 13:44 | mmeix | was clj-time.format :required :as f? (just a thought) |
| 13:45 | ciphergoth | mmeix: yes |
| 13:45 | mmeix | ok |
| 13:45 | ciphergoth | The Linux machine is Java 1.7 and the Mac Java 1.8 |
| 13:45 | mmeix | can't help with that, I fear |
| 13:45 | ciphergoth | apart from that I can find no other difference, they both have Lein 2.5.1, the source directories are the same git version |
| 13:45 | ciphergoth | f/unparse (for example) is present on both |
| 13:46 | TimMc | lein clean? |
| 13:46 | mmeix | strange |
| 13:51 | ciphergoth | "lein clean" seems to have done the trick! |
| 13:51 | ciphergoth | weeeeeird! |
| 13:51 | ciphergoth | Thanks TimMc! |
| 13:53 | TimMc | ciphergoth: That's my go-to for "well, that's impossible". After that is "AOTTTTT!" and then maybe "I wonder if I've got something in profiles.clj that's interfering." |
| 13:55 | ciphergoth | I don't have a profiles.clj. I am doing AOT so I can deploy on Google App Engine. |
| 13:55 | ciphergoth | but I had this problem with a simple test from lein repl |
| 13:57 | TimMc | ciphergoth: There are also ways to defeat AOT. Here's an example that just dynamically chains to another namespace so that most of the code base is AOT-free: https://gist.github.com/timmc/d0c18ec2ec3da13f3cfd |
| 13:59 | TimMc | (Yes that -main is ugly but it's a handy one-liner for "just gimme the var and call it".) |
| 14:02 | TimMc | I previously had this packaged up as the lein-otf plugin, but it broke one day and I decided it wasn't worth maintaining it for so simple a thing to do manually. |
| 14:03 | justin_smith | TimMc: yeah, that's pretty much how I do my gen-class shim (except I also implement the magic classes to make jsvc work) |
| 14:05 | TimMc | ? |
| 14:06 | TimMc | Tell me about these magic classes. |
| 14:07 | justin_smith | TimMc: http://www.rkn.io/2014/02/06/clojure-cookbook-daemons/ |
| 14:07 | justin_smith | sorry, it's a magic interface |
| 14:10 | TimMc | ah, neat |
| 14:11 | ciphergoth | TimMc: yep, I remember doing something very similar for a website I did for work once |
| 14:12 | ciphergoth | your code is more elegant though I think, the way you use doto :) |
| 14:15 | IAmMe643 | Is anybody here? |
| 14:15 | mmeix | yes |
| 14:16 | IAmMe643 | mmeix: thx. just trying because the last semi-rare programming language channel I was in had no people online. |
| 14:16 | mmeix | I get lots of help here, recommended! |
| 14:16 | IAmMe643 | mmeix: can you help me? |
| 14:16 | mmeix | not sure, being e beginner ... |
| 14:17 | mmeix | can try |
| 14:17 | IAmMe643 | mmeix: I have not worked with clojure but I need to use it split a string of comma sperated numbers into an array and then sum them. |
| 14:18 | justin_smith | IAmMe643: sounds like a good beginner excersize, all the tools you would need to use to do that are here: http://conj.io (if you can get a clojure repl) |
| 14:18 | justin_smith | if you don't have a repl yet we can help with that too |
| 14:19 | IAmMe643 | justin_smith: what is a repl? |
| 14:20 | ciphergoth | IAmMe643, this isn't a homework problem is it? |
| 14:20 | mmeix | it would start with clojure.string/split I guess |
| 14:21 | ToxicFrog | IAmMe643: read/evaluate/print loop, a thing you can type code into and get results out of without a separate build process. |
| 14:21 | IAmMe643 | mmeix: no. :) If it was I'd use javascript (JK). I have a program that manipulates data and clojure is one of the coding languages I can use in it. Not sure what version it has though. |
| 14:24 | IAmMe643 | mmeix: I get java.lang.ClassNotFoundException: clojure.string (NO_SOURCE_FILE:1) |
| 14:24 | TimMc | ciphergoth: Elegant... or obscure? You decide. :-) |
| 14:25 | IAmMe643 | Just so you guys know, I cannot change much with my enviornment as I am using a packaged app that utilizes Clojure. |
| 14:26 | eraserhd | gfredericks: Are there any known issues with test.check's defspec not respecting the example count? |
| 14:27 | eraserhd | I literally cannot figure out what's happening here. |
| 14:27 | IAmMe643 | justin_smith: I got java.lang.ClassNotFoundException: clojure.string (NO_SOURCE_FILE:1) |
| 14:28 | eraserhd | Oh. Shrinking. |
| 14:30 | mmeix | ;(let [numstring "1,2,3"](apply + (map #(Double/parseDouble %) (clojure.string/split numstring #",")))) |
| 14:30 | mmeix | ,(let [numstring "1,2,3"](apply + (map #(Double/parseDouble %) (clojure.string/split numstring #",")))) |
| 14:31 | clojurebot | 6.0 |
| 14:31 | mmeix | IAmMe643 does this help? |
| 14:32 | IAmMe643 | mmeix: EOF while reading. |
| 14:32 | mmeix | it worked here in clojurebot ... |
| 14:32 | IAmMe643 | mmeix: I finally found a way that I think will work (w. their own programming languange) |
| 14:32 | mmeix | I guess you have to check your parens |
| 14:32 | IAmMe643 | mmeix: my thing probably has an old version |
| 14:33 | mmeix | hm, ok |
| 14:36 | IAmMe643 | mmeix: in case you were curious, here is the code I made (not clojure): sum(forRange(0, value.smartSplit().length(), 1, a, value.smartSplit()[a].toNumber())) |
| 14:38 | mmeix | that's roughly the same the clojure version does, but not so elegant :) |
| 14:41 | IAmMe643 | mmeix: well it is quicker, and smaller. If I had a super-big project that required clojure I would use the clujure version. This was only to do a mass edit of 119 cells. |
| 14:41 | IAmMe643 | clojure* |
| 14:44 | eraserhd | Is there an easy way to profile code from the repl? By profile, in this case, I mean determine which sub-function in the call graph is taking the most amount of time? |
| 14:45 | andyf_ | eraserhd: I've heard several people praise YourKit for profiling on the JVM. They have either a free version, or a free trial version, not sure which. |
| 14:49 | oddcully | ,(let [s "11,222,3333"] (reduce + (map #(Long/parseLong %) (re-seq #"\d+" s)))) |
| 14:49 | clojurebot | 3566 |
| 14:50 | mmeix | ah, re-seq is better, yes |
| 14:51 | Bronsa | andyf_: eraserhd you can get a yourkit license for open source projects |
| 14:52 | oddcully | maybe not better, but maybe there without requiring stuff |
| 14:52 | mmeix | that's what I meant |
| 14:53 | oddcully | now really dirty: , (let [s "11,222,3333"] (reduce + (read-string (str "[" s "]")))) |
| 14:54 | mmeix | wantes to avoid read-string .. |
| 14:54 | mmeix | wanted |
| 14:54 | mmeix | :) |
| 14:55 | oddcully | well i guess that readstring took care of irccloud com ;P |
| 15:08 | gfredericks | eraserhd: ha yeah shrinking; I've been personally surprised by that one several times the last few days; only for a moment though |
| 15:16 | amalloy | oddcully: (let [s "1; 2 ; 3"] ...) |
| 15:17 | amalloy | my point is you should never just wrap something with parens and then read-string it, as an attempt to read multiple forms |
| 15:19 | gfredericks | amalloy: is there any reason you can't safely wrap it with "(\n%s\n)"? |
| 15:19 | TEttinger | #_ |
| 15:20 | TEttinger | ,(let [s "#_"] (read-string (str "(\n" s "\n)"))) |
| 15:20 | clojurebot | #error {\n :cause "Unmatched delimiter: )"\n :via\n [{:type java.lang.RuntimeException\n :message "Unmatched delimiter: )"\n :at [clojure.lang.Util runtimeException "Util.java" 221]}]\n :trace\n [[clojure.lang.Util runtimeException "Util.java" 221]\n [clojure.lang.LispReader$UnmatchedDelimiterReader invoke "LispReader.java" 1176]\n [clojure.lang.LispReader read "LispReader.java" 263]\n [clo... |
| 15:22 | TEttinger | ,(let [s "#_"] (read-string (str "(\n" s "#_()\n)"))) |
| 15:22 | clojurebot | #error {\n :cause "Unmatched delimiter: )"\n :via\n [{:type java.lang.RuntimeException\n :message "Unmatched delimiter: )"\n :at [clojure.lang.Util runtimeException "Util.java" 221]}]\n :trace\n [[clojure.lang.Util runtimeException "Util.java" 221]\n [clojure.lang.LispReader$UnmatchedDelimiterReader invoke "LispReader.java" 1176]\n [clojure.lang.LispReader read "LispReader.java" 263]\n [clo... |
| 15:22 | TEttinger | hmm |
| 15:22 | whodidthis | is there some separate command on emacs clojure-mode to newline with indent, enter just newlines and then i have to tab |
| 15:23 | tahmid | C-j |
| 15:23 | TEttinger | gfredericks, shrinking? |
| 15:23 | whodidthis | sweet, thanks |
| 15:24 | gfredericks | TEttinger: shrinking as in test.check |
| 15:24 | TEttinger | ,(let [s "#_s"] (read-string (str "(\n" s "\n)"))) |
| 15:24 | clojurebot | () |
| 15:25 | TEttinger | gfredericks: should I care about test.check or only test.chuck? |
| 15:25 | TEttinger | because that regex generator is sweet |
| 15:25 | justin_smith | whodidthis: I think there is something like "electric-indent" that you can turn on too |
| 15:26 | gfredericks | TEttinger: test.chuck is a util lib for test.check, so only makes sense with it |
| 15:27 | TEttinger | it was partially a joke! |
| 15:28 | justin_smith | ,(into #{} (repeatedly 10000 #(rand Double/POSITIVE_INFINITY)) |
| 15:28 | clojurebot | #<RuntimeException java.lang.RuntimeException: EOF while reading> |
| 15:28 | justin_smith | ,(into #{} (repeatedly 10000 #(rand Double/POSITIVE_INFINITY))) |
| 15:28 | clojurebot | #{Infinity} |
| 15:29 | TEttinger | ,(into #{} (repeatedly 10 #(rand Double/POSITIVE_INFINITY))) |
| 15:29 | clojurebot | #{Infinity} |
| 15:29 | TEttinger | ,(into #{} (repeatedly 2 #(rand Double/POSITIVE_INFINITY))) |
| 15:29 | clojurebot | #{Infinity} |
| 15:29 | TEttinger | heh |
| 15:29 | TEttinger | ,(rand Double/POSITIVE_INFINITY) |
| 15:29 | clojurebot | Infinity |
| 15:29 | TEttinger | there you go! |
| 15:30 | justin_smith | (doc rand) |
| 15:30 | clojurebot | "([] [n]); Returns a random floating point number between 0 (inclusive) and n (default 1) (exclusive)." |
| 15:30 | TEttinger | exclusive, ha |
| 15:30 | justin_smith | "exclusive" |
| 15:30 | TEttinger | can't exclude infinity |
| 15:30 | TEttinger | there's always a bigger one |
| 15:30 | TEttinger | (I think any range of (-oo to oo) |
| 15:31 | TEttinger | is the same as [-oo to oo] |
| 15:31 | justin_smith | TEttinger: I guess the into result makes sense, most numbers between 0 and oo are oo |
| 15:31 | TEttinger | heh |
| 15:31 | TEttinger | even the rand! |
| 15:32 | TEttinger | any operation on an infinite number that does not reduce by an infinite number is an infinite number |
| 15:32 | TEttinger | ,(+ Double/POSITIVE_INFINITY Double/NEGATIVE_INFINITY) |
| 15:33 | clojurebot | NaN |
| 15:33 | TEttinger | heh |
| 15:33 | TEttinger | not... what I expected |
| 15:33 | TEttinger | ,(- Double/POSITIVE_INFINITY Double/POSITIVE_INFINITY) |
| 15:33 | clojurebot | NaN |
| 15:33 | TEttinger | same |
| 15:33 | gfredericks | TEttinger: what would you expect? |
| 15:34 | eraserhd | gfredericks: So, how does such-that interact with shrinking? I have a test that shrinking generated UUIDs so that they collide. If I add a such-that they are unique, will that make shrinking abort? |
| 15:34 | TEttinger | gfredericks, infinity doesn't make sense, really |
| 15:34 | TEttinger | so, the answer is ??? |
| 15:34 | lazybot | TEttinger: Oh, absolutely. |
| 15:34 | gfredericks | eraserhd: shrinking won't generate invalid things if that's what you're asking; my guess is you don't really need to shrink these? |
| 15:35 | gfredericks | eraserhd: but I have some generators for distinct sets cooked up for the next release, that should make this stuff a lot easier |
| 15:35 | TEttinger | infinity kinda makes sense if you're in the hyper-real ring and not the real ring. but that's mathematician cocaine binge territory right there |
| 15:36 | gfredericks | every time I've used uuids I've run them through gen/no-shrink because why bother |
| 15:36 | gfredericks | TEttinger: which infinity though? |
| 15:36 | eraserhd | makes sense. |
| 15:37 | gfredericks | I'm writing a generator for ordered integer partitions right now SUPER FUN TIMES |
| 15:38 | TEttinger | gfredericks, in hyper-reals, you can define (< (+ infinity 1) (+ infinity 2)) |
| 15:38 | TEttinger | and it will make sense |
| 15:38 | gfredericks | TEttinger: I'm talking about in Double-land where you have exactly 2 infinities |
| 15:39 | TEttinger | pfft |
| 15:39 | TEttinger | what are we, Java programmers? |
| 15:39 | TEttinger | https://en.wikipedia.org/wiki/Hyperreal_number |
| 15:41 | gfredericks | TEttinger: well that was what you were playing with initially |
| 15:41 | TEttinger | heh |
| 15:41 | TEttinger | ,(== Double/POSITIVE_INFINITY Double/POSITIVE_INFINITY) |
| 15:41 | clojurebot | true |
| 15:42 | TEttinger | interesting... |
| 15:43 | borkdude | why would someone put lein plugins explicitly in the :dev profile in leiningen? |
| 15:44 | borkdude | in project.clj |
| 15:44 | borkdude | what benefit does it have |
| 15:46 | gfredericks | can't think of any |
| 15:47 | borkdude | faster load times of other tasks? |
| 15:48 | iamjarvo | does anyone have a solid article explaining reify? |
| 15:48 | TEttinger | wowza, this stuff has some fun names... https://en.wikipedia.org/wiki/Boolean_prime_ideal_theorem#The_ultrafilter_lemma |
| 15:48 | iamjarvo | ive read this one http://decomplecting.org/blog/2014/10/29/reify-this/ |
| 15:48 | TEttinger | ultrapower theorem for proving hyperreal numbers |
| 15:49 | TEttinger | next up, hyper-ultra-yowza-numbers |
| 15:54 | gfredericks | TEttinger: ordinals are pretty trippy |
| 15:55 | TEttinger | is this related to your ordered partitioning? |
| 16:01 | gfredericks | nope |
| 16:20 | TimMc | borkdude: Come to think of it, maybe there's no difference. |
| 16:24 | amalloy | gfredericks: no, i think wrapping with [\n] is technically fine but just feels sloppy to me, compared to using read |
| 16:27 | TEttinger | amalloy: what is this for? |
| 16:28 | TEttinger | you have #_ and ; as two different ways to cause something to be ignored |
| 17:18 | arohner | arg. Exceptions with no stacktrace are the worst |
| 17:32 | lodin_ | Huh, turns out someone just registered nickname lodin. |
| 17:44 | jtmarmon | can anyone give me a suggestion on how I can clean this up a bit: https://gist.github.com/jtmarmon/cd10b0329cf646c107ca . I'd like to not have to pass this map down the call stack, but I also don't want to use a macro because it just seems kinda hacky here |
| 17:49 | lodin_ | jtmarmon: Where does GET* come from? |
| 17:49 | jtmarmon | https://github.com/metosin/compojure-api/ - it's a modified version of compojure's GET which allows for some custom let bindings, like those components. i'm really asking about the body's call stack, not so much about how the body is invoked |
| 17:50 | amalloy | jtmarmon: pass the map down the call stack, to the places that actually need it. if your entire program needs access to your entire set of components, the structure seems kinda murky and it's nice to have a reminder there that you should clean up |
| 17:51 | jtmarmon | amalloy: fair nuff. I simplified call-fn to an anonymous function which makes it read a bit cleaner. definitely will earmark for a bit of cleanup here. thanks guys |
| 17:58 | lodin_ | jtmarmon: Do these components have anything to do with the components in https://github.com/stuartsierra/component? |
| 17:58 | jtmarmon | lodin_: yes, they are actual components |
| 18:38 | Deraen | jtmarmon: You can use :components [:as system] to access the whole system |
| 18:39 | jtmarmon | ahh good pint, that does clean it up a bit. thanks @Deraen. btw going to work on that vector coercion thing sunday :) we're shipping monday so gotta get it out of the way ;) |
| 18:42 | Deraen | jtmarmon: ring-swagger #50 should implement most of the stuff needed for query parameter coercions, I've been busy lately but I think I'll have time this weekend to finish that |
| 18:43 | jtmarmon | Deraen: got it. i'll keep an eye out then :D |
| 22:46 | chomwitt | hi. in a small tutorial i found in project.clj the ring/ring-util-response dependencie but lein can find it in clojars. is it depracated or sth? |
| 22:49 | zodiak | chomwitt, ring.util.response is in ring-core .. so if you have core, you should have it already. You could always (:require [ring.util.response :refer [whatever]) |
| 22:52 | chomwitt | zodiak: one moment to try that.. |
| 22:58 | chomwitt | zodiak: thanks!! it worked |
| 22:59 | zodiak | np |
| 23:35 | luxbock | what do you call a macro that uses try and catch to return nil on Exceptions? I'm sure most people have written it before |