2013-03-27
| 00:01 | ivan | http://bugs.sun.com/view_bug.do?bug_id=4262078 says to JCP it |
| 00:10 | jonasen | dnolen: why is core.logic/llist a macro? (I made it a function and all tests pass) |
| 00:15 | Sgeo | People sometimes write a macro when a function would work. Don't know if that's the case here though |
| 00:15 | Sgeo | It is the case with whatchamacallit monad library |
| 00:15 | Sgeo | lift was made a macro instead of a function |
| 00:26 | n_b | Is there a clojure equivalent to rake? |
| 00:43 | rbxbx | n_b: I feel like most people use leiningen to those ends. |
| 00:43 | n_b | I think I must be missing something/glossed over some documentation. Basically I want to have it try and grab some static files and toss them into lib/ if they don't already exist/haven't changed |
| 00:44 | antares_ | n_b: a custom Leiningen task can do that |
| 00:45 | n_b | Ah, alright. Just wanted to make sure I wasn't missing anything obvious/preferred. Will throw that on the todo list and try and throw it on GitHub once finished. Thanks for the help rbxbx and antares_ |
| 00:45 | rbxbx | cheers. |
| 00:45 | antares_ | n_b: tasks and plugins are covered by https://github.com/technomancy/leiningen/blob/master/doc/PLUGINS.md |
| 00:53 | firesofmay | Is it possible to do bulk require in clojure? like test.* :as t |
| 00:53 | firesofmay | and I refer all the ns inside test like t.app, t.core etc? |
| 00:59 | firesofmay | anyone? |
| 00:59 | clojurebot | Just a heads up, you're more likely to get some help if you ask the question you really want the answer to, instead of "does anyone ..." |
| 01:00 | rbxbx | firesofmay what's your question? :require foo :as bar should work, no? |
| 01:00 | rbxbx | you can also use :use if you don't want to namespace it |
| 01:01 | rbxbx | (though that's typically frowned upon in production code) |
| 01:01 | firesofmay | rbxbx yes but I would like to do something like import foo.bar.* :as baz |
| 01:01 | rbxbx | for java imports? |
| 01:01 | firesofmay | rbxbx and then do bas.app1/fn , bas.app2/fn |
| 01:01 | firesofmay | rbxbx no for clojure ns |
| 01:02 | firesofmay | rbxbx I have many ns inside a directory and instead of doing require for all can i do :as on the directory itself? |
| 01:02 | amalloy | firesofmay: no |
| 01:02 | rbxbx | ah okay |
| 01:02 | firesofmay | amalloy okay |
| 01:02 | rbxbx | ^^^ what that guy said |
| 01:03 | rbxbx | well, amalloy. not yourself. |
| 01:03 | firesofmay | rbxbx amalloy so no way to do this except require each of them? |
| 01:03 | rbxbx | firesofmay I dare say you should ask yourself why that's necessitated. |
| 01:04 | firesofmay | rbxbx I am basically writing my tests for iPhone in clojure using calabash. |
| 01:04 | amalloy | well, i actually don't think it would be such a bad idea (whereas being able to :use or :import multiple namespaces would be) |
| 01:04 | firesofmay | rbxbx and I wanted to separate each view as its own ns |
| 01:05 | firesofmay | amalloy I don't want to do :use. wanted the require but was wondering if there is a way around bulk require. |
| 01:06 | rbxbx | firesofmay I'm not sure how to help. Sorry. |
| 01:06 | firesofmay | rbxbx no problem :) |
| 01:40 | hyPiRion | gfredericks, TimMc: Ping. |
| 02:07 | tyler | im trying to implement irc nick auto complete in clojure |
| 02:08 | tyler | anyone have any algorithm ideas? |
| 02:09 | arrdem | tyler: a trie is probably your best bet.. maybe a probability weighted trie at that. |
| 02:10 | arrdem | that is, a trie such that the order of its children when iterating is decided not by the character ordinal values, but in order of decreasing probability of following the parent. |
| 02:19 | tieTYT2 | would it be advantageous to have a repl that auto reloads files? |
| 02:19 | tieTYT2 | i never want to use an out of date one |
| 02:19 | tieTYT2 | or is there a shorthand way of reloading all the current namespaces I've required? |
| 02:20 | arrdem | tieTYT2: if you're in emacs there's got to be a way to re-eval files on buffer flush |
| 02:20 | arrdem | if you find one share the snippet 'cause I want it. |
| 02:21 | arrdem | in the more general case not sure. Noir did some magic to reload files at runtime but I don't think your average repl will. |
| 02:21 | tieTYT2 | i see |
| 02:22 | tieTYT2 | well i use intellij's plugin (atm) not emacs |
| 02:22 | tieTYT2 | but it sounds like you want this feature too |
| 02:22 | arrdem | I mean.. if I spent 15 with the manual and google I could build it.. for emacs and nrepl. |
| 02:22 | arrdem | as it is I relaod files when I save them anyway |
| 02:23 | tieTYT2 | how? |
| 02:23 | clojurebot | with style and grace |
| 02:23 | tieTYT2 | emacs script? |
| 02:24 | ivan | C-c C-k runs the command nrepl-load-current-buffer |
| 02:25 | arrdem | and C-c C-l is the general lisp-mode eval buffer |
| 02:25 | ivan | tools.namespace can reload everything you've required |
| 02:26 | arrdem | you can also enter (use 'my-ns :reload-all) to force clojure to read from source again |
| 02:27 | arrdem | I don't know anything specifically about the intelliJ LaClojure environment, but I'm sure there's a "load file" command somewhere that should also do for you. |
| 02:28 | tieTYT2 | arrdem: well i use lein side by side with it |
| 02:28 | tieTYT2 | which is probably a bad idea |
| 02:28 | tieTYT2 | i think there's a bug in it |
| 02:28 | arrdem | it's an approach... |
| 02:28 | tieTYT2 | in la clojure I mean |
| 02:28 | arrdem | mine was tmux with vim and lein for months |
| 02:28 | tieTYT2 | it's hard to figure out how to start up a repl |
| 02:29 | arrdem | what OS are you on? windows, mac or a real Nix? |
| 02:30 | tieTYT2 | ivan: cool. I'll look into that later |
| 02:30 | tieTYT2 | windows |
| 02:31 | arrdem | hum can't help you much then. If you were mac or linux I'd strongly suggest looking into emacs.. I know that official emacs builds exist for windows but I've never used one and thus won't attempt to commend it to you. |
| 02:31 | tieTYT2 | IME learning a new editor can reduce your productivity for weeks |
| 02:32 | tieTYT2 | and since I'm also learning clojure at the same time, I'm not sure i could handle that |
| 02:32 | arrdem | hah I learned Vim, Tmux and Clojure at the same time this past summer. My productivity was in the tank for two week straight. |
| 02:32 | arrdem | I absolutely understand not wanting to change environments. |
| 02:33 | tieTYT2 | there's an eclipse and netbeans plugin i haven't tried yet |
| 02:33 | tieTYT2 | if they're better i may swithc |
| 02:34 | ivan | Emacs works fine on Windows |
| 02:34 | arrdem | with nrepl? |
| 02:34 | ivan | yep |
| 02:34 | arrdem | can't say I'm shocked... |
| 02:34 | ivan | though if git is in your PATH it may take 4 seconds per call to git, perhaps 47 seconds to start if you have Emacs loading all your files on startup |
| 02:35 | ivan | git.cmd is the trainwreck, git.exe is reasonably fast |
| 02:35 | arrdem | yuck |
| 02:35 | arrdem | and I thought that Eight Megabytes And Constant Swapping was bad on Linux... |
| 03:02 | DaReaper5 | i need some help working with an input stream |
| 03:03 | DaReaper5 | i need to: create a zip input stream from an array of input streams |
| 03:04 | amalloy | DaReaper5: https://github.com/flatland/io/blob/develop/src/flatland/io/core.clj |
| 03:05 | amalloy | ie, if you (:require flatland.io.core, [clojure.java.io :as io]), you should be able to just call (io/input-stream (seq the-array-of-streams)) |
| 03:06 | DaReaper5 | really1? |
| 03:06 | DaReaper5 | that seems to easy |
| 03:06 | DaReaper5 | i need to return the zip to a client (this is a component on a clojure server) |
| 03:06 | amalloy | well, you still have to wrap it in a zipinputstream however |
| 03:07 | amalloy | i'm just handling the array part |
| 03:07 | DaReaper5 | oh i see |
| 03:07 | amalloy | but java.util.zip contains a wrapper that turns an inputstream into a zipstream |
| 03:07 | amalloy | so that's like no work |
| 03:07 | DaReaper5 | i hope |
| 03:07 | DaReaper5 | something like this: |
| 03:08 | DaReaper5 | zipInStream (java.util.zip.ZipInputStream. (io/input-stream allReports)) |
| 03:08 | DaReaper5 | ? |
| 03:08 | DaReaper5 | allReports is my array |
| 03:09 | DaReaper5 | shouldnt i need to add each individually |
| 03:09 | DaReaper5 | and specify a name? |
| 03:14 | DaReaper5 | amalloy? |
| 03:14 | clojurebot | amalloy is <amalloy> just use juxt, it'll be great |
| 03:14 | amalloy | zip input streams are for reading zip files. you want to write a zip file, so you have to do something else entirely |
| 03:15 | DaReaper5 | ya |
| 03:15 | DaReaper5 | i think i have to read the input stream like a buffer |
| 03:15 | DaReaper5 | for each one |
| 03:15 | DaReaper5 | ew |
| 03:19 | DaReaper5 | can i use io/copy to convert the inputstream to an outputstream |
| 03:19 | DaReaper5 | which i can just call toByteArray on? |
| 03:20 | arrdem | you should be able to.. |
| 03:21 | arrdem | if you have another object to act as an output buffer |
| 03:27 | tomoj | DaReaper5: example https://www.refheap.com/paste/80bad6da903cc2e6542b33d3d |
| 04:23 | piranha | is there a threading function in clojure core akin to ->, but which will call fns? Something like (... x #(func1 % arg1) #(func2 arg2 %)) |
| 04:23 | arrdem | so -> is wacky when it comes to inline fns. |
| 04:24 | arrdem | if you define an inline fn, then you need to parenthesize it in order for -> to invoke it correctly. |
| 04:24 | arrdem | eg. #(println "foo") -> (#(println "foo")) |
| 04:25 | arrdem | however if you have a bound function, say clojure.core/inc, you can just stick that in line and -> will deal with it. |
| 04:25 | arrdem | there is the function comp, which is similar to -> in effects... |
| 04:25 | arrdem | ,(doc comp) |
| 04:25 | clojurebot | "([] [f] [f g] [f g h] [f1 f2 f3 & fs]); Takes a set of functions and returns a fn that is the composition of those fns. The returned fn takes a variable number of args, applies the rightmost of fns to the args, the next fn (right-to-left) to the result, etc." |
| 04:26 | arrdem | ,((comp #(* 3 %) inc dec dec) 3) |
| 04:26 | clojurebot | 6 |
| 04:34 | piranha | arrdem: hm, sure, comp looks like a good choice for that |
| 04:35 | arrdem | note what they are intended for tho.. comp returns a function which must be called while -> is intended for un-nesting expressions. |
| 04:36 | arrdem | ,(-> {} (assoc :foo 1) (assoc :bar 2) (assoc :baz 3)) |
| 04:36 | clojurebot | {:baz 3, :bar 2, :foo 1} |
| 04:37 | arrdem | is equivalent to (and macroexpands to) &(assoc (assoc (assoc {} :foo 1) :bar 2) :baz 3) |
| 04:37 | arrdem | ,(assoc (assoc (assoc {} :foo 1) :bar 2) :baz 3) |
| 04:37 | clojurebot | {:baz 3, :bar 2, :foo 1} |
| 04:44 | piranha | arrdem: yes, well, I understand that |
| 04:44 | piranha | arrdem: in the end it seems for quick repl sessions ->> and wrapping all others in parens works best for me :) |
| 04:44 | piranha | i.e. (->> a (#(s/split % #"&")) (map #(s/split % #"=")) (into {}) (#(get % "url")) java.net.URLDecoder/decode) |
| 04:44 | tomoj | anyone thinking about reducer fusion? |
| 04:45 | piranha | ->> is better than -> because map in other case will require wrapping in fn, which means even more text |
| 04:45 | arrdem | tomoj: please elaborate |
| 04:49 | piranha | is it possible to somehow install package with lein without creating a project.clj with this package in dependencies? |
| 04:49 | piranha | like in python I would do 'pip install lxml' and the lxml will be available for use in repl |
| 04:50 | arrdem | yeah so in Lein 1.X that was doable |
| 04:50 | arrdem | in Lein 2.X not so much.... |
| 04:50 | piranha | eh :( |
| 04:50 | arrdem | you can add packages to your Lein profile for autoloading.. |
| 04:50 | arrdem | which gets you almost the same place |
| 04:51 | arrdem | but in general no Lein isn't designed to just kick off a repl and hack any old where it's designed to be a project tool. |
| 04:52 | arrdem | anyone else still alive please correct me, but that's my understanding and I'm not going to ping technomancy in here for this at 2AM PST |
| 04:53 | wink | still alive? at work for nearly an hour already... silly americans 8) |
| 04:53 | kalasjohnny2000 | when lein trampoline cljsbuild repl-listen I get Exception in thread "main" java.lang.IllegalArgumentException: contains? not supported on type: clojure.lang.LazySeq at cljs.closure: at cljs.closure$js_dependencies$fn__1448.invoke(closure.clj:540) |
| 04:54 | kalasjohnny2000 | I run clojure 1.5.1, cljsbuild 0.3.0, lein 2.1.1 |
| 04:54 | kalasjohnny2000 | it seems to me that it\s a lazy dependency list that has to be realized |
| 04:55 | wink | piranha: I've wished for that in the past too, but maybe there's even a way I don't know of. I'd suggest #leiningen later on :) |
| 04:56 | kalasjohnny2000 | wov, I check #leiningen. |
| 04:56 | piranha | wink: yeah, in the mean time I've just added package to one of projects, downloaded it and removed; maybe writing a plugin would be nice for that... |
| 04:57 | wink | piranha: yes, but if it's possible it needs to be documented. if not, it might be worth building. |
| 05:02 | tomoj | arrdem: ..you did ping him :) |
| 05:04 | tomoj | arrdem: to elaborate, an example: (r/map inc coll) -> (reify CollReduce (coll-reduce [_ f val] (r/reduce (fn [ret v] (f ret (inc v))) coll))) |
| 05:05 | tomoj | basically the idea is just to do some reducer transformations at compile time instead of runtime |
| 05:05 | Glenjamin | arrdem, wink if its for having in an arbitrary repl to play with, ~/.lein/profiles.clj seems like the right place |
| 05:05 | arrdem | tomoj: damnit who the shit uses non-prefix ping notifications |
| 05:05 | tomoj | (well, I bet he's using erc, dunno his config — mine (the default) highlights on all mentions) |
| 05:07 | arrdem | ,(doc ret) |
| 05:07 | clojurebot | Huh? |
| 05:08 | tomoj | I'm thinking like collections containing primitives and supporting fast loops (matrices?) |
| 05:09 | arrdem | hum.. you're into deeper magic than I'm familliar with or can reason about at 4am local |
| 05:09 | tomoj | do the reducer transform at compile time and your math is all inlined, no boxing (except across fork/join tasks), and maybe fusion of loops over zipped collections, for the 'multireducer' case |
| 05:09 | tomoj | ah, OK |
| 05:10 | arrdem | so that'll work just fine for fixed dimensionality vector aditions and scalar multiplication |
| 05:10 | arrdem | not sure if it's applicable to multiplication tho |
| 05:12 | arrdem | well if you can inline your transpose? somehow.. |
| 05:12 | tomoj | transpose is pretty close to free I think |
| 05:12 | arrdem | it should be |
| 05:13 | tomoj | hmm |
| 05:13 | arrdem | because A * B is the matrix M being the dot products of A[i] by col and B[i] by row |
| 05:13 | arrdem | yay I learned something in linalg and remembered it! |
| 05:13 | arrdem | isn't that what core.matrix is doing already tho? |
| 05:15 | tomoj | core.matrix is already trying to be a matrix library |
| 05:15 | tomoj | s/trying to be // |
| 05:15 | arrdem | oh and this is just a more general reducer structure? |
| 05:15 | tomoj | well, yeah, and I'm not sure I like core.matrix :) |
| 05:16 | arrdem | seemed.. heavily engineered when I looked at it |
| 05:16 | arrdem | but maybe I'm just too used to my own "lone hacker" style where I don't have to support anyone but myself XP |
| 05:17 | tomoj | I'm not too interested in protocols wrapping a bunch of java libraries |
| 05:18 | tomoj | I want one very fast pure-clojure reducer-based impl, and a compatible CUDA impl, and that's it |
| 05:18 | tomoj | with as few new protocols as possible |
| 05:18 | arrdem | if this thing runs on CUDA, my hat is off to you |
| 05:20 | tomoj | my bottleneck is matrix multiplication so I think it should be pretty easy to satisfy myself initially |
| 05:20 | tomoj | whether you can really do a full reducer-based matrix library with compatible Clojure/CUDA impls.. no clue |
| 05:24 | arrdem | I |
| 05:24 | ejackson | tomoj that would be impressive |
| 05:24 | arrdem | 'll be interested to see if you can pull it off.. is that something you think could be extended to generic arithmetic operaitons, or only primitive type arithmetic? |
| 05:24 | tomoj | impressive as in "oh, that's cool" or as in "no way, that's impossible!" |
| 05:25 | tomoj | hmm |
| 05:25 | tomoj | generic arithmetic == a multimethod? |
| 05:25 | tomoj | not going to put a multimethod in the inner matrix loop :) |
| 05:26 | arrdem | lol I wouldn't ask you to |
| 05:26 | tomoj | but if you had really flexible reducers and your arithmetic can be defined on a product of primitives (like complex arithmetic) then that seems like a really interesting idea |
| 05:27 | arrdem | this last weekend I was playing with doing a Protocol based CAS by defing protocols for + & -, another for * and a third for / |
| 05:27 | tomoj | instead of reduce-kv (fn [ret k v]) it'd be like reduce-complex (fn [ret real imag]) ? |
| 05:27 | arrdem | not sure. |
| 05:28 | tomoj | can only go up to the quaternions with primitives :) |
| 05:29 | ejackson | tomoj: i don't see why it shouldn't be possible! |
| 05:29 | arrdem | 0430 arrdem can't track quaternions |
| 05:29 | arrdem | will add to reading stack |
| 05:30 | ciphergoth_ | I want to write a unit test for my cookie code: I got to url X, and that sets a cookie, and so when I go to Y, I'm allowed because I have a cookie. Is there something that will help me do that? |
| 05:30 | tomoj | oh, no, actually, you only get max 3 primitive args after the monoid |
| 05:31 | tomoj | well if you're doing crazy inlining it doesn't matter anyway I suppose |
| 07:38 | ToBeReplaced | anyone use OData from clojure? |
| 07:41 | clgv | s/ToBeReplaced/NowReplaced/ |
| 07:42 | clgv | oh that's a Microsoft format^^ |
| 07:43 | clgv | ToBeReplaced: do you use ClojureCLR? then you could just use one of micrsofts libs (they have one, right?) |
| 07:45 | ToBeReplaced | i don't; it looks like i could use odata4j though |
| 07:47 | clgv | ToBeReplaced: is this for work or a hobby project? |
| 07:48 | ToBeReplaced | work |
| 07:48 | ToBeReplaced | only consuming OData, not producing |
| 07:50 | clgv | ok, from the google code page it is not easy to tell how active this project is maintained |
| 07:50 | ToBeReplaced | seems like the best java option... odata.org lists is as the java implementation with no alternatives |
| 07:51 | clgv | ah ok. so you have no choice but to try it^^ |
| 07:52 | ToBeReplaced | yep :) |
| 08:30 | ciphergoth | Hmm, is there something already existing that takes a request and a local URL, and returns an absolute URL suitable for handing to ring.util.response/redirect? |
| 08:32 | weavejester | ciphergoth: The java.net.URL constructor does a little like what you want. |
| 08:33 | ciphergoth | bah. Think that HTTP should have allowed relative URLs in Location headers |
| 08:34 | ciphergoth | all popular browsers will accept a relative URL[citation needed], and it is correct according to the upcoming revision of HTTP/1.1[citation needed]. |
| 08:34 | ciphergoth | hmmmmmm |
| 08:35 | skoodge | ambrosebs: is there a type for sets in core.typed? |
| 08:35 | ambrosebs | skoodge: IPersistentSet |
| 08:35 | ambrosebs | eg. (IPersistentSet Number) |
| 08:35 | skoodge | ah, ok, thanks |
| 08:36 | ambrosebs | skoodge: np. To be clearer, I mean clojure.lang.IPersistentSet. |
| 08:38 | skoodge | ambrosebs: yep, seems obvious in retrospect, as strings are java.lang.String. Didn't make the connection that I could user other "java" types, too. oh well... |
| 08:40 | ambrosebs | skoodge: I don't think I've documented it anywhere, so don't beat yourself up. My fault. |
| 08:43 | skoodge | ambrosebs: when I'm using a map in a homogeneous way, I guess (IPersistentMap a b) is the correct type, right? |
| 08:43 | ambrosebs | skoodge: correct |
| 08:43 | skoodge | great, thanks |
| 08:47 | TimMc | hyPiRion: PONG |
| 08:50 | hyPiRion | TimMc: https://github.com/hyPiRion/hello-swearjure |
| 08:51 | hyPiRion | That a program printing "Hello, World!" in Swearjure with only meta and ns-map (the project.clj) is also swearjurized |
| 08:52 | TimMc | That is truly a work of great beauty. |
| 08:52 | hyPiRion | indeed |
| 08:52 | TimMc | The project.clj is a wonderful touch. |
| 08:54 | TimMc | I look forward to the writeup... and the compiler. |
| 08:55 | hyPiRion | yeah, it's not all that complex really |
| 08:55 | hyPiRion | I just have to remember what I did, I think. |
| 08:55 | TimMc | You got ahold of eval through ns-map? |
| 08:55 | Bronsa | ww-woah |
| 08:56 | hyPiRion | TimMc: yeah |
| 08:58 | TimMc | This all depends on arbitrary map ordering, then? |
| 08:58 | hyPiRion | hahah, yeah. That's why it's only working on Leiningen 2.1.x |
| 08:58 | lsoa | what does ^ mean in clojure? |
| 08:58 | TimMc | I'm not surprised it doesn't work as a jar. |
| 08:59 | TimMc | lsoa: It's a way to attach metadata to a compile-time form. |
| 08:59 | lsoa | (let [^Server s (create-server (dissoc options... |
| 08:59 | TimMc | lsoa: It's used to attach doc strings, add type hints, make vars private... |
| 08:59 | lsoa | so this says s is of type Server |
| 08:59 | TimMc | Sort of. |
| 08:59 | hyPiRion | So the bootstrap part is essentially (defn -- [-] (meta -)), (defn *+ [*] (ns-map *)), then right after I define ++, which is essentially (defn ++ [+] (get-in (*+ (:ns (-- #'+))) [+ 1])) |
| 09:00 | skoodge | is it possible to rename java libraries loaded using import? |
| 09:00 | lsoa | an instance of class Server? |
| 09:00 | TimMc | lsoa: I mean yes, that's what it says, but the only impact is on interop forms. |
| 09:00 | lsoa | I see, thanks :) |
| 09:01 | TimMc | So if you call (.foo s), Clojure knows that's Server.foo |
| 09:01 | TimMc | and doesn't have to emit code to do reflection |
| 09:01 | lsoa | ahh interesting |
| 09:01 | TimMc | lsoa: There's no actual type-checking. |
| 09:02 | TimMc | &(let [^String x (apply + (range 5))] (* 2 x)) |
| 09:02 | lazybot | ⇒ 20 |
| 09:02 | TimMc | &(let [^String x (apply + (range 5))] (.toString x)) |
| 09:02 | lazybot | java.lang.ClassCastException: java.lang.Long cannot be cast to java.lang.String |
| 09:02 | TimMc | &(let [x (apply + (range 5))] (.toString x)) |
| 09:02 | lazybot | ⇒ "10" |
| 09:03 | TimMc | skoodge: Not using the ns form, but you can do it by hand right after it. |
| 09:03 | skoodge | how? By defining my own bindings using (def new-name old-name)? |
| 09:04 | TimMc | skoodge: https://github.com/baznex/imports/blob/v1.4.0/src/org/baznex/imports.clj#L59 |
| 09:06 | TimMc | ,(.importClass *ns* 'M java.lang.Math) |
| 09:06 | clojurebot | java.lang.Math |
| 09:06 | TimMc | ,(M/abs -5) |
| 09:06 | clojurebot | 5 |
| 09:06 | TimMc | skoodge: ^ |
| 09:07 | skoodge | TimMc: wow, nice snippet. Thanks a lot |
| 09:07 | TimMc | Mind you, this is slightly skeevy. |
| 09:08 | TimMc | Theoretically, clojure.lang.Namespace/importClass could be renamed at any time. |
| 09:15 | hyPiRion | ,(importClass *ns* 'm java.lang.Math) |
| 09:15 | clojurebot | #<CompilerException java.lang.RuntimeException: Unable to resolve symbol: importClass in this context, compiling:(NO_SOURCE_PATH:0:0)> |
| 09:15 | hyPiRion | ,(.importClass *ns* 'm java.lang.Math) |
| 09:15 | clojurebot | java.lang.Math |
| 09:15 | hyPiRion | ohhhhh |
| 09:17 | TimMc | ,(.importClass *ns* '& java.lang.Math) |
| 09:17 | clojurebot | java.lang.Math |
| 09:17 | TimMc | ,(&/abs -5) |
| 09:17 | clojurebot | 5 |
| 09:18 | hyPiRion | woop |
| 09:18 | hyPiRion | ,(.importClass *ns* 'nil java.lang.Math) |
| 09:18 | clojurebot | #<NullPointerException java.lang.NullPointerException> |
| 09:18 | hyPiRion | oh well, worth a shot |
| 09:18 | hyPiRion | ,(.importClass *ns* 'true java.lang.Math) |
| 09:18 | clojurebot | #<ClassCastException java.lang.ClassCastException: java.lang.Boolean cannot be cast to clojure.lang.Symbol> |
| 09:19 | hyPiRion | ,(.importClass *ns* 'let java.lang.Math) |
| 09:19 | clojurebot | #<ClassCastException java.lang.ClassCastException: clojure.lang.Var cannot be cast to java.lang.Class> |
| 09:19 | TimMc | ,(.importClass *ns* (symbol "true") java.lang.Math) |
| 09:19 | clojurebot | java.lang.Math |
| 09:19 | hyPiRion | I think I'll stop there for today |
| 09:19 | hyPiRion | oh |
| 09:19 | supersym | :) |
| 09:19 | TimMc | ,(true/abs -5) |
| 09:19 | clojurebot | 5 |
| 09:19 | hyPiRion | ,(true? true) |
| 09:19 | clojurebot | true |
| 09:20 | hyPiRion | ,(.importClass *ns* (symbol "let") java.lang.Math) |
| 09:20 | clojurebot | #<ClassCastException java.lang.ClassCastException: clojure.lang.Var cannot be cast to java.lang.Class> |
| 09:20 | hyPiRion | boo |
| 09:21 | TimMc | ...interesting. |
| 09:22 | rkneufeld | hyPiRion: not sure if this is relevant to you at all, but here, have some math: https://github.com/alandipert/mathemagician |
| 09:22 | TimMc | hyPiRion: That doesn't look right. |
| 09:23 | TimMc | rkneufeld: That looks like a subset of what org.baznex/imports does (or is planned to do). |
| 09:24 | hyPiRion | ,(symbol "let") |
| 09:24 | clojurebot | let |
| 09:24 | hyPiRion | ,(-> "let" symbol symbol?) |
| 09:24 | clojurebot | true |
| 09:25 | hyPiRion | We live in a strange world. |
| 09:26 | ambrosebs | skoodge: This should be useful https://github.com/clojuredocs/cds/blob/master/articles/ecosystem/core_typed/types.md |
| 09:29 | skoodge | ambrosebs: ah, great. Do you already have common type aliases defined somewhere? Not only things like Option, but also for example an alias Set to avoid always writing IPersistentSet |
| 09:30 | ambrosebs | No, that would probably be a good idea for portability. |
| 09:34 | dnolen | ambrosebs: did you see this new feature in typescript, not sure if it's relevant for typed racket or typed clojure but it's interesting - http://blogs.msdn.com/b/typescript/archive/2013/03/25/working-on-typescript-0-9-generics-overload-on-constants-and-compiler-performance.aspx |
| 09:34 | dnolen | ambrosebs: constants can refine the return type |
| 09:37 | ambrosebs | dnolen: that's cool. We can do it in TR and TC with function intersections. (Fn [(Value :a) -> String] [(Value "a") -> Number]) |
| 09:37 | dnolen | ambrosebs: ah cool! |
| 09:37 | ambrosebs | dnolen: I had no idea Typescript didn't have generics :/ |
| 09:40 | ambrosebs | dnolen: so do some JS libraries have interesting/complicated types? continuations and such? |
| 09:41 | dnolen | ambrosebs: hmm, maybe |
| 09:54 | bosie | i tried to get lein midje running but it fails on me |
| 09:54 | bosie | https://www.refheap.com/paste/13002 |
| 09:54 | bosie | even without any facts i get this error |
| 10:04 | TimMc | amalloy: Welp. It turns out that defrecords have a static "create" method taking a map. So that works. |
| 10:05 | TimMc | A little reflection and there it is. |
| 10:05 | yunfan_home | hi i met 403 forbidden error when i try to using lein |
| 10:05 | yunfan_home | its the latest version of lein 2.2 |
| 10:06 | TimMc | yunfan_home: I'm not sure that's been released yet. |
| 10:06 | TimMc | You probably downloaded the wrong script. |
| 10:06 | yunfan_home | since it download from amazon aws, i doubt if their bandwith limits exceed |
| 10:06 | yunfan_home | TimMc: i use the scrip fromo the github repo |
| 10:08 | TimMc | yunfan_home: You downloaded it from the master branch? |
| 10:08 | TimMc | Use this instead: https://raw.github.com/technomancy/leiningen/stable/bin/lein |
| 10:08 | hyPiRion | yunfan_home: What TimMc said, 2.2.0 is not out yet :) |
| 10:09 | yunfan_home | hyPiRion: i tried change the script's version number to 2.1 also got 403 forbidden |
| 10:09 | yunfan_home | i just heard that the 2.1 script has added a launch parameter which let the boot time faster |
| 10:09 | yunfan_home | so want to try that |
| 10:10 | TimMc | yunfan_home: Delete the script you have, use the one I linked to. |
| 10:10 | bosie | is lein-midje 3.0.0 currently broken? |
| 10:10 | bosie | i followed the setup/installation and it throws an error |
| 10:10 | yunfan_home | TimMc: ok will try |
| 10:11 | yunfan_home | TimMc: aha, it works |
| 10:11 | bosie | my project.clj: https://www.refheap.com/paste/13003 |
| 10:11 | yunfan_home | TimMc: i am trying clojure on my arm chromebook :] |
| 10:13 | klang | Am I using clojure in a strange setting, when I have it running on a remote host with an OS different from the computer I'm running Emacs (and nrepl) on? |
| 10:14 | TimMc | bosie: It looks weird that you have midje in both deps and plugins. |
| 10:14 | TimMc | well... I guess that sort of makes sense |
| 10:14 | bosie | TimMc: lein-midje in plugins and midje in deps |
| 10:15 | bosie | TimMc: removing midje from deps yields the same exception |
| 10:15 | Anderkent | Why are unbound variables logically true? Boggles the mind -.- |
| 10:15 | nDuff | Anderkent: because absolutely everything that isn't nil or false is true |
| 10:15 | TimMc | Anderkent: Makes sense to me. |
| 10:15 | nDuff | Anderkent: it's a very simple rule. |
| 10:15 | yunfan_home | i think because they treate 000000000 as false while the rest are true |
| 10:16 | yunfan_home | just like forth does |
| 10:16 | TimMc | yunfan_home: No. |
| 10:16 | TimMc | &(boolean 0) |
| 10:16 | lazybot | ⇒ true |
| 10:17 | yunfan_home | this is very confuse |
| 10:17 | yunfan_home | &(boolean []) |
| 10:17 | lazybot | ⇒ true |
| 10:17 | nDuff | yunfan: Not at all. Neither 0 or [] is the constant nil, or the constant false |
| 10:17 | gfredericks | [] is neither nil nor false |
| 10:18 | nDuff | yunfan: as I said, it's a very simple rule -- easier than having to remember how each different type is handled. |
| 10:18 | yunfan_home | nDuff: by confuse i mean this might confuse people from other programmming lang like me from python |
| 10:18 | yunfan_home | anyway , the rule is really simple |
| 10:18 | gfredericks | hopefully it only confuses them once |
| 10:18 | Anderkent | why aren't unbounds nil then? Or why is nil false? It seems very inconsistent to have nil be false but undefined be truthy |
| 10:18 | nDuff | yunfan: *nod* -- Clojure is more predictable than Python in this respect. |
| 10:19 | nDuff | Anderkent: Because an unbound var is... an unbound var. Which is not the constant nil, or the constant false. |
| 10:19 | jonas11235 | bosie: What exception do you get? |
| 10:19 | gfredericks | Anderkent: I don't think it's very typical to deal with vars that might be unbound |
| 10:19 | Anderkent | nDuff: yes I get the mechanics, what I'm asking is the *reason* for them |
| 10:19 | nDuff | Anderkent: Anyhow, in most use cases, dealing with unbound vars throws an exception |
| 10:19 | nDuff | Anderkent: ...and if you want to know if they're bound or not, that's what bound? is for |
| 10:20 | bosie | jonas11235: https://www.refheap.com/paste/13002 |
| 10:20 | Anderkent | gfredericks: in which case why not make them nil by default |
| 10:20 | nDuff | Hrm. |
| 10:20 | Anderkent | nDuff: except it doesn't if you just do (when my-var :true :false), and it happens to be undefined instead of nil |
| 10:20 | nDuff | I was wrong on the first half of that. |
| 10:20 | joegallo | nDuff: are the exceptions (boolean ...) => false or true? |
| 10:20 | joegallo | jk jk |
| 10:20 | gfredericks | it might be a useful distinction |
| 10:20 | yunfan_home | i guess an unbound variable is already a symbol? |
| 10:20 | gfredericks | e.g., I think you can default *read-eval* to unbound now? |
| 10:20 | jonas11235 | bosie: is there any reason to use clojure 1.3.0? The current stable is 1.5.1 |
| 10:21 | nDuff | yunfan: clojure.lang.Var$Unbound |
| 10:21 | bosie | jonas11235: tbh, i just did lein new |
| 10:21 | nDuff | Anderkent: Sure. It's enough of a corner case that I don't think it's worth complicating the language for, though. |
| 10:21 | gfredericks | Anderkent: there doesn't seem to be a strong argument either way -- like I said 99% of the time you're only dealing with bound vars. |
| 10:21 | bosie | jonas11235: changed to 1.5.1 |
| 10:21 | jonas11235 | bosie: paste your test as well, please |
| 10:21 | nDuff | Anderkent: If you want different behavior, bind your var to nil by default. |
| 10:22 | Anderkent | nDuff: it wouldn't be an issue if it was my var |
| 10:22 | yunfan_home | bosie: they say the boot time of lein2.1 with clojure 1.5.x is really fast |
| 10:22 | bosie | jonas11235: https://www.refheap.com/paste/13004 |
| 10:22 | bosie | yunfan_home: i actually still only have lein2 preview |
| 10:22 | yunfan_home | cat wait to try but still waiting for download |
| 10:22 | bosie | yunfan_home: i guess 'lein upgrade' should get me up to date? |
| 10:22 | Anderkent | gfredericks: `declare` is still fairly common, which means you have to consider unbound vars |
| 10:23 | yunfan_home | bosie: well i just download the new script |
| 10:23 | nDuff | Anderkent: ...anyhow, if you're dealing with something where Unbound is a valid value... (if (and (bound? foo) foo) :true :false) |
| 10:23 | nDuff | Anderkent: ...but, well, that _is_ rare. |
| 10:23 | bosie | yunfan_home: trying the upgrade |
| 10:24 | bosie | jonas11235: any ideas? |
| 10:24 | gfredericks | Anderkent: yes but usually declare just resolves circular references between functions, and by the time either function runs both vars are bound |
| 10:24 | Anderkent | nDuff: it's actually (bound? (var foo)) |
| 10:24 | jonas11235 | bosie: you don't need the [] in the use clause |
| 10:24 | hyPiRion | oh, gfredericks: https://github.com/hyPiRion/hello-swearjure |
| 10:24 | bosie | yunfan_home: now on 2.1.1 and clojure 1.5.1 |
| 10:24 | yunfan_home | bosie: how about the speed? |
| 10:24 | bosie | yunfan_home: insane |
| 10:25 | bosie | yunfan_home: jk. dont know |
| 10:25 | yunfan_home | very fast? |
| 10:25 | jonas11235 | bosie: the problem is not in the test but in the distance-matrix-to-position.core. Remove it from the use just as a test. |
| 10:25 | bosie | jonas11235: it actually works now |
| 10:25 | bosie | jonas11235: i didn't change anything on the code but upgrading lein helped |
| 10:25 | gfredericks | hyPiRion: oh boy oh boy oh boy |
| 10:25 | jonas11235 | bosie: I only put [] in the use clause when I will use :only in it |
| 10:26 | jonas11235 | bosie: nice to know :) |
| 10:26 | bosie | yunfan_home: startup time of 'lein midje' and 'lein test' seems about the same |
| 10:26 | nDuff | Anderkent: That it's not something I use often enough to remember despite writing production code in Clojure on a regular basis supports my point. :) |
| 10:26 | yunfan_home | bosie: i will try that later |
| 10:26 | bosie | yunfan_home: but autotest is blazing fast |
| 10:27 | gfredericks | hyPiRion: that's crazy-go-nuts; so are you convinced swearjure+ns-map+meta is clojure-complete? |
| 10:27 | hyPiRion | gfredericks: Well, I can't uberjar the thing, which is a bit sad |
| 10:28 | hyPiRion | I'm trying to figure out why |
| 10:29 | hyPiRion | Except for that, it seems pretty clojure-complete |
| 10:29 | hyPiRion | In a REPL everything is working |
| 10:32 | supersym | sigh... writing this boardgame is a nice challenge, there are too many ways to do stuff in clojure/lisp |
| 10:32 | yunfan_home | supersym: also there're too many ways to do stuff, at least web framework, in python |
| 10:33 | supersym | oh .. yeah correct |
| 10:33 | gfredericks | hyPiRion: holy crap your project.clj is in swearjure |
| 10:33 | gfredericks | technomancy needs to see that |
| 10:33 | supersym | say... when what would be a reason to have state... I understand the concept, but not in clojure... I'm lost again |
| 10:33 | hyPiRion | gfredericks: yeah, that's the best part :D |
| 10:34 | supersym | is that only when I want to persist data? whats the circumstances exactly |
| 10:34 | hyPiRion | Probably the longest project.clj ever, |
| 10:35 | supersym | and when is something 'side-effect free' then |
| 10:35 | hyPiRion | I stumbled upon a "Caused by: java.lang.ClassFormatError: Invalid method Code length 69270" when making it, so I had to compress the numbers. |
| 10:35 | hyPiRion | Essentially the thing became too large. |
| 10:36 | gfredericks | hyPiRion: haha. I tried writing an algorithm for the smallest rep for an int on an airplane, but got sidetracked by not having a number theory library |
| 10:36 | gfredericks | so I did `lein new numth` and then quit |
| 10:36 | gfredericks | supersym: memoize uses state, to pull a random example out of a hat |
| 10:37 | gfredericks | I think most cookie middleware for ring does as well |
| 10:37 | supersym | thanks |
| 10:37 | hyPiRion | gfredericks: hah |
| 10:38 | hyPiRion | Yeah, my algorithm isn't perfect, but it's good enough |
| 10:38 | pellis_ | i'm trying to compare how much string splitting cost in clojure compared to other languages (including bare java) |
| 10:38 | hyPiRion | I'm essentially prime factorizing, and if the number is a prime, I check out if I can represent the number efficiently as (- (inc n) (*)) or (+ (dec n) (*)) |
| 10:39 | pellis_ | and i'm getting strange results.. probably due to the fact that I can't generate something that does a "for" loop efficiently enough |
| 10:39 | gfredericks | hyPiRion: yeah I was going to go for a branch-and-bound variant of that |
| 10:39 | pellis_ | how can I do 1 million iterations of a piece of code without the iteration block affecting the run? |
| 10:40 | gfredericks | pellis_: clojure.string/split just uses the regex function, so it should be the same as java |
| 10:41 | pellis_ | gfredericks, i'm getting 5 times slowness than Java though - is this all because of the for-loop i'm using (actually a 'loop' construct) |
| 10:41 | gfredericks | pellis_: why are you using a loop at all? are you using clojure.string/split? |
| 10:41 | hyPiRion | gfredericks: ah, nice. I'll need to clean up stuff and write up on how hello-swearjure works |
| 10:41 | gfredericks | hyPiRion: I still don't know if I should expect it to be tractable or not |
| 10:42 | hyPiRion | gfredericks: hahah |
| 10:42 | pellis_ | gfredericks, i will try to paste it |
| 10:42 | supersym | aha.. now I get memoize, the tradeoff... sweetness |
| 10:42 | hyPiRion | gfredericks: I'll make sure to make it as evident as possible. The blog post, that is. |
| 10:42 | pellis_ | http://pastie.org/7138264 |
| 10:43 | gfredericks | hyPiRion: I'm curious if there are good huristics for really big numbers (thousands of digits) |
| 10:43 | gfredericks | I guess at worse you can just do something based on its binary rep |
| 10:43 | nDuff | pellis_: Any particular reason you're building your own for-loop macro rather than using a doseq range? |
| 10:43 | gfredericks | that's a good upper bound for the branch-and-bound alg actually |
| 10:44 | hyPiRion | gfredericks: hmm, yeah |
| 10:44 | nDuff | pellis_: anyhow, discarding that question -- do you get anything if you compile with *warn-on-reflection* true? |
| 10:44 | pellis_ | nDuff, i tried to be as close to the original java code as possible..? |
| 10:45 | nDuff | Huh. Actually, in that specific test, it shouldn't have to reflect to figure out that s is a string. |
| 10:45 | hyPiRion | I want to do something like what William Byrd did with miniKanren (code generation) and pick the smallest representation after a certain amount of tests |
| 10:45 | hyPiRion | runsÆ |
| 10:45 | hyPiRion | * |
| 10:45 | pellis_ | nDuff, no warnings |
| 10:46 | nDuff | *shrug*. Would want to decompile and look at the bytecode. |
| 10:47 | pellis_ | nDuff, its an ugly code.. but i figured it will be the same so its just a throw-away thing so I didn't really invest much aesthetics into it. |
| 10:47 | gfredericks | pellis_: nDuff: might it be the boxed math and such? |
| 10:47 | gfredericks | I guess it'd be surprising if that was a lot compared to the string work |
| 10:47 | ambrosebs | How do people normally hack on the CLJS compiler? I usually have a pom or project.clj I can boot vimclojure off, so I'm a bit lost.. |
| 10:47 | pellis_ | gfredericks, which math? |
| 10:47 | pellis_ | inc? |
| 10:47 | clojurebot | oinc is octo-inc: (apply comp (take 8 (repeat inc))) |
| 10:48 | gfredericks | pellis_: the looping -- < and inc and such |
| 10:48 | gfredericks | if you're using primitives in the java version it's probably a bit faster |
| 10:48 | pellis_ | in the java version is just a traditional C-style forloop |
| 10:48 | nDuff | *shrug*. AOT and decompile and we wouldn't have to guess. |
| 10:48 | gfredericks | hyPiRion: I get "No namespace: + found" when running `lein <X>` |
| 10:48 | nDuff | s/decompile/disassemble/ |
| 10:49 | pellis_ | i'm getting 600ms in Java, 2200ms in Clojure right now |
| 10:49 | pellis_ | same thing in node.js: 70ms :) |
| 10:49 | gfredericks | pellis_: btw the time macro will do the timing logic for you |
| 10:49 | pellis_ | and ruby 2900ms. |
| 10:51 | hyPiRion | gfredericks: what |
| 10:52 | hyPiRion | lein 2.1.1? |
| 10:52 | pellis_ | i'll try warming up the JVM first |
| 10:52 | hyPiRion | Well, I'm running on 1.6.0_27 OpenJDK |
| 10:53 | gfredericks | hyPiRion: yep that fixes it |
| 10:53 | hyPiRion | woop woop |
| 10:54 | pellis_ | no change. so how would you run a piece of code X number of times repeatedly? |
| 10:54 | pellis_ | where X is a very large number |
| 10:54 | gfredericks | (dotimes [n 1000] (foo)) |
| 10:54 | gfredericks | ,(let [a (atom 0)] (dotimes [_ 1000] (swap! a inc)) @a) |
| 10:54 | clojurebot | 1000 |
| 10:55 | gfredericks | ,(time (dotimes [_ 100000] (clojure.string/split "foo and bar" #" "))) |
| 10:55 | clojurebot | "Elapsed time: 132.878713 msecs"\n |
| 10:58 | pellis_ | gfredericks, i'll try that one, thanks |
| 10:58 | gfredericks | what on earth is LazilyPersistentVector about? |
| 11:06 | Chousuke | gfredericks: IIRC it's an optimisation for small vector literals |
| 11:06 | Chousuke | gfredericks: it's just an immutable array until you conj into it. |
| 11:09 | gfredericks | Chousuke: ah ha |
| 11:14 | ToBeReplaced | how do you clean out deftests in clojure-test-mode.el? |
| 11:14 | ToBeReplaced | each time i recompile i just add new tests |
| 11:16 | mpenet | is there a particular reason why *.cljs file do not load clojure-mode ? (I know clojurescript-mode has been removed, I am trying to understand if it's intentional it doesn't do that now). |
| 11:16 | mpenet | nrepl breakage or something? |
| 11:18 | tyler | is there a function that will no-op when something is called on it? |
| 11:18 | ToBeReplaced | nvm i must have done something wonky before with namespaces... i ns-unmapped then tried to recreate the problem and couldn't |
| 11:18 | tyler | or constantly return nil |
| 11:18 | mpenet | tyler: (constantly nil) |
| 11:18 | pl6306 | How do I make a typed array in clojure? For example String[]? |
| 11:19 | gfredericks | &(doc make-array) |
| 11:19 | lazybot | ⇒ "([type len] [type dim & more-dims]); Creates and returns an array of instances of the specified class of the specified dimension(s). Note that a class object is required. Class objects can be obtained by using their imported or fully-qualified name. Class obje... https://www.refheap.com/paste/13007 |
| 11:19 | tyler | mpenet: thanks |
| 11:19 | gfredericks | &(make-array String 12) |
| 11:19 | lazybot | ⇒ #<String[] [Ljava.lang.String;@ee8a8a> |
| 11:19 | gfredericks | mpenet: I think clojurescript-mode is a separate package now? |
| 11:20 | mpenet | I think it has been deprecated |
| 11:20 | nDuff | mpenet: In current emacs live, it _does_ do that: packs/live/clojure-pack/config/clojure-conf.el:(setq auto-mode-alist (append '(("\\.cljs$" . clojure-mode)) |
| 11:20 | mpenet | I could be wrong |
| 11:20 | mpenet | nDuff: yeah I know how to activate it. I was just wondering why |
| 11:21 | mpenet | it seems the regex could be tweaked a bit |
| 11:22 | pl6306 | Why doesn't this work (make-array String "LOADED") |
| 11:23 | nDuff | pl6306: because "LOADED" is a sequence of characters, not a sequence of strings |
| 11:24 | tyler | woah... |
| 11:24 | tyler | ,(tree-seq seq? #(str "foo" %) '((1 7) 2 3)) |
| 11:24 | clojurebot | (((1 7) 2 3) \f \o \o \( ...) |
| 11:24 | tyler | it elides it doh |
| 11:24 | nDuff | pl6306: Do you want an equivalent to (into-array "LOADED") or (into-array ["LOADED"])? |
| 11:25 | pl6306 | The second. |
| 11:25 | pl6306 | Thanks |
| 11:36 | nzee | Photos, talks from Clojure/West event collated here. http://eventifier.co/event/ClojureWest |
| 11:38 | jcromartie | are talks posted yet? |
| 11:38 | jcromartie | oh yeah |
| 11:43 | nzee | Photos, talks from Clojure/West event collated here. http://eventifier.co/event/ClojureWest |
| 12:10 | dsop | is there anykijnd of "standard" what people use for exception handling? just regular java exceptions with try/catch or some handler base things? |
| 12:10 | wink | hyPiRion: oh wow, hello-swearjure is damn impressive |
| 12:10 | S11001001 | dsop: slingshot |
| 12:10 | technomancy | slingshot for catching, ex-info for throwing |
| 12:12 | dsop | S11001001: thx |
| 12:14 | S11001001 | dsop: keep in mind that throwing is a side effect, and side effects and laziness don't mix |
| 12:14 | dsop | S11001001: yes sure, i wont throw withing lazy seqs or anything like that |
| 12:15 | hyPiRion | wink: Thanks! I'm not sure if the fact that I managed to pull it off shows is a good thing or not though. |
| 12:15 | hyPiRion | I mean, it's very revolutionary and stuff, but damn how amazing I am at procrastination. |
| 12:16 | hyPiRion | /s/shows// |
| 12:19 | wink | hyPiRion: :) |
| 12:19 | arrdem | hyPiRion: your swearjure hello world. wat. |
| 12:20 | hyPiRion | arrdem: Oh, just wiat |
| 12:20 | hyPiRion | *wait |
| 12:21 | arrdem | I mean I think I understand what you're doing here... but how did you come up with this abomination? |
| 12:21 | sleetdrop | System Memory: Free: 3.45 GB; Used: 4.55 GB; Total: 8.00 GB; — [❙❙❙❙❙❙❙|❙❙❙❙❙] |
| 12:21 | hyPiRion | arrdem: http://clojure-log.n01se.net/date/2011-04-06.html#19:04 <- |
| 12:22 | hyPiRion | And yeah, it's not complicated once you grasp what I do the first.. uh, 34 lines or so |
| 12:23 | technomancy | once you take enough spice and can grasp the ebb and flow of spacetime through the planes of causality it's pretty straightforward. |
| 12:23 | hiredman | also redbull |
| 12:23 | technomancy | you know, like monads. |
| 12:23 | arrdem | sleep deprivation, stress and coffee is my prefference. |
| 12:23 | arrdem | but redbull can cause all three |
| 12:24 | arrdem | hyPiRion: I suppose something like this was inevitable given the number of language geeks in here... well done can't wait for more rediculus as this is |
| 12:25 | hyPiRion | arrdem: Well, I want to check out if it's possible to create a webserver written in Swearjure. |
| 12:25 | arrdem | ......... |
| 12:25 | hyPiRion | I'm not entirely sure if that's doable though, so I have to figure that one out |
| 12:25 | arrdem | I promise you it is. |
| 12:25 | arrdem | the question is do you want to write it. |
| 12:26 | arrdem | actually I need to understand how you access symbols first. I take that back. |
| 12:26 | technomancy | hyPiRion: so you think you can drop back to 1.0.0 and do it with only a single alpha token? |
| 12:27 | technomancy | if someone can do it without ns-map that's how you know they truly are the kwisatz haderach |
| 12:27 | hyPiRion | technomancy: Yeah, I think I can do it with ns-map only. Though I need to make my own leiningen version for that to make the project map working |
| 12:29 | technomancy | swearjure project.clj is going beyond the call of duty =) |
| 12:29 | arrdem | ooh yeah |
| 12:29 | arrdem | hyPiRion: if you can cook up an anonymus recursive nth this is totally viable with just ns-map |
| 12:30 | arrdem | your project.clj then just needs to create all the refers you need |
| 12:30 | technomancy | if only you could quote % somehow to let you nest #() |
| 12:30 | hyPiRion | arrdem: recursive nth? Why would I need that? |
| 12:31 | hyPiRion | I can just do (`[~@(param-here)] (number-here)) do simulate nth |
| 12:31 | arrdem | Excuse me while I try to wrap my lesser brain around that one. |
| 12:31 | hyPiRion | technomancy: yeah, not having nested function literals is horribly :( |
| 12:31 | hyPiRion | arrdem: It's actually not that complicated. |
| 12:32 | arrdem | wait... [] is IFn? |
| 12:32 | hyPiRion | ,(let [alist (list 1 2 3 4)] [`[~@alist] (`[~@alist] 2))) |
| 12:32 | clojurebot | #<RuntimeException java.lang.RuntimeException: Unmatched delimiter: )> |
| 12:32 | hyPiRion | yes |
| 12:32 | hyPiRion | ,(let [alist (list 1 2 3 4)] [`[~@alist] (`[~@alist] 2)) |
| 12:32 | clojurebot | #<RuntimeException java.lang.RuntimeException: Unmatched delimiter: )> |
| 12:32 | arrdem | okat that's dead obvious then. |
| 12:32 | arrdem | ,([ 1 2 3 4 ] 2) |
| 12:32 | clojurebot | 3 |
| 12:32 | hyPiRion | oh bleh, I've lost control of the parentheses now. |
| 12:33 | arrdem | yeow that's cute |
| 12:43 | dnolen | ejackson: have you seen this http://research.microsoft.com/en-us/projects/fun/? |
| 12:44 | nzee | Photos, talks from Clojure/West event collated here. http://eventifier.co/event/ClojureWest |
| 12:44 | nDuff | nzee: You've been repasting that for a while this morning. |
| 12:44 | nDuff | nzee: ...also, am I just missing something, or is there only a single talk's slides there? |
| 12:44 | gfredericks | nDuff: there's a github repo with a lot of slides |
| 12:45 | nDuff | ...then someone trying to promote a web site with a much smaller set seems awfully spammy to me. |
| 12:46 | nzee | I thought it will be relevant to you folks. sorry |
| 12:48 | patbrown | I've recently started looking into edn and the extensible reader. Is this a proper use case? Sharing the same edn data between client cljs and server clj, so that each platform can call their own respective internal math functions without extra plumbing? |
| 12:49 | patbrown | And can someone point me to an example of extending the reader in clojurescript? Clojurescript Up and Running eludes to it, but doesn't provide an example. |
| 12:59 | ToBeReplaced | saw ex-info came up earlier... is there a best-practice established for the map? |
| 13:00 | supersym | ,'not a literal' |
| 13:00 | clojurebot | not |
| 13:00 | supersym | ,'(not a literal) |
| 13:00 | clojurebot | (not a literal) |
| 13:01 | azkane | hey guys, is there a built in function that takes a list and a pred, and returns the first true element? |
| 13:01 | gtrak | some |
| 13:01 | gtrak | ~(doc some) |
| 13:01 | clojurebot | defmulti doc is (defmulti #^{:doc "docs for foo"} foo class) |
| 13:02 | gtrak | &(doc some) |
| 13:02 | lazybot | ⇒ "([pred coll]); Returns the first logical true value of (pred x) for any x in coll, else nil. One common idiom is to use a set as pred, for example this will return :fred if :fred is in the sequence, otherwise nil: (some #{:fred} coll)" |
| 13:02 | azkane | nice, thanks! |
| 13:02 | hyPiRion | azkane: if you explicitly want "true", you can do (first (filter fn seq)), otherwise, some will do a similar job |
| 13:02 | supersym | hmmm quote is different in repl that instarepl |
| 13:02 | gtrak | azkane: implies your predicate ought to return the value |
| 13:02 | supersym | make sense I guess |
| 13:02 | supersym | *than |
| 13:03 | hyPiRion | ,(some (constantly :hey) [:what :is :this]) |
| 13:03 | clojurebot | :hey |
| 13:04 | hyPiRion | ,(first (filter (comp true? {:a true, :b :foo}) [:b :c :a])) |
| 13:04 | clojurebot | :a |
| 13:04 | azkane | comp looks neat |
| 13:04 | gtrak | hyPiRion: just use boolean |
| 13:05 | hyPiRion | not the same thing |
| 13:05 | hyPiRion | ,(first (filter (comp boolean {:a true, :b :foo}) [:c :b :a])) |
| 13:05 | clojurebot | :b |
| 13:06 | supersym | <3 clojurebot |
| 13:06 | gtrak | I meant (boolean (some ... |
| 13:06 | gtrak | if you explicitly want true or false |
| 13:06 | hyPiRion | oh, right |
| 13:07 | hyPiRion | yeah, it really depends on what you want here |
| 13:10 | borkdude | apparently another clojure book has made it: http://www.amazon.com/gp/product/B00BECVV9C/ref=as_li_ss_tl?ie=UTF8&camp=1789&creative=390957&creativeASIN=B00BECVV9C&linkCode=as2&tag=httpwwwericro-20 |
| 13:24 | skoodge | ambrosebs: do I have to annotate vars in their own namespace? I tried to use (ann ns/some-var some-type), but it did not seem to work |
| 13:25 | tieTYT | http://www.techempower.com/blog/2013/03/26/everything-about-java-8/ |
| 13:25 | ambrosebs | skoodge: it should work with qualified symbols. Perhaps aliases don't work? |
| 13:26 | ambrosebs | skoodge: the core annotations have (ann clojure.core/+ ...) |
| 13:28 | skoodge | ambrosebs: ok, I will try it with the fully qualified name then |
| 13:28 | skoodge | is there any way to remove a type annotation that is currently active? |
| 13:28 | ambrosebs | skoodge: no. |
| 13:28 | skoodge | I have already annotated the var in the other namespace and now would like to remove that annotation |
| 13:28 | ambrosebs | skoodge: restart your repl :/ |
| 13:28 | skoodge | so restarting the process it is? |
| 13:28 | skoodge | k |
| 13:32 | pl6306 | What happens when clojure calls a private method on a class? Does it work and if not is there an idiomatic way of doing it via reflection to set it to be accessible first? |
| 13:33 | hyPiRion | pl6306: It won't work by default, but you can do reflection through clojure.reflection I think |
| 13:33 | shriphani | hi everyone. How do you guys deal with large blocks on text on the repl? On the shell I can pipe to less but I was wondering if there existed something convenient like that for the clojure repl. |
| 13:33 | hyPiRion | Or, if you know how to do reflection in Java, you can just use that |
| 13:34 | pl6306 | I know how to do it java just wondering what it the default |
| 13:35 | hyPiRion | default is no private access |
| 13:35 | hyPiRion | (nor protected) |
| 13:40 | noidi | pl6306, see the source of http://clojuredocs.org/clojure_contrib/clojure.contrib.java-utils/wall-hack-method |
| 13:42 | dimovich | hello all, how do I catch Ctrl+C from clojure? |
| 13:43 | clgv | dimovich: afaik repl-y does that |
| 13:45 | dimovich | clgv: I mean, from the terminal... not from repl |
| 13:45 | dimovich | I wanna save some stuff on program exit... |
| 13:45 | dimovich | maybe there is some other way... |
| 13:46 | clgv | dimovich: yes. repl-y is repl front end which is a program and it catches Ctrl+C |
| 13:47 | hyPiRion | dimovich: look at the source of REPLy to look how it does that |
| 13:47 | dimovich | aha, ok... got it. Thx |
| 13:50 | clgv | dimovich: reply.signals is what you are looking for. usage example for interrupt in reply.eval-modes.nrepl |
| 13:51 | mpenet | packt has a couple of clojure "cookbooks" planned it seems |
| 13:51 | dimovich | clgv: thx |
| 13:52 | jonasen | dnolen: is walk-term really supposed to work like this or am I missing something? https://gist.github.com/jonase/5251620 |
| 13:53 | pl6306 | How does keyword parameters to function work? Say I want to allow for a function call but I don't want for an order of the parameter. |
| 13:53 | joegallo | (defn foo [{:as opts}]) |
| 13:53 | joegallo | opts will be a map, and you can grab things out of it as you'd like |
| 13:54 | joegallo | you call it like this |
| 13:54 | joegallo | (foo :bar baz :quux eggs :ham meat) |
| 13:54 | hyPiRion | joegallo: you forgot the & |
| 13:54 | joegallo | heh, oops! |
| 13:54 | pl6306 | Thanks! Just what I was looking for |
| 13:54 | joegallo | (defn foo [& {:as opts}] ...) ;; <-- note the & that i missed |
| 13:55 | joegallo | thanks, hyPiRion |
| 13:55 | hyPiRion | ,(let [f (fn [& {:as opts}] ((juxt :foo :bar) opts))] (f :hello 10 :bar 42 :foo :quux)) |
| 13:55 | clojurebot | [:quux 42] |
| 13:55 | hyPiRion | np |
| 13:56 | dnolen | jonasen: huh probably not |
| 13:57 | jonasen | is it supposed to do prewalk, postwalk or both? |
| 14:01 | thm_prover | in SWT, can the .getText method be caleld outside of the SWT thread, or does it also have to be called within the SWT thread? |
| 14:03 | grebus | anyone know of good mocking libraries for clojurescript? |
| 14:03 | jonasen | dnolen: also, why is llist a macro? Is that necessary? |
| 14:06 | dnolen | jonasen: llist is old, probably for performance - we could provide a function variant as well. I never personally use llist explicitly tho. |
| 14:10 | jonasen | dnolen: ok. I think the unifier/prep implementatin could be simplified if walk-term worked "as expected". (Maybe I should say as I expected :) |
| 14:11 | jonasen | I guess you don't use clojure.walk since it's not extensible. |
| 14:20 | dnolen | jonasen: and I think slower. ticket and patch / w tests welcome for walk-term. We use it a few places so this may or may not require other chagnes. |
| 14:21 | jonasen | dnolen: I'll take a look at it then :). what about my earlier question: pre/post/both? It seems to do (mostly) both now |
| 14:22 | jonasen | or should I split it like clojure.walk does, i.e. (walk-term inner outer form) |
| 14:22 | dnolen | jonasen: note - I don't really care if it works like clojure.walk at all. And certainly any change that slows down it's specific use in core.logic is no go. |
| 14:24 | jonasen | dnolen: ok |
| 14:28 | pl6306 | If I wanted to change the default reflection behavior of clojure to make a method accessible first before invoking it. Is there a simple macro to do that? |
| 14:29 | nDuff | pl6306: I'm not sure I follow the question. |
| 14:30 | nDuff | Could you provide an example? |
| 14:31 | dnolen | jonasen: took a quick look, I believe the issue is how collections implement walk-term |
| 14:33 | pl6306 | I want to do the equivalent in clojure but more generic an idiomatic. Method getSetMethod = obj.class.getDeclaredMethod("getSet"); getSetMethod.setAccessible(true); |
| 14:34 | pl6306 | I figure a macro would be a good place to put the logic. However my skills in clojure isn't quite there yet |
| 14:38 | nDuff | pl6306: Could you back up a little? What's the larger picture? |
| 14:38 | nDuff | Oh. Got it now. |
| 14:39 | pl6306 | I want to write something that can allow me to invoke a private methond on a class |
| 14:39 | pl6306 | instance |
| 14:39 | nDuff | Yup; took me a moment to grok that. |
| 14:42 | mpenet | pl6306: you could use wallhack for that, or flatland/usefull I think |
| 14:42 | petrrrr | hey, i got a question what would be the easiest way to combine windows + clojure + lighttable? |
| 14:42 | tieTYT | does anyone here use one of the major ides to develop their clojure code? I'm not very happy with Intellij's La Clojure. Do the other ones work better? |
| 14:43 | nDuff | Hmm, not finding it. If there's code in flatland, though, that'd be better than something I wrote ages ago and haven't maintained, anyhow. |
| 14:44 | pl6306 | Thanks looks like wallhack is what I am gunning for |
| 14:44 | mpenet | pl6306: https://github.com/flatland/useful/blob/develop/src/flatland/useful/java.clj#L23 |
| 14:44 | nDuff | tieTYT: http://cemerick.com/2012/08/06/results-of-the-2012-state-of-clojure-survey/ |
| 14:44 | tieTYT | thanks |
| 14:44 | nDuff | tieTYT: Note that Emacs still owns the bulk of the marketshare, by a mile |
| 14:44 | hyPiRion | tieTYT: Well, most of Clojure programmers use Emacs. With autocomplete and paredit, I find it more efficient than e.g. Eclipse |
| 14:44 | nDuff | tieTYT: ...and, to inject my own opinion, there are very, very good reasons for that. |
| 14:45 | mpenet | +1 on emacs, but I hear CCW is nice too |
| 14:45 | nDuff | mpenet: I'll take it seriously when its paredit supports slurp and barf, and not a moment before. |
| 14:46 | mpenet | nDuff: ah I thought it was a done thing already |
| 14:46 | tieTYT | hyPiRion: does the autocomplete work on the java code? |
| 14:46 | nDuff | mpenet: I understand there's been rework that should make that easier, but I hadn't heard that it was done. |
| 14:48 | hyPiRion | tieTYT: the autocomplete isn't like Eclipse's autocomplete, no. It usually takes names from other (open) clojure files, which for my case is more than good enough |
| 14:48 | nDuff | well, it also can take names from an active nREPL session |
| 14:48 | mpenet | it takes autocomplete from imports too |
| 14:48 | nDuff | which is where the real power is |
| 14:49 | nDuff | tieTYT: Are you trying to find a single tool that's best-of-breed for both Java and Clojure? |
| 14:49 | nDuff | tieTYT: My experience is that no such thing exists. IDEA for Java, Emacs for Clojure, and never the twain shall meet. |
| 14:50 | tieTYT | no just best for clojure |
| 14:50 | nDuff | tieTYT: ...then why were you asking about autocomplete for Java code? Did you mean for Java _objects_? |
| 14:50 | tieTYT | yes |
| 14:50 | tieTYT | i meant interop code |
| 14:50 | hyPiRion | nDuff: as in (.toString "...") |
| 14:51 | hyPiRion | etc |
| 14:53 | tieTYT | yeah |
| 14:53 | mpenet | yes it works for method calls too. |
| 14:54 | mpenet | you want nrepl + autocomplete + ac-nrepl for that |
| 14:55 | tieTYT | i think i'm going to try counter clockwise first |
| 14:55 | tieTYT | because learning emacs is its own project |
| 14:55 | nDuff | tieTYT: ...if you use Emacs Live, it has all those things you need built in. |
| 14:55 | tieTYT | Live? Is that a plugin? |
| 14:56 | nDuff | tieTYT: See https://github.com/overtone/emacs-live (or the video at http://vimeo.com/22798433) |
| 14:57 | nDuff | tieTYT: anyhow, in my experience, CCW's paredit mode is a pain to use, whereas emacs' paredit is a thing of beauty and truth. YMMV -- the CCW one works fine for plenty of people -- but if you end up not using paredit at all because of it, that's a shame (and your productivity will be the worse for it). |
| 14:57 | nDuff | ~paredit |
| 14:57 | clojurebot | paredit is not for everyone, but what you need to understand ís how to become the kind of person that paredit ís for. |
| 14:59 | jcromartie | paredit is the blue pill |
| 14:59 | jcromartie | I mean red pill |
| 14:59 | tieTYT | what's paredit? |
| 14:59 | tieTYT | http://emacswiki.org/emacs/ParEdit ? |
| 15:00 | jcromartie | tieTYT: that's it |
| 15:02 | tieTYT | ah now that I know what this is |
| 15:02 | tieTYT | La Clojure does this |
| 15:02 | tieTYT | what's wrong with CCW's? |
| 15:03 | jcromartie | I would trust the JetBrains implementation |
| 15:03 | nDuff | tieTYT: Doesn't support slurp and barf -- or at least didn't a few months ago when I last looked at it again. |
| 15:04 | nDuff | tieTYT: ...if you want to, say, move the next block into a do, the way I'd do that in emacs is to type "(do", followed by ctrl+right-arrow. |
| 15:04 | nDuff | tieTYT: and that fixes indentation and everything. |
| 15:05 | tieTYT | hm |
| 15:05 | tieTYT | ok |
| 15:05 | jcromartie | paredit-mode takes the "code is data" idea and applies it to an editor context, so you can rearrange the structure of your code in whole logical instead of characters or arbitrary regions of text |
| 15:06 | jcromartie | "whole logical chunks" |
| 15:08 | nDuff | *nod*. |
| 15:08 | tieTYT | "SQL, Lisp, and Haskell are the only programming languages that I've seen where one spends more time thinking than typing."- Philip Greenspun |
| 15:16 | tieTYT | last night I needed a function that did (and (.contains s x) (.contains s y) ...) I wrote this as a reduce. Is there a better way? |
| 15:19 | pl6306 | What is clojure equivalent of int.class in java? |
| 15:19 | nDuff | pl6306: Integer/TYPE |
| 15:20 | pl6306 | Thanks! |
| 15:22 | tieTYT | weird, i was just reading that article |
| 15:34 | grebus | hm |
| 15:37 | Glenjamin | late to the party, but i'm getting along fairly well with a poor man's paredit in sublime text |
| 15:37 | Glenjamin | it only has strict parens and a command to expand selection to current expression, but combining those with c&p seems quite usable |
| 15:40 | tieTYT | ah yes, counterclockwise is way better than la clojure |
| 15:41 | amalloy | Glenjamin: you can survive by eating raw meat and sleeping in trees, but civilization is so much nicer; similarly with c/p and paredit |
| 15:41 | Glenjamin | i'd love to grok emacs, but couldn't stomach learning clojure and emacs at the same time |
| 15:42 | tieTYT | Glenjamin: same boat as me |
| 15:43 | Glenjamin | so much muscle memory from other editors to unlearn :( |
| 15:43 | grebus | (instance? js/Object (js/Date.)) => |
| 15:43 | grebus | true, but (isa? (type (js/Date.)) js/Object) => false |
| 15:43 | grebus | sorry about the double enter there |
| 15:44 | MikeSeth | does anyone know if leiningen :repl-port item is something that existed in previous lein versions but was deprecated in favour :repl-options? |
| 15:44 | MikeSeth | s/favour/favour of/ |
| 15:44 | hyPiRion | MikeSeth: Well, it certainly is deprecated now at least |
| 15:44 | hyPiRion | If not completely removed |
| 15:44 | MikeSeth | hyPiRion: but it *was* there, correct? |
| 15:45 | hyPiRion | MikeSeth: yep |
| 15:45 | MikeSeth | I am playing with sublimerepl and it tries to read that key, but that's no longer in use, so I'll have to fix the plugin for it to work |
| 15:45 | hyPiRion | https://github.com/technomancy/leiningen/blob/1.5.1/sample.project.clj#L101 <- |
| 15:46 | MikeSeth | thought so |
| 15:48 | MikeSeth | sublime2 is awesome btw |
| 15:48 | MikeSeth | if not for the occasional hang that one of the plugins here seems to cause in repl |
| 15:56 | patchwork | Hmm… looking for a fn like `some` that actually returns the found value |
| 15:56 | patchwork | Am I just missing it? |
| 15:56 | patchwork | scouring the docs... |
| 15:56 | amalloy | (comp first filter) |
| 15:56 | Glenjamin | is that lazy? |
| 15:57 | patchwork | amalloy: That looks good, but more like (comp first (partial filter predicate?)) yeah? |
| 15:57 | amalloy | no? |
| 15:57 | clojurebot | no is tufflax: there was a question somewhere in there, the answer |
| 15:57 | amalloy | (comp first filter) accepts exactly the same args that some does |
| 15:58 | hyPiRion | ,((comp first filter) odd? (range 10)) ;; <<- patchwork |
| 15:58 | clojurebot | 1 |
| 15:58 | patchwork | Aha, yeah! so do I avoid searching the whole list? I was about to make a loop that just breaks on the first found item |
| 15:58 | Glenjamin | (no, it's not lazy) |
| 15:58 | patchwork | Ah |
| 15:58 | patchwork | Yeah the whole point is to avoid searching the whole list for it |
| 15:58 | amalloy | Glenjamin: that is a nonsense claim |
| 15:59 | mpenet | ,(doc filter) |
| 15:59 | clojurebot | "([pred coll]); Returns a lazy sequence of the items in coll for which (pred item) returns true. pred must be free of side-effects." |
| 15:59 | patchwork | I don't see any reason why it wouldn't be lazy? |
| 15:59 | Glenjamin | ah |
| 15:59 | Glenjamin | i made pred have side effects |
| 15:59 | Glenjamin | to see if it was lazy |
| 15:59 | Glenjamin | >.< |
| 15:59 | patchwork | Cool, thanks amalloy! |
| 15:59 | Bronsa` | well, it's lazy on chunks of 32 elements |
| 15:59 | hyPiRion | Well, if you take the first element, then you have to realize some of them, ait. |
| 16:00 | amalloy | Bronsa`: or chunks of 1 element, or chunks of whatever size chunked-seq someone makes |
| 16:00 | Glenjamin | eg. ((comp first filter) (fn [a] (prn 1) (= a 2)) [1 2 3 4]) prints 4 1s |
| 16:00 | amalloy | Glenjamin: try it with (list 1 2 3 4) |
| 16:00 | Bronsa` | amalloy: sure, right |
| 16:00 | Glenjamin | oh cool |
| 16:00 | Glenjamin | had no idea about chunking |
| 16:02 | patchwork | Anyone know of anything like checkmarx for clojure? http://www.checkmarx.com/ Client is being demanding that their checkmarx doesn't work on our codebase |
| 16:02 | patchwork | (ppppppphh) |
| 16:03 | amalloy | patchwork: i use (constantly true): so far, it has always correctly identified that my software has at least one bug |
| 16:03 | patchwork | amalloy: I'll let them know! |
| 16:04 | Glenjamin | my approach to security has always been to pay a 3rd party to "audit", and then show the client the certificate. |
| 16:04 | Glenjamin | ymmv |
| 16:04 | nDuff | patchwork: it's not security-focused, but there's kibit. |
| 16:04 | nDuff | patchwork: that said, Glenjamin's approach sounds solid to me. |
| 16:06 | Raynes | My approach to security has always been to let xeqi break it and then fix it. |
| 16:06 | amalloy | well, you're rock-solid on part 1, Raynes |
| 16:06 | Raynes | Heh, I've fixed most of the things he found. :p |
| 16:06 | Raynes | http://nelsonmorris.net/2012/09/06/breaking-lazybot-out-of-clojail.html |
| 16:07 | technomancy | if [ `rgrep read-string src | wc -l` != 0 ]; then echo booooogs; fi |
| 16:07 | nDuff | ... |
| 16:07 | nDuff | technomancy: with my #bash hat on, I'm very disappointed. |
| 16:07 | ivaraasen | trying to refactor array-utils ATM. macros are hard, damnit |
| 16:07 | tieTYT | last night I needed a function that did (and (.contains s x) (.contains s y) ...) I wrote this as a reduce. Is there a better way? |
| 16:08 | Raynes | I don't follow. |
| 16:08 | Bronsa` | every? |
| 16:08 | technomancy | nDuff: I make no claims at being good at bash; I only use it when I'm not allowed to use eshell |
| 16:08 | Raynes | Didn't you just write the function just now? |
| 16:08 | nDuff | technomancy: rgrep -q read-string src && echo boooogs |
| 16:08 | tieTYT | can't tell if anyone's replying to me or not |
| 16:08 | Raynes | I am.. |
| 16:09 | Bronsa` | tieTYT(every #(.contains s %) [x y ..]) |
| 16:09 | Raynes | And so is Bronsa`. |
| 16:09 | tieTYT | ok i'm asking if there's a more idiomatic way I guess |
| 16:09 | Raynes | Oh, you wanted to do the contains or arbitrary numbers of things? |
| 16:09 | tieTYT | every isn't in the cheatsheet |
| 16:09 | tieTYT | Raynes: yes |
| 16:09 | Bronsa` | every? |
| 16:09 | Bronsa` | derp |
| 16:09 | tieTYT | ah |
| 16:10 | Raynes | Then I think Bronsa` wins. |
| 16:10 | Bronsa` | sorry. |
| 16:10 | tieTYT | cool i knew there was a better way |
| 16:10 | tieTYT | my way seemed so freaking verbose |
| 16:11 | tieTYT | well not compared to java |
| 16:20 | Raynes | And the 13000th paste award goes to… https://www.refheap.com/paste/13000 … nobody because they didn't bloody well sign in. |
| 16:21 | Raynes | Guys, if you're not using conkeror there is a button in the top right for signing in. It's really easy and you only have to do it once per browser restart and it's one or two clicks to sign in after the initial sign up. |
| 16:21 | gfredericks | ,(* 2 2 2 5 5 5 13) |
| 16:21 | clojurebot | 13000 |
| 16:21 | hyPiRion | gfredericks: oh, me too |
| 16:22 | gfredericks | hyPiRion: I have no idea what that means but I assume it's awesome. |
| 16:22 | hyPiRion | gfredericks: sec |
| 16:22 | jcromartie | gah, I'm making a mess of things, somebody help! |
| 16:22 | Raynes | Stay calm and stop making a mess of things. |
| 16:22 | gfredericks | add more parens |
| 16:23 | Raynes | (inc Raynes) |
| 16:23 | lazybot | You can't adjust your own karma. |
| 16:23 | Raynes | DENIED. |
| 16:23 | patchwork | (inc Raynes) |
| 16:23 | lazybot | ⇒ 25 |
| 16:23 | jcromartie | ))))))))) |
| 16:23 | Raynes | $karma gfredericks |
| 16:23 | gfredericks | (inc lazybot) |
| 16:23 | lazybot | ⇒ 16 |
| 16:23 | lazybot | gfredericks has karma 16. |
| 16:23 | Raynes | I always knew I was better than you. |
| 16:23 | gfredericks | you're so square |
| 16:23 | jcromartie | shouldn't it be (dosync (alter Rayntes inc)) |
| 16:23 | Raynes | I'm very circular. |
| 16:23 | jcromartie | or just swap! |
| 16:23 | jcromartie | but really |
| 16:23 | jcromartie | so |
| 16:24 | jcromartie | the eternal question: how to organize an application |
| 16:24 | Raynes | If there aren't any circular dependencies you're probably not doing too bad. |
| 16:24 | jcromartie | I find myself reverting to the "class" design |
| 16:24 | jcromartie | I got that much |
| 16:25 | jcromartie | but like, a namespace for each "type" in the data model |
| 16:25 | gfredericks | Raynes: you're a square and I'm a hypercube |
| 16:25 | jcromartie | where the data model is configuration of a news aggregation system |
| 16:25 | Raynes | I'm a companion cube. |
| 16:26 | gfredericks | half of my conversations degenerate into me making boring observations about natural numbers |
| 16:26 | jcromartie | and I'm just running around in circles making refs on hash maps with repository abstractions over certain keys in the map |
| 16:26 | hyPiRion | ,(* (#(*%%%)(+(*)(*))) (#(*%%%)(#(+(*)%%)(+(*)(*)))) (#(+(*)(*%%(`[~@%&](+))))(+(*)(*))(+(*)(*)(*)))) |
| 16:26 | clojurebot | 13000 |
| 16:26 | jcromartie | and it seems silly |
| 16:26 | hyPiRion | there |
| 16:27 | hyPiRion | Wow, that's actually quite compact. |
| 16:27 | jcromartie | HEY GUYZ HOW DO MAKE THE PERFECT ARCHIRTECTURE |
| 16:27 | gfredericks | hyPiRion: hah nice |
| 16:27 | gfredericks | jcromartie: queues probably |
| 16:28 | jcromartie | like, I'm trying to discover the one hidden secret design that will solve software design problems forever |
| 16:28 | jcromartie | but let's be totally practical here |
| 16:28 | gfredericks | data? protocols? |
| 16:28 | gfredericks | monads? |
| 16:28 | clojurebot | monads are "yea, though I should walk in the valley of imperative code, I shall fear no evil, for your monad comforts me" - seen in #haskell |
| 16:28 | jcromartie | data is great |
| 16:28 | hyPiRion | jcromartie: Oh, you're making the sufficiently smart compiler. |
| 16:28 | jcromartie | and my data is really simple |
| 16:29 | jcromartie | but let me be concrete here |
| 16:30 | gfredericks | ,'(*%%%) |
| 16:30 | clojurebot | (* % % %) |
| 16:30 | gfredericks | hyPiRion: ^^ that's crazy weird |
| 16:30 | gfredericks | well maybe just regular weird |
| 16:31 | ystael | gfredericks: isn't all of computation essentially boring remarks about natural numbers? |
| 16:31 | hyPiRion | gfredericks: yeah, just as weird as ##(#([`{~% ~@%&}](+)) :a 1 :b 2) |
| 16:31 | lazybot | ⇒ {:a 1, :b 2} |
| 16:31 | gfredericks | ystael: I knew there had to be some way to justify my existence |
| 16:31 | hyPiRion | There was another one too, but I can't remember which exactly. |
| 16:31 | gfredericks | hyPiRion: it hadn't occurred to me to use functions to reduce repetition in numeric literals |
| 16:32 | jcromartie | I have a few parts to the configuration: feed sources, content extraction rules, tag extraction rules, tag expansion rules, geographic points, some auxillary simple config parameters |
| 16:32 | jcromartie | so I can see this as one structure |
| 16:32 | hyPiRion | gfredericks: I've been thinking about it, but I'm not sure how to make a emitter for such functionality yet |
| 16:32 | hyPiRion | I did the previous one by hand, for instance |
| 16:33 | jcromartie | and the HTML interface is literally the only thing that will use the API to change this configuration |
| 16:34 | jcromartie | JSON/XHR, all that jazz |
| 16:34 | hyPiRion | But like, the search space shouldn't be that large. Branch-and-bound or genetical algorithms sounds viable for this task. |
| 16:35 | hyPiRion | Actually, genetical algos are probably overkill. |
| 16:36 | jcromartie | I can make a function that creates Compojure routes from a ref on the state, a key to store the objects in, a function to parse the HTTP parameters into a proper form, a function to sanitize items for output to JSON, and a function to validate a parsed item |
| 16:36 | jcromartie | that seems reasonable right |
| 16:37 | jcromartie | like (make-json-api state-ref :feeds parse-feed render-feed validate-feed) |
| 16:38 | jcromartie | where is a non-trivial Clojure web app source code when you need one |
| 16:40 | SegFaultAX | jcromartie: Refheap and 4clojure are open source. |
| 16:40 | jcromartie | ah yeah |
| 16:40 | gfredericks | hyPiRion: search space is big if you want to check all possible sums for a big number |
| 16:41 | gfredericks | so the question is how to avoid that search |
| 16:41 | hyPiRion | gfredericks: memoization of smaller numbers and branch-and-bound? |
| 16:41 | gfredericks | sounds intractible with a naive B&B |
| 16:42 | gfredericks | there are a lot of possible sums of 10^1000; not sure memoization will help there |
| 16:44 | hyPiRion | gfredericks: well, if you use prime factorization as a precomputer upper bound, wouldn't that limit it somewhat? |
| 16:44 | hyPiRion | *precomputed |
| 16:44 | gfredericks | not if you still have to do some minimal thing for all passible partitions, like check against the bound |
| 16:45 | gfredericks | http://en.wikipedia.org/wiki/Partition_(number_theory) |
| 16:45 | gfredericks | you wouldn't have to check all partitions presumably, but just checking all 2-partitions would be intractable |
| 16:46 | hyPiRion | Ah, I see. |
| 16:46 | gfredericks | not to mention if you're targeting big-big numbers then factoring is barely an option anyhow |
| 16:47 | avishai | hi |
| 16:47 | gfredericks | hi |
| 16:47 | avishai | i'm using every? |
| 16:47 | hyPiRion | If you reorder the numbers based on size and pick the lowest found for e.g. 10000 or so? Sounds like a good heuristic. |
| 16:48 | avishai | and i'm wondering why it evaluates every element of the sequence even if one returns false |
| 16:48 | hyPiRion | avishai: http://blog.fogus.me/2010/01/22/de-chunkifying-sequences-in-clojure/ |
| 16:49 | gfredericks | avishai: you mean realizing a lazy seq beyond what's necessary, or actually calling your predicate more than necessary? |
| 16:49 | jcromartie | ,(every? println [1 2 3]) |
| 16:49 | clojurebot | 1\nfalse |
| 16:50 | jcromartie | avishai: I think it's something else that causes your seq to be realized |
| 16:51 | jcromartie | ,(every? println (repeatedly #(println "generate"))) |
| 16:51 | clojurebot | generate\nnil\nfalse |
| 16:51 | avishai | hmm |
| 16:53 | MikeSeth | i updated sublimerepl doc with some hints on setting up a clojure repl |
| 16:53 | tieTYT | hyPiRion: jeez, that seems scary |
| 16:53 | tieTYT | seems super unpredictable |
| 16:54 | MikeSeth | in case anyone wants to take a look before wuub merges it |
| 16:54 | tieTYT | i mean it's literally predictable, but it seems hard to reason about if your functions aren't pure |
| 16:54 | hyPiRion | tieTYT: Well, it's not intended for impure functions |
| 16:54 | hyPiRion | ,(every? odd? (map #(do (print \.) %) (range 64))) |
| 16:54 | clojurebot | ................................false |
| 16:55 | hyPiRion | ,(every? #(< % 32) (map #(do (print \.) %) (range 64))) |
| 16:55 | clojurebot | ................................................................false |
| 16:55 | tieTYT | in what way is it not intended for that? |
| 16:55 | tieTYT | clojure makes it easy to write impure functions |
| 16:56 | jcromartie | you shouldn't rely on laziness at a small scale, or even on the realization of a lazy sequence at all |
| 16:56 | tieTYT | *in clojure |
| 16:56 | jcromartie | i.e. if realizing your sequence too early is a problem, then maybe it's not a good fit for a sequence? |
| 16:56 | jcromartie | yea |
| 16:57 | tieTYT | just seems slightly limiting to me |
| 16:57 | tieTYT | or does lazy-seq work exactly the way I want? |
| 16:58 | acagle | /flush |
| 16:58 | hyPiRion | tieTYT: Well, I am limiting because it decreases complexity. However, when I want to e.g. read 10 numbers from the terminal, I do use (doall (repeatedly 10 read)) |
| 16:59 | tieTYT | bbl |
| 16:59 | hyPiRion | the doall realizes the whole sequence. |
| 16:59 | enquora | yogthos: wrt to clj-pdf, I assume you wanted an html/css style set of layout directives and wrapped iText with those? |
| 16:59 | yogthos | enquora: it's not really html/css based |
| 17:00 | enquora | perhaps block-based would be a better description |
| 17:00 | yogthos | enquora: yeah |
| 17:00 | yogthos | enquora: basically you make a tree of elements parent style will propagate to children unless they override it, etc |
| 17:01 | enquora | In fact, ConTeXt, the Dutch improvement on LaTeX, takes the same approach to layout description, or at least offers it as an alternative |
| 17:01 | yogthos | enquora: it tries to use sane defaults for stuff, and you can specify custom parameters as maps for each element as needed |
| 17:01 | enquora | you needed tabular layouts? |
| 17:02 | enquora | I'm getting my head around the semantics I need |
| 17:03 | pl6306 | What is the difference between (repeatedly 7 (println "x")) and (repeatedly 7 #(println "x")) |
| 17:03 | amalloy | pl6306: the second one works |
| 17:03 | enquora | am going to rewind the clock and take a look at cl-pdf's layout semantics, as well as some work done by Joe Armstrong called erlguten |
| 17:04 | pl6306 | Why? |
| 17:04 | clojurebot | why is the ram gone is <reply>I blame UTF-16. http://www.tumblr.com/tagged/but-why-is-the-ram-gone |
| 17:04 | pl6306 | Also the function literal will it capture the vars defined in a let form? |
| 17:04 | SegFaultAX | pl6306: Read the doc, it explains exactly what repeatedly does. |
| 17:04 | Bronsa | pl6306: #(println "x") returns (fn [] (println "x")) while (println "x") prints x and returns nil |
| 17:05 | Bronsa | repeatedly being a function, takes a function to be repeated, not a form |
| 17:05 | pl6306 | if I define a function literal in a body of the let will it be able to form a closure around what is defined in let? |
| 17:07 | Bronsa | ,(let [x 1] (#(identity x))) |
| 17:07 | clojurebot | 1 |
| 17:08 | amalloy | Bronsa: ((let [x 1] #(identity x))) is IMO more convincing |
| 17:09 | Bronsa | amalloy: probabily, right |
| 17:18 | pl6306 | Does repeatedly behave differently in REPL versus code? It being lazy does it mean it doesn't run in side defn body? |
| 17:18 | pl6306 | What is the best practice of doing n side effects? |
| 17:18 | pl6306 | (take nscens (repeatedly nscens #(println "repeat"))) overkill? |
| 17:20 | TimMc | pl6306: take is lazy as well |
| 17:20 | pl6306 | That explains why it doesn't work. How can I just make a function body repeat |
| 17:21 | pl6306 | Can't be that hard? |
| 17:21 | TimMc | You just want side-effects, and not the return values? |
| 17:21 | pl6306 | Yes |
| 17:21 | Bronsa | (dotimes [_ times] (println "foo")) |
| 17:21 | TimMc | doseq might be useful |
| 17:22 | pl6306 | Just what I needed |
| 17:22 | tyler | is it idem'potent or idempo'tent i hear most people say idem'potent but omnipo'tent is used in that word |
| 17:28 | pl6306 | Is nested let form inside defn a bad idea? |
| 17:28 | amalloy | tyler: http://www.merriam-webster.com/dictionary/idempotent, why ask us? |
| 17:28 | SegFaultAX | pl6306: Not necessarily. |
| 17:29 | SegFaultAX | pl6306: But it might be easier to condense them if it's possible. |
| 17:29 | tyler | amalloy: i do not belong to the cult of m-w.com |
| 17:29 | tyler | heh |
| 17:32 | Raynes | $dict idempotent |
| 17:32 | lazybot | Raynes: adjective: (computing) Describing an action which, when performed multiple times, has no further effect on its subject after the first time it is performed. |
| 17:33 | SegFaultAX | I pronounce it as a single word. Like if you google "define idempotent" and listen to the sound clip. |
| 17:33 | Raynes | Too bad you can't play sound in IRC. I'd hook it up to a pronunciation website. |
| 17:33 | SegFaultAX | Most people pronounce it like "idem...potent" |
| 17:33 | SegFaultAX | Which sounds weird to me. |
| 17:36 | matthavener | Raynes: there's always CTCP SOUND :) |
| 17:36 | Raynes | lol |
| 17:44 | avishai | hi |
| 17:44 | avishai | again... |
| 17:44 | avishai | why is it that functional solutions to euler problems seems to have longer processing time then procedural solutions? |
| 17:45 | avishai | am i doing it wrong? |
| 17:45 | avishai | or is this inherent? |
| 17:55 | hyPiRion | avishai: Well, that depends on the problem. pre-200 has many algorithm/data structure problems, in which there is a lot of knowledge about efficient procedural solutions |
| 17:55 | hyPiRion | after 200, the solutions tend to be easier with either logic programming and/or functional programming |
| 17:56 | hyPiRion | Though a procedural program should in about the same order of magnitude |
| 17:56 | hyPiRion | should run* |
| 18:00 | avishai | 10x |
| 18:01 | hyPiRion | hm |
| 18:03 | hyPiRion | Well, minimal network (107) is just a minimal spanning tree, which both Kruskal and Prim's are like fairly well known, for instance. |
| 18:05 | hyPiRion | 101 is just polynomial interpolation |
| 18:06 | hyPiRion | It's kind of like, they are computer scientist stuff which have been optimized at the point in time where computational power was scarce. |
| 18:14 | supersym | `/q |
| 18:41 | weavejester | Does anyone happen to know why mapcat might evaluate a lazy seq? |
| 18:41 | weavejester | I'm guessing it's not mapcat directly |
| 18:42 | weavejester | But the seq it's operating on isn't chunked, according to chunked-seq? |
| 18:43 | weavejester | Oh, but it is evaluating it 32 times, so that implies it is chunked somehow. |
| 18:49 | weavejester | Ohh, so (chunked-seq? x) is false, but (chunked-seq? (seq x)) is true |
| 18:50 | weavejester | So there must be a way of unchunkifying a seq somehow... |
| 18:53 | hyPiRion | weavejester: fogus had a solution for 1.1, not sure it still applies though |
| 18:53 | amalloy | weavejester: yes, many easy ways |
| 18:54 | amalloy | which, now that i've said that, i can't remember at all. maybe (map first (take-while seq (iterate next coll)))? |
| 18:54 | weavejester | Hum... |
| 18:54 | weavejester | (type x) => clojure.lang.LazySeq |
| 18:54 | weavejester | (chunked-seq? x) => false |
| 18:54 | weavejester | (chunked-seq? (seq x)) => true |
| 18:55 | amalloy | weavejester: any sub-section of a seq can be chunked anyway |
| 18:55 | amalloy | interrogating just the head can't tell you all you need to know |
| 18:55 | weavejester | I wouldn't have expected the seq function to chunkify a lazy seq. |
| 18:55 | amalloy | weavejester: it didn't; that's the wrong way to think about it |
| 18:56 | amalloy | consider (lazy-seq (generate-chunked-seq)) |
| 18:56 | amalloy | obviously that is not chunked, and is a lazy-seq; equally obviously, when you seq it, you get back something chunked |
| 18:56 | weavejester | Oh, I see. |
| 18:57 | weavejester | seq needs to realize the head, and it might be a chunked seq inside, so to speak. |
| 18:57 | amalloy | another unchunking option: ((fn unchunk [coll] (lazy-seq (when (seq coll) (cons (first coll) (unchunk (rest coll)))))) coll) |
| 18:58 | weavejester | It seems odd this isn't in the core language, considering that lazy seqs are often used in I/O. |
| 18:58 | Raynes | Open a Jira ticket and you might get your wish in a few years. |
| 18:58 | weavejester | Heck, Clojure has clojure.core/line-seq |
| 18:59 | weavejester | Raynes: That's not a huge incentive :) |
| 18:59 | Raynes | Hence why I never make feature requests. |
| 19:00 | amalloy | weavejester: what does line-seq matter? it's not chunked |
| 19:00 | weavejester | amalloy: I mean it's a lazy I/O seq |
| 19:00 | amalloy | so? it's not a chunked seq, so i don't see how it's related to putting unchunk in core |
| 19:00 | amalloy | (not that i think it would be a bad idea to do so) |
| 19:01 | weavejester | Well, if clojure.core has I/O functions that return lazy seqs, that means it gives implicit approval to use lazy seqs with I/O. |
| 19:02 | hiredman | obviously should be using reducers |
| 19:02 | weavejester | Reducers aren't lazy as far as I know? Or was that tongue-in-cheek? |
| 19:05 | hiredman | reducers return a reducible collection without doing the work until the collection is reduced |
| 19:06 | hiredman | https://gist.github.com/hiredman/4075459 |
| 19:06 | chessguy | 'evening ya'all |
| 19:07 | hiredman | and reducers can manage resource life time without consumers needing to use with-open |
| 19:09 | weavejester | hiredman: Ah right, yep. I think in my case unchunking the seq would be the better choice, however. |
| 19:14 | weavejester | Hmmmm… I've unchunked the seq, I think, and it's no longer loading 32 values, but it is loading 4. Why 4? |
| 19:17 | amalloy | insufficient information to solve problem |
| 19:18 | weavejester | This works: |
| 19:18 | weavejester | (first (map #(do (prn %) %) (unchunk (seq [[1 2] [3 4] [5 6]])))) |
| 19:18 | weavejester | But this doesn't: |
| 19:18 | weavejester | (first (mapcat #(do (prn %) %) (unchunk (seq [[1 2] [3 4] [5 6]])))) |
| 19:19 | weavejester | Or rather the first example just evaluates the head, but the second evaluates more. |
| 19:19 | weavejester | (first (mapcat #(do (prn %) %) (unchunk (seq [[1] [2] [3] [4] [5]])))) |
| 19:20 | weavejester | Curiously mapcat evaluates the first 4 elements |
| 19:20 | weavejester | map only evaluates the first 1 |
| 19:21 | SegFaultAX | weavejester: Isn't part of the contract of mapcat that your mapping function returns a seq? |
| 19:22 | weavejester | SegFaultAX: Yes… But I don't get what you're implying. |
| 19:23 | amalloy | weavejester: welllllll, [1] is itself a chunked seq, and the (apply concat ...) in mapcat may be trying to keep it chunked for you |
| 19:23 | weavejester | Ohhh! I bet it has to do with the definition of concat |
| 19:23 | weavejester | Because concat has: ([] [x] [x y] [x y & zs]) as it's arglists |
| 19:24 | weavejester | So from it's arglists alone, it needs to read three to know which to dispatch on |
| 19:24 | SegFaultAX | weavejester: Good call. |
| 19:24 | amalloy | that sounds right |
| 19:24 | weavejester | And then the last is probably due to a (seq …), I guess. |
| 19:25 | SegFaultAX | weavejester: Out of curiosity, what are you working on? |
| 19:26 | weavejester | Basically I have a log of data stored in groups of about 1000 in S3 objects. |
| 19:26 | weavejester | So I have a function like: (mapcat read-objects (list-keys bucket)) |
| 19:28 | weavejester | Under normal circumstances, the result of (list-keys …) is chunked, so it reads 32 in. This means 32 calls to S3, and loading 32000 objects into memory just to get one value. |
| 19:28 | weavejester | So I unchunk list-keys like: |
| 19:28 | weavejester | (mapcat read-objects (unchunk (list-keys bucket))) |
| 19:28 | weavejester | But I'm still reading 4 objects instead of just the 1 when I try to get the first element of the sequence. |
| 19:29 | weavejester | And I think that's because of the way concat is written: it must realize a minimum of 4 elements. |
| 19:30 | weavejester | So in short, I need to write my own stupid mapcat function :) |
| 19:30 | hiredman | for |
| 19:30 | amalloy | weavejester: have you tried using 'for? it might have different characteristics |
| 19:31 | weavejester | amalloy: Can 'for concatenate? |
| 19:31 | amalloy | of course |
| 19:31 | weavejester | I should have known :) |
| 19:31 | brehaut | weavejester: mapcat is bind in the list monad; for is list monad comprehension notation |
| 19:31 | amalloy | &(mapcat identity [[1 2] [3 4]]) |
| 19:31 | lazybot | ⇒ (1 2 3 4) |
| 19:31 | amalloy | &(for [xs [[1 2] [3 4]], x xs] x) |
| 19:31 | lazybot | ⇒ (1 2 3 4) |
| 19:32 | weavejester | Oh, duh, yes of course |
| 19:32 | weavejester | I'll blame my current slowness on having had little sleep and having gotten up… 17 hours ago :) |
| 19:32 | amalloy | brehaut: i give you permission to pretend his "Oh, duh, yes of course" was in response to you; it's the only time you'll ever get that response from that statement |
| 19:32 | brehaut | haha |
| 19:32 | brehaut | thanks |
| 19:33 | weavejester | brehaut: By list monad comprehension notation, do you mean do notation? It's been a while since I've done Haskell. |
| 19:34 | brehaut | weavejester: yes |
| 19:35 | brehaut | weavejester: although to confuse things haskell also has list comprehension notation that is specific to the list monad (and doesnt look like do/for) |
| 19:36 | weavejester | (first (for [xs (seq [[1] [2] [3] [4] [5]]), x xs] (do (prn x) x))) |
| 19:36 | weavejester | And that works, without even needing an unchunk |
| 19:37 | amalloy | another lovely reason to do all sequence processing with 'for |
| 19:38 | hiredman | for really is the best |
| 19:40 | weavejester | I forget how to do the inc thing |
| 19:40 | weavejester | inc amalloy |
| 19:40 | amalloy | (inc for) |
| 19:40 | lazybot | ⇒ 1 |
| 19:40 | weavejester | (inc amalloy) |
| 19:40 | lazybot | ⇒ 44 |
| 19:40 | weavejester | Excellent |
| 19:40 | hiredman | I have this thing I wrote that is sort of like https://github.com/Prismatic/plumbing, but it does the graph list comprehension style |
| 19:41 | hiredman | so if you have {:x .. :y ..} and y depends on x, y is run on each element of x |
| 19:43 | geraldo | cl newbie here. im trying my 1st project with clojure, swing eclipse windowbuilder for designing forms clojure for processing. when I was mixing clojure and java in the same package I could use just one project on eclipse |
| 19:44 | geraldo | now i followed the lein's wiki advice to separate the sources with java-source-paths. when I generate the project i cant use window builder |
| 19:45 | geraldo | is it ok to mix java and clojre on the same package since cl will call java and not the oposite ? Or I need to create a separated project to edit java code ? |
| 19:46 | stain | I would normally say no, split it - but you are building GUI in Eclipse which would be interacting with the Clojure code..? |
| 19:47 | stain | I guess you should still try to split it.. it might force you to do a clearer model-view-controller split - but that is probably better in the long run |
| 19:47 | geraldo | no |
| 19:48 | geraldo | eclipse is just to design and generate forms |
| 19:48 | geraldo | that ll be consumed by clojure |
| 19:53 | tieTYT | is it ok/possible to call some clojure in my java program to process data for me? |
| 19:53 | tieTYT | lots of examples of how clojure can call java code, but not the other way around |
| 19:53 | tieTYT | let me google |
| 19:54 | stain | if you compile the clojure code (which lein will happily do), you will get lots of java classes, one per function I think |
| 19:55 | stain | just the .class files.. but that should be enough. You can also implement a traditional java interface in Clojure |
| 19:55 | tieTYT | stain: http://stackoverflow.com/questions/2181774/calling-clojure-from-java |
| 19:57 | stain | tieTYT: mm, the trouble is the typing of the parameters, so you need to do a bit of declarations |
| 19:57 | brehaut | clojurebot:from java<reply>http://skillsmatter.com/podcast/scala/impromptu-rich-hickey-lightning-talk |
| 19:57 | clojurebot | No entiendo |
| 19:57 | brehaut | bah |
| 19:57 | brehaut | clojurebot:from java is <reply>http://skillsmatter.com/podcast/scala/impromptu-rich-hickey-lightning-talk |
| 19:57 | clojurebot | Roger. |
| 19:57 | tieTYT | stain: i don't mind |
| 19:57 | brehaut | ~from java |
| 19:57 | clojurebot | http://skillsmatter.com/podcast/scala/impromptu-rich-hickey-lightning-talk |
| 19:58 | tieTYT | heh he looks like a dj |
| 19:59 | brehaut | tieTYT, stain: alex ott's answer on that stack overflow is probably more likely to be what you need (its roughly what rhickey presents in that talk), rather than forcing gen-class upon yourself |
| 20:00 | tieTYT | and I just get the str from a legit clj file? |
| 21:41 | ivan | has anyone implemented meta/with-meta in Python, perhaps with WeakKeyDictionary? |
| 21:42 | ivan | oh wait how would that even work, everything is mutable and unhashable |
| 21:44 | ivan | heh TypeError: cannot create weak reference to 'tuple' object |
| 22:13 | n_b | ,(doc ..) |
| 22:13 | clojurebot | "([x form] [x form & more]); form => fieldName-symbol or (instanceMethodName-symbol args*) Expands into a member access (.) of the first member on the first argument, followed by the next member on the result, etc. For instance: (.. System (getProperties) (get \"os.name\")) expands to: (. (. System (getProperties)) (get \"os.name\")) but is easier to write, read, and understand." |
| 22:19 | bytechunky | the source of 'eval' basically is (defn eval [form] (. clojure.lang.Compiler (eval form))). Why is this not endless recursion? |
| 22:19 | gfredericks | you can't spell "transparency" without "paren" |
| 22:20 | gfredericks | bytechunky: the . form is special |
| 22:20 | gfredericks | bytechunky: it's equivalent to (.eval clojure.lang.Compiler form) |
| 22:20 | bytechunky | gfredericks: oh and i always thought that would be (. clojure.lang.Compiler eval form) |
| 22:21 | gfredericks | that might be possible too |
| 22:21 | gfredericks | clojure isn't necessarily the most idiomatic clojure code |
| 22:21 | bytechunky | *needs to think about that* |
| 22:21 | bytechunky | :D |
| 22:22 | gfredericks | for two reasons |
| 22:22 | Sgeo | help I think something's wrong with me |
| 22:23 | Sgeo | I'm starting to not hate Java so much |
| 22:23 | gfredericks | Sgeo: more parens |
| 22:23 | Sgeo | Or, well, no |
| 22:23 | Sgeo | Stockholm syndrome |
| 22:23 | gfredericks | Sgeo: have you been right-clicking to refactor things? |
| 22:24 | Sgeo | Just to make properties out of fields |
| 22:24 | Sgeo | I keep forgetting that this isn't C# where the field name can't share the property name |
| 22:24 | Sgeo | Because properties aren't "real" in Java |
| 22:24 | hyPiRion | Sgeo: Java is okay for algorithm stuff. Not so much anything else. |
| 22:24 | hyPiRion | Well, at least from my point of view. |
| 22:25 | gfredericks | bytechunky: A) idiomacy evolves over time; B) some of clojure.core is defined prior to more advanced features |
| 22:25 | gfredericks | I expect this case is A |
| 22:25 | ivaraasen | hyPiRion: I dunno, man. Swing is pretty sweet if you're into BDSM. |
| 22:26 | hyPiRion | BDSM and mental disorders. |
| 22:27 | hyPiRion | I got to accept that it's pretty good at that |
| 22:30 | corecode | hi |
| 22:30 | hyPiRion | corecode: hey there |
| 22:30 | corecode | i'm having trouble with nrepl; am i right here or is #emacs better? |
| 22:31 | hyPiRion | It's better to be here, yeah |
| 22:35 | jack_rabbit | re there any plans to implement CL-style restarts in clojure? Those were one of my favorite features of CL. |
| 22:35 | jack_rabbit | Are* |
| 22:39 | corecode | for some reason, (nrepl-send-string-sync "(eval '(clojure.repl/doc case))" (nrepl-current-ns)) doesn't return :stdout |
| 22:40 | corecode | but if i don't include the namespace, it works. |
| 22:42 | gfredericks | ,(count (flatten (nth (iterate #(vec (repeat 10 %)) [:x]) 5))) |
| 22:42 | clojurebot | 100000 |
| 22:46 | gfredericks | it takes 70 times longer to count ^that sort of structure than a flat (repeat 100000 :x) |
| 22:47 | hyPiRion | it's even faster to just return 100000. |
| 23:10 | gfredericks | hyPiRion: you're just thinking inside the box |
| 23:11 | amalloy | gfredericks: are you sure it takes longer to count, and not just longer to generate lazily while iterating to count? |
| 23:13 | amalloy | i guess i don't understand the claim, because obviously the only difference is in generating the sequence, not in counting it once it's generated |
| 23:56 | tyler | is there a way to set max ram in leiningen? |
| 23:58 | tyler | ah in sample prj file |