2012-06-30
| 02:11 | xumingmingv | I'am stuck with how to a gen-class and java array related problem |
| 02:11 | xumingmingv | https://gist.github.com/3022563 |
| 02:11 | xumingmingv | is the :constructor part correct? |
| 02:12 | xumingmingv | to use "[java.net.URL;" to represent a java.net.URL class? |
| 03:25 | SrPx | Hey guys. Is there a lein command to run a .clj file? |
| 03:30 | antares_ | SrPx: there is no, you run namespaces |
| 03:30 | antares_ | lein run -m my.namespace.to.run |
| 03:31 | antares_ | namespaces that you want to run need to have (:gen-class) in the (ns …) definition and the -main function that takes & args |
| 03:31 | antares_ | that's it |
| 04:04 | SrPx | antares_: o.o |
| 05:04 | Raynes | Well guys, the Heroku outage isn't effecting refheap anymore. Unfortunately, the database service I use was also effected by the storm that hit the AWS data center. My database is down and until it comes back up, refheap wont be working. Heroku will be trying to restart refheap every 10 minutes for the rest of the night until the database comes back online. |
| 05:05 | Raynes | I'm going to bed, sirs and madams. |
| 05:06 | borkdude | oops |
| 05:06 | borkdude | I read about the storm on the news now… good luck and sleep well |
| 05:28 | alexyakushev | Hello, I'm a new to protocols but is it possible to extend some protocol for an arbitrary object to support destructuring? |
| 05:29 | alexyakushev | I guess if such a protocol exists it should implement `get` function or something |
| 05:34 | borkdude | alexyakushev maybe this? https://groups.google.com/forum/?fromgroups#!topic/clojure/K5HyK7GDnUE |
| 05:35 | borkdude | alexyakushev destructuring uses nth |
| 05:37 | alexyakushev | borkdude: Thanks! I'll take a look |
| 05:37 | alexyakushev | borkdude: I'm looking for associative destructuring, like for maps |
| 05:37 | borkdude | alexyakushev example? |
| 05:38 | alexyakushev | borkdude: You know, {:keys [foo bar]} |
| 05:38 | borkdude | ah |
| 05:38 | alexyakushev | Yes, I found how to do that using `proxy` under the link you provided, thank you again |
| 05:39 | alexyakushev | Though I hoped it is possible to do this without wrapping of any kind. But that's too much:) |
| 05:40 | borkdude | alexyakushev I don't know what is used for associative destructuring, maybe the Associative interface? |
| 05:41 | alexyakushev | From the source code it calls simple `get`, as far as I can tell |
| 05:41 | alexyakushev | And `get` is redirected to clojure.lang.RT |
| 05:41 | alexyakushev | I haven't looked inside yet, but I guess protocols are not available that deep, am I wrong? |
| 05:42 | borkdude | alexyakushev I think you are right, clojurescript has that better solved I think |
| 05:42 | borkdude | alexyakushev one day maybe protocols will make it into this more fundamental level |
| 05:42 | alexyakushev | Well, hail to the Clojure in Clojure while we're waiting for it:) |
| 05:43 | borkdude | alexyakushev just apply a patch ;) |
| 06:07 | borkdude | is there any clojurescript game similar to tictactoe on github? |
| 08:28 | N8Dawg | is anyone else having trouble connecting to www.datomic.com ? |
| 08:56 | kmicu | N8Dwag: no, it works |
| 09:01 | kmicu | N8Dawg: but some Heroku and AWS US based servers was down earlier, maybe this is the reason |
| 10:36 | gfredericks | I'm using Raphael with cljs and wanted to try out advanced compilation. Obviously I need to declare 'var Raphael' in an externs file, but what about all the methods on the raphael objects? how do I declare those? |
| 10:38 | cemerick | gfredericks: I'm right behind you. Please do post or gist about it when you have that riddled out. |
| 10:38 | gfredericks | haha |
| 10:38 | gfredericks | well I guess I'll try it the naive way and make sure it breaks first |
| 10:46 | gfredericks | is clojars on EC2? |
| 10:53 | gfredericks | well apparently justing setting :optimizations to :advanced in the cljsbuild config doesn't do it |
| 10:53 | tomoj | gfredericks: looking at the ip and https://forums.aws.amazon.com/ann.jspa?annID=1528 , I'm guessing no |
| 10:53 | gfredericks | tomoj: ok thx; thought I might have connectivity trouble, but I think it's working fine |
| 11:02 | gfredericks | strangely the cljsbuild docs don't seem to mention advanced compilation at all o_O |
| 11:27 | gfredericks | oh nevermind it did do advanced |
| 11:54 | Scriptor | yep, makes a good deal of difference |
| 11:54 | Scriptor | 18k lines to about 5k |
| 11:54 | Scriptor | andn that 18 is already minimzied |
| 11:54 | Scriptor | *minimized |
| 12:58 | wingy | first i thought why not goto-ns instead of in-ns .. is the answer that clojure tries to stay declarative? |
| 13:09 | gfredericks | wingy: if nothing else, goto-ns confusingly evokes goto |
| 13:14 | gfredericks | $mail cemerick I believe the externs section of http://lukevanderhart.com/2011/09/30/using-javascript-and-clojurescript.html describes the correct way |
| 13:14 | lazybot | Message saved. |
| 13:21 | gfredericks | what are the implications of naming protocol methods with -foo instead of foo? |
| 13:21 | gfredericks | (in cljs) |
| 13:23 | Bronsa | it's just a convention i guess |
| 13:24 | wingy | heh .. i was confused why they only showed vars and not functions :) but functions are first class and can be assigned to any var |
| 13:24 | Bronsa | to tell that a protocol method is intended for internal use only |
| 13:25 | gfredericks | Bronsa: you know that? I originally assumed it was mandatory since it seemed to mirror the .-foo attribute access syntax |
| 13:25 | gfredericks | but only recently discovered you don't need it |
| 13:25 | gfredericks | and want to be sure there's not some crazy performance implication |
| 13:26 | Bronsa | i am not 100% sure, for that ask dnolen, but i'm pretty confident that's the only meaning to the - prefix |
| 13:27 | gfredericks | okay thanks |
| 13:28 | Bronsa | also gfredericks the .-foo syntax was introduced after those protocols were made so i dont think it's related in anyway |
| 13:28 | Bronsa | any way* |
| 13:29 | gfredericks | ah ha. good to know. |
| 13:50 | noko33 | why (meta ^String 'sym) is nil but (meta ^String []) resolves to {:tag java.lang.String} ? |
| 13:51 | Bronsa | i'm guessing you are applying the metadata to the (quote sym) list |
| 13:54 | dreish | Yes, you would need to do (meta '^String sym) |
| 13:54 | dreish | '^String sym is a tagged, quoted symbol. |
| 13:56 | dreish | It looks more sensible if you write out the quote instead of using a quote mark: (meta (quote ^String sym)) ; yes ... (meta ^String (quote sym)) ; no |
| 14:04 | noko33 | Bronsa, dreish: thanks, I understand now |
| 14:11 | dnolen | gfredericks: - is just a convention. first the fn vs. the -first as implemented by a particular type. |
| 14:16 | gfredericks | dnolen: okay cool, thanks |
| 14:31 | bagelz | is there a clojurebot repl I can pm? |
| 14:31 | gfredericks | you can pm clojurebot |
| 14:32 | gfredericks | ,(+ 1 2) |
| 14:32 | clojurebot | #<IllegalArgumentException java.lang.IllegalArgumentException: Wrong number of args (3) passed to: sandbox$eval-in-box> |
| 14:32 | gfredericks | clojurebot seems to be ill |
| 14:32 | gfredericks | but you can also pm lazybot |
| 14:32 | bagelz | very cool |
| 14:32 | bagelz | I pmed him and he did it fine |
| 14:32 | bagelz | that is fantastic. |
| 14:47 | gfredericks | isn't there a constant-time way to find the highest bit set in a number? |
| 14:48 | gfredericks | without using logarithms :( |
| 14:55 | wingy | whats the point of: |
| 14:55 | wingy | (require 'clojure.set) |
| 14:55 | wingy | (clojure.set/union #{1 2 3} #{4 5 6}) |
| 14:55 | wingy | the first line .. the second seems to work without the 1st |
| 14:56 | gfredericks | the require ensures that clojure.set has been loaded. If it got loaded somewhere else already I suppose the second line would still work, but you shouldn't count on it |
| 14:57 | dnolen | wingy: some REPLs (lein) may have loaded clojure.set, but that won't always be the case. |
| 14:58 | wingy | but in the 2nd line im using a namespace qualified symbol |
| 14:58 | wingy | cant still get why i would need the first one |
| 14:59 | dnolen | wingy: libs are not automatically loaded. |
| 14:59 | wingy | this works: (clojure.string/blank? "") |
| 14:59 | wingy | without loading it |
| 14:59 | tmciver | wingy: in general you need the require. For me, lein repl loads it automatically, swank clojure does not. |
| 14:59 | wingy | blank? doesnt work |
| 14:59 | dnolen | wingy: what REPL are you using? |
| 14:59 | wingy | lein |
| 14:59 | dnolen | wingy: lein loads a bunch of things |
| 15:00 | dnolen | wingy: if you use the standard Clojure REPL (which is not as nice), you have to require first. |
| 15:00 | wingy | dnolen: no it didnt load string namespace since blank? wont work |
| 15:00 | wingy | but having (clojure.string/blank? "") worked |
| 15:00 | dnolen | wingy: blank? won't work because you didn't "use"" it, unrelated. |
| 15:00 | wingy | so unless it is doing some magic underneath when i use the full qualified name i still dont get why i have to require |
| 15:00 | gfredericks | wingy: first look up require vs use |
| 15:00 | dnolen | wingy: because automatically loading libs is a terrible idea. |
| 15:01 | dnolen | wingy: refer to the section on namespaces in your favorite Clojure book, should clarify things. |
| 15:03 | wingy | dnolen: the example was from the book |
| 15:09 | wingy | ok one last try: so i fire up "clj" version 1.4 .. i run (blank? "") it couldnt resolve symbol .. i run (clojure.string/blank? "") it worked .. i didn't require it .. so i run (require 'clojure.string) and it required it .. i do (blank? "") it didnt work .. i do (clojure.string/blank? "") it worked .. i dont get the purpose of require |
| 15:10 | wingy | what did it help me with without me being able to do before i required it |
| 15:10 | gfredericks | wingy: (blank? "") will never work until you do (use 'clojure.string) |
| 15:10 | wingy | yeah i know .. im trying to get require |
| 15:10 | gfredericks | that's a separate issue |
| 15:10 | wingy | i get use .. i dont get require .. whats the purpose |
| 15:10 | gfredericks | okay so don't infer anything from whether or not blank? works |
| 15:11 | gfredericks | the purpose of require is to ensure that the namespace has been loaded. the reason you're seeing the behavior you are is that it was loaded already before you required it, which should be considered a coincidence |
| 15:14 | wingy | by loaded you mean the source files are read into memory .. and i can use them but have to specify the namespace qualified symbol |
| 15:14 | wingy | makes more sense now |
| 15:14 | gfredericks | no you do have to specify the namespace qualified symbol |
| 15:14 | gfredericks | oh yes you said that |
| 15:14 | gfredericks | sorry I read an extra negative |
| 15:14 | wingy | you inverted my expression |
| 15:14 | gfredericks | yes I think you have it |
| 15:15 | SrPx | hey guys what is again that clojure library to write html clojure-like and then convert? |
| 15:15 | gfredericks | hiccup |
| 15:15 | gfredericks | or crate in cljs |
| 15:15 | wingy | seems that i always want to use (use) |
| 15:15 | gfredericks | wingy: it's deprecated |
| 15:16 | wingy | use is deprecated? |
| 15:16 | gfredericks | require now has the use functionality as part of its options, and you're encouraged not to blindly use everything from a namespace so that it's easier to track where each symbol comes from |
| 15:16 | gfredericks | but I still use use sometimes :) |
| 15:17 | gfredericks | don't tell anybody |
| 15:17 | wingy | lol |
| 15:17 | wingy | gfredericks: use will be removed? where is the deprecation info |
| 15:17 | gfredericks | I don't know about either of those |
| 15:17 | gfredericks | the changelog for 1.4 might mention it |
| 15:18 | wingy | how did you know its deprecated then |
| 15:18 | gfredericks | I hang out in #clojure a lot |
| 15:18 | wingy | the book isnt mentioning it |
| 15:18 | wingy | ok |
| 15:18 | gfredericks | 1.4 is pretty recent |
| 15:18 | gfredericks | probably recenter than any book |
| 15:19 | SrPx | gfredericks: ty |
| 15:22 | wingy | ok require over use and refer |
| 15:22 | wingy | so many options are creating incidental complexity |
| 15:23 | gfredericks | the ns macro has a long and sordid history |
| 15:23 | bagelz | unavoidable if it's supposed to be useful, right? |
| 15:35 | wingy | clojure is as unix as it can get |
| 15:35 | brainproxy | defend your statement |
| 15:36 | wingy | small pieces doing one thing good one thing only |
| 15:36 | wingy | then macros come to help you |
| 15:36 | brainproxy | :) |
| 15:36 | wingy | this and that to require .. but dont use them! they will make your code messy |
| 15:36 | wingy | use "ns" macro |
| 15:36 | wingy | kinda wtf |
| 15:37 | wingy | you first confuse me .. then you help me out .. while in node.js you just use require() |
| 15:37 | brainproxy | oh, your coming from nodejs also? |
| 15:37 | brainproxy | *you're |
| 15:37 | wingy | yeah .. explaining my confusions a lot huh? :) |
| 15:37 | brainproxy | me too |
| 15:37 | brainproxy | I started w/ nodejs in jan 2010 |
| 15:38 | wingy | a little bit later for me .. are you still using it? |
| 15:38 | brainproxy | still really like it, sure |
| 15:38 | brainproxy | some things are easy to reach for |
| 15:38 | brainproxy | such as sockjs, socket.io |
| 15:38 | wingy | yeah their npm is really neat |
| 15:38 | brainproxy | yeah, npm is really slick |
| 15:39 | wingy | so simple .. also node.js itself is so simple and powerful .. but js is bleeh |
| 15:39 | wingy | used a lot of coffeescript before livescript |
| 15:39 | brainproxy | js can be nice, and I like coffeescript a lot |
| 15:39 | wingy | have a look at LiveScript |
| 15:39 | wingy | its Coffee with FP style |
| 15:39 | brainproxy | but ultimately, once you get a sense of what immutable collections and STM bring to the table, it's hard to want to prog in plain old js |
| 15:40 | wingy | yeah |
| 15:40 | wingy | for how long have you been using clojure? |
| 15:40 | brainproxy | going on two months now |
| 15:40 | brainproxy | not very long |
| 15:40 | tomoj | STM == atoms in this case? |
| 15:40 | brainproxy | read the O'Reilly book on Clojure as a crash course |
| 15:40 | brainproxy | tomoj: i meant STM in general |
| 15:41 | brainproxy | as opposed to having to think about splitting work out to different processes |
| 15:41 | tomoj | processes? thought you were talking about js |
| 15:41 | brainproxy | nodejs has a notion of processes |
| 15:41 | brainproxy | e.g. the child_process module |
| 15:41 | brainproxy | which is actually really cool |
| 15:41 | tomoj | don't see how that is relevant |
| 15:42 | brainproxy | well, um, with a single thread, if you have anything cpu bound then you'll get eaten alive |
| 15:42 | brainproxy | so you need to split out work and coordinate among processes |
| 15:42 | wingy | for blocking operations |
| 15:42 | brainproxy | even with the cluster sugar, it's still kind of hairy |
| 15:43 | wingy | if you don't want to chunk the long living operations in pieces and have everything in one process .. but that is an ugly hack in my ears |
| 15:43 | tomoj | I don't see how cljs helps at all there |
| 15:43 | brainproxy | we're not talking cljs |
| 15:44 | brainproxy | if I accidentally said cljs i meant straight up clojure |
| 15:44 | tomoj | oh, clj-jvm vs js? |
| 15:44 | brainproxy | yes |
| 15:44 | brainproxy | well, vs nodejs considered in toto, not just js the language |
| 15:44 | wingy | clj/jvm vs js/node.js |
| 15:45 | wingy | i feel it doesn't add much value to use cljs on node.js |
| 15:45 | tomoj | I disagree strongly |
| 15:47 | tomoj | unless you mean it doesn't add much value to use cljs/node.js instead of clj/jvm, then I only disagree weakly :) |
| 15:47 | brainproxy | i think cljs on top of nodejs is pretty attractive actually |
| 15:47 | wingy | yeah that was my point |
| 15:48 | brainproxy | because of the things cljs gives you |
| 15:48 | wingy | i would rather wanna use clj/jvm than cljs/node.js |
| 15:48 | brainproxy | i'm just saying that when I bump up against anything that dips into mvcc territory |
| 15:48 | brainproxy | then I am going to go with clojure/jvm |
| 15:48 | brainproxy | hands down |
| 15:49 | brainproxy | the reality is that a lot of web facing stuff, e.g. collaborative web apps, that kind of thing |
| 15:49 | wingy | brainproxy: what db are you using? |
| 15:49 | brainproxy | easily start to deal with mvcc related concerns, and in my experience trying to work that out with node is kind of difficult |
| 15:49 | tomoj | I would almost say that it is impossible |
| 15:50 | brainproxy | wingy: some couch stuff, i am experimenting with orientdb also |
| 15:59 | wingy | thougt about using datomic .. anyone having experience with that one? |
| 16:18 | antares_ | folks who have been asking for an alternative insert function in Monger: 1.1.0-beta1 now has it, see https://github.com/michaelklishin/monger/blob/master/ChangeLog.md |
| 16:32 | augustl | are there any books out there that describes the details of the inner workings of the persistent data structures in clojure? |
| 16:35 | arohner | augustl: http://blog.higher-order.net/2009/02/01/understanding-clojures-persistentvector-implementation/ |
| 16:35 | arohner | http://blog.higher-order.net/2009/09/08/understanding-clojures-persistenthashmap-deftwice/ |
| 16:42 | augustl | arohner: cool, thanks :) |
| 16:42 | augustl | would be interesting to try to implement it on top of Node.js buffers |
| 16:42 | augustl | which are just raw out-of-vm (but still garbage collected) allocated bytes |
| 16:47 | wingy | lein is like npm but for the whole project cycle |
| 16:47 | wingy | pretty cool |
| 16:48 | augustl | there are so many things that are solved problems on the JVM platform.. Makes you wonder why people bother to make new ones. |
| 16:48 | augustl | I've heard Oracle is implementing Node.js on the JVM, for example |
| 16:49 | antares_ | with a complete JS implementation based on invokedynamic, yes |
| 16:49 | wingy | what? |
| 16:49 | clojurebot | what is 2d6 |
| 16:49 | augustl | V8 is cool, but is it worth having to write all the libraries from scratch again? :) |
| 16:49 | antares_ | it will be part of JDK 8, called Nashorn |
| 16:49 | augustl | a fork of Rhino? |
| 16:49 | antares_ | no, a green field design |
| 16:49 | antares_ | invokedynamic from the ground up |
| 16:50 | augustl | interesting naming, Nashorn = rhino (ish) in many european languages |
| 16:50 | antares_ | yes, absolutely, that's the pun |
| 16:51 | antares_ | http://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CFEQFjAA&url=http%3A%2F%2Fwiki.jvmlangsummit.com%2Fimages%2Fc%2Fce%2FNashorn.pdf&ei=imbvT5npNYLU-gariJmvAw&usg=AFQjCNFyPrV5etR8ikgrNn5-5wZCZUWyGA&sig2=ywfL2opN9UPUq0gVayfTEg |
| 16:52 | augustl | great, thanks |
| 16:52 | wingy | so js would be yet another jvm lang |
| 16:52 | antares_ | right |
| 16:52 | wingy | using a new engine |
| 16:53 | wingy | but that wouldn't affect clojure programmers who only wants to use clojure |
| 16:53 | augustl | Rhino is kind of black magic, seems like a welcome addition |
| 16:53 | wingy | i can understand the need for javascript for java coders since java is not dynamic |
| 16:54 | antares_ | wingy: it has no relation to Clojure, just saying that Oracle indeed works on a JS implementation and there are at least two projects that are "polyglot Node.js-like environments" |
| 16:54 | wingy | yeah |
| 16:54 | antares_ | and it is just one more proof that they care about JVM being polyglot |
| 16:54 | wingy | pretty cool initiative |
| 16:54 | wingy | yeah just like heroku |
| 16:54 | wingy | i like polyglotism |
| 16:58 | wingy | seems that jvm is of higher value, than the java lang itself |
| 16:58 | wingy | i dont think they thought it would play out like this in the late 90s? |
| 16:58 | wingy | the goal was to make Java the lang popular right |
| 16:59 | pipeline | as far as i understand it |
| 17:00 | pipeline | they expected the jvm to be very valuable also |
| 17:00 | augustl | not sure if this is off topic, does clojurescript implement persistent data structures? The presentation by Rich Hickey on blip.tv is a year old or so |
| 17:00 | antares_ | augustl: it does |
| 17:00 | augustl | with the same performance characteristics of cloure? |
| 17:01 | augustl | that is, a vector with 1000 items won't perform a full cow when creating a copy with one more item added to it, etc |
| 17:03 | tomoj | if it did that, it wouldn't be persistent, would it? |
| 17:03 | antares_ | augustl: more or less, they are doing some interesting things to get as close as possible to JVM Clojure performance where JS VMs can optimize things well |
| 17:04 | tomoj | actually if you always do a full copy, then 'old versions' are not penalized, so maybe that does count as persistent.. just always slow? |
| 17:05 | augustl | antares_: cool |
| 17:05 | technomancy | tomoj: I'm not sure the whole "old versions don't degrade in perf" is necessarily technically part of persistence. I think it depends on who you ask. |
| 17:05 | augustl | tomoj: no idea.. I'd guess the performance characteristics of making copies with alterations is part of the whole "persistent" thing |
| 17:05 | tomoj | technomancy: naturally |
| 17:06 | tomoj | in effect I was asking you :) |
| 17:06 | augustl | currently investigating why everyone is using backbone and jQuery and nobody is using google closure for building JS apps, google closure seems insanely powerful |
| 17:06 | augustl | (meta-related to clojurescript) |
| 17:11 | tomoj | with backbone you just download one small file, drop in a jquery cdn link, write 10 lines of code and you have a stupid todo list |
| 17:12 | tomoj | for many it would take longer just to understand what the hell closure is I think |
| 17:12 | augustl | yeah, people seem to like tools that are easy to use the first days and weeks while writing an app |
| 17:12 | augustl | indeed, I'm currently having to make a big effort to figure out how to use closure. Seems like it's worth it, but the docs by Google are kind of meta |
| 17:14 | akhudek | sadly, I think there is probably a need for some sort of easy bootstrap for the clojure stack, even though that sort of "easy" is against the general philosophy of the language |
| 17:14 | akhudek | some of the noir + lein newnew templates are a good start |
| 17:15 | akhudek | I shouldn't say against the philosophy, rather, not the most important kind of "easy" |
| 17:18 | augustl | I've had enough of tools that optimize for being easy to get started with ;) The "getting started" chunk is quite a lot smaller than the "being a competent user of" chunk. |
| 17:19 | antares_ | akhudek: it is not against, it is just not the #1 priority for the core team. I think the community in general is all for making all kinds of things easier on newcomers. |
| 17:23 | SrPx | ... |
| 17:26 | SrPx | I'm trying to create a project using leiningen: C-x shell, lein new myproj... the problem its being created on emacs/bin |
| 17:38 | wingy | i feel disabled in clojure world |
| 17:38 | wingy | how do i run a .clj script? |
| 17:40 | kovasb | wingy: theres a number of tools for that |
| 17:40 | kovasb | wingy: 3rd party stuff on github |
| 17:40 | wingy | wow .. sounds hard to do a such simple things .. is it because it has to be compiled etc? |
| 17:40 | kovasb | or you can just write a shell script |
| 17:41 | kovasb | i don't think it needs to be compiled |
| 17:41 | wingy | is there no equivalent to someething as simple as: "node.js ./script.js" ? |
| 17:41 | kovasb | but it does need to be run through the jvm |
| 17:41 | wingy | "node ./script" i meant |
| 17:41 | kovasb | yes, there are such things |
| 17:41 | kovasb | probably many , on github |
| 17:42 | Chousuke | wingy: the biggest problem with running clojure programs as scripts is the jvm startup time. |
| 17:42 | kovasb | wingy: most stuff tends to be automated through lein |
| 17:42 | wingy | kovasb: could lein run a simple script like that? |
| 17:42 | kovasb | wingy: that automates a huge number of things |
| 17:42 | aperiodic | wingy: if you're using lein, then the easiest way is probably `lein run -m my.ns`, if my.ns has a -main fn |
| 17:43 | kovasb | usually i do "lein run" |
| 17:43 | kovasb | from inside my project folder |
| 17:43 | kovasb | and it runs |
| 17:43 | augustl | I don't think the java platform is commonly used for command line scripts |
| 17:43 | kovasb | wingy: https://github.com/technomancy/leiningen/blob/master/doc/TUTORIAL.md |
| 17:43 | augustl | or CLIs in general |
| 17:44 | augustl | because of the slow startup time that was already mentioned |
| 17:44 | wingy | i see .. explains why its so difficult |
| 17:44 | kovasb | how to run a script is an example in the middle |
| 17:44 | augustl | so since few people do it, that's probably why it's hard to do :) |
| 17:44 | wingy | hmm a big - |
| 17:44 | wingy | scripts are making dev faster |
| 17:44 | kovasb | yeah, its more like "i wanna run my program" rather than "i wanna run my script" |
| 17:44 | kovasb | but nb there are solutions for jam startup time |
| 17:45 | augustl | doesn't `java -jar path/to/clojure.jar path/to/the-script.clj` work? |
| 17:45 | augustl | it will execute the -main of the-script.clj |
| 17:45 | augustl | (afaik) |
| 17:46 | kovasb | i think you put the namespace instead of a file path |
| 17:46 | aperiodic | what about the classpath? |
| 17:46 | kovasb | if you are calling java directly ilke that you need to use the options of java |
| 17:47 | kovasb | (the executable) |
| 17:47 | wingy | ok lein run -m app.core worked great .. ill stick to that one for now til im not a noob anymore :) |
| 17:47 | kovasb | sweet! |
| 17:47 | wingy | hate the first month of noobishness .. you are so disabled |
| 17:47 | kovasb | yeah learning about lein is great |
| 17:47 | kovasb | thats what its all about |
| 17:48 | wingy | "For those of you new to the JVM who have never touched Ant or Maven in anger: don't panic. Leiningen is designed with you in mind." |
| 17:49 | wingy | he read my mind |
| 17:50 | wingy | isnt there a way to make jvm startup time faster for testing things out? |
| 17:50 | wingy | eg. having it up all the time .. then there would be no need for start up? |
| 17:53 | augustl | wingy: there are many ways to reload stuff in a jvm as it runs yeah |
| 17:54 | wingy | augustl: i mean for running simple .clj scripts .. it takes like 5 secs for jvm to start .. is there a way to have it as fast as node? |
| 17:54 | aperiodic | no |
| 17:54 | wingy | ok |
| 17:55 | aperiodic | you can mitigate things somewhat by AOT-compiling, but jvm startup is always gonna be a second or two for the foreseeable future |
| 17:56 | augustl | wingy: well there are other JVMs out there than HotSpot, perhaps there are some with focus on startup speed |
| 17:56 | augustl | but now I'm just guessing, for all I know, long startup time is an effect of the bytecode formats or whatever |
| 17:56 | wingy | but why does it start and stop start and stop all the time .. cant it just be started? |
| 17:57 | wingy | if you want a clean state for some reason you could just run a command for it .. but it would always be started .. kinda makes sense |
| 17:58 | augustl | technically speaking it can, afaik |
| 17:58 | aperiodic | that is the usual strategy for development. run a repl or swank server, restart it only when you have to, and run tests in a persistent autotest mode so you don't have to wait on jvm startup |
| 18:00 | wingy | yeah i have to find my dev flow for clojure/java |
| 18:01 | wingy | it sure won't be like the one for node |
| 18:01 | wingy | and perhaps it shouldn't |
| 18:01 | aperiodic | do you use vim/emacs? |
| 18:01 | wingy | no |
| 18:01 | wingy | sublime text as a interim editor |
| 18:08 | aniero | wingy: vim or emacs gets you in-editor code evaluation with varying levels of hackery involved in making it work |
| 18:08 | aniero | recommend lein-tarsier + vimclojure, if you do vim. emacs, you're on your own |
| 18:09 | aniero | ... or most people in here can help with that, i assume :D |
| 18:09 | wingy | :) |
| 18:10 | aniero | wingy: have a project you're working on? |
| 18:10 | wingy | yeah |
| 18:11 | wingy | i hope 2 weeks will get me up to speed with clojure |
| 18:11 | aniero | it'll probably take longer than that... heh |
| 18:12 | wingy | why i hope |
| 18:12 | aniero | think i'm getting the hang of things, though |
| 18:18 | SrPx | 2 days trying to learn clojure and I can't even get a hello world because I can't do anything with emacs, clojure repl won't work with sublime, not good with notepad++, don't know eclipse |
| 18:18 | SrPx | sigh : / |
| 18:19 | hyPiRion | Tried clojure-box? |
| 18:20 | hyPiRion | http://clojure.bighugh.com/ |
| 18:20 | amalloy | SrPx: just use your favorite editor, and don't bother with editor integration. paste it into a command-line repl |
| 18:21 | ivaraasen | SrPx: had some problems with the repl in Sublime myself. worked once i fixed the keymapping |
| 18:21 | SrPx | hmm |
| 18:22 | SrPx | amalloy: but everything uses leiningen |
| 18:22 | amalloy | yes, and i advocate using leiningen |
| 18:22 | wingy | just use the command line instead |
| 18:22 | SrPx | ivaraasen: you are using sublime? |
| 18:22 | amalloy | from the command line |
| 18:22 | wingy | SrPx: i am .. but just for editing text |
| 18:22 | amalloy | you don't need any editor support to use clojure productively |
| 18:22 | SrPx | ivaraasen: how did you fix the repl? |
| 18:22 | ivaraasen | SrPx: yeah |
| 18:22 | ivaraasen | i have leiningen installed though |
| 18:23 | wingy | wow cool .. lein repl includes clojuredocs examples |
| 18:24 | wingy | but bad that i have to run (doc *ns*) and then (cdoc *ns*( |
| 18:24 | wingy | but bad that i have to run (doc *ns*) and then (cdoc *ns*) |
| 18:24 | SrPx | ivaraasen: how did you do it |
| 18:46 | wingy | programming is like a game in which you want to escalate to the next level |
| 18:49 | ivaraasen | wingy: i prefer trying to glitch the games |
| 18:51 | augustl | speaking of games, have anyone ever created games with Clojure? I suppose interfacing with LWJGL from clojure isn't too hard. |
| 18:51 | antares_ | augustl: people typically use clojurescript for games |
| 18:52 | augustl | for browser based games, you mean? |
| 18:52 | aperiodic | augustl: there are implementations of tetris & asteroids in penumbra's examples folder (https://github.com/ztellman/penumbra/tree/master/test/example/game) |
| 18:52 | ivaraasen | augustl: i've seen a guy do Minecraft mods in Clojure |
| 18:53 | aperiodic | (this seems to be a really popular question here in the past few days) |
| 18:53 | augustl | ivaraasen: ah, interesting, I'll look that up |
| 18:54 | ivaraasen | augustl: it's named conjcraft if I remember correctly |
| 18:54 | augustl | yeah just found it, that's correct |
| 19:21 | recur | Hi, I'm a clojure n00b. I want to repeatedly apply a function a set number of times passing in the output as the input. Is there a simple way to do that (I'm trying not to create loops :) )? |
| 19:24 | jjido | recur: you want a fold it seems |
| 19:25 | recur | oh cool, looks perfect |
| 19:25 | recur | thanks jjido, didn't know that existed :) |
| 19:28 | jjido | recur: it is called reduce |
| 19:28 | jjido | ,doc reduce |
| 19:28 | clojurebot | #<CompilerException java.lang.RuntimeException: Can't take value of a macro: #'clojure.repl/doc, compiling:(NO_SOURCE_PATH:0)> |
| 19:28 | recur | oh haha, i was looking at the actual clojure 'fold' function |
| 19:28 | recur | wow, clojurebot failed |
| 19:28 | jjido | I failed |
| 19:29 | recur | ,doc fold |
| 19:29 | clojurebot | #<CompilerException java.lang.RuntimeException: Can't take value of a macro: #'clojure.repl/doc, compiling:(NO_SOURCE_PATH:0)> |
| 19:29 | recur | at least it doesn't crash :D |
| 19:29 | recur | an egg drop hitting an exception on the other hand… :P |
| 19:30 | hyPiRion | ,(doc reduce) |
| 19:30 | clojurebot | "([f coll] [f val coll]); f should be a function of 2 arguments. If val is not supplied, returns the result of applying f to the first 2 items in coll, then applying f to that result and the 3rd item, etc. If coll contains no items, f must accept no arguments as well, and reduce returns the result of calling f with no arguments. If coll has only 1 item, it is returned and f is not called. If val i... |
| 19:30 | hyPiRion | It didn't fail, it returned exactly what you would expect it to return. |
| 19:31 | aperiodic | ,(take 10 (iterate inc 0)) |
| 19:31 | clojurebot | (0 1 2 3 4 ...) |
| 19:31 | aperiodic | recur: i think iterate is what you want |
| 19:31 | aperiodic | ,(doc iterate) |
| 19:31 | clojurebot | "([f x]); Returns a lazy sequence of x, (f x), (f (f x)) etc. f must be free of side-effects" |
| 19:31 | recur | ahh, awesome |
| 19:32 | recur | ,(rest '(3 4 5)) |
| 19:32 | clojurebot | (4 5) |
| 19:32 | recur | sweet bot :) |
| 19:32 | aperiodic | ~botsnack |
| 19:32 | clojurebot | Thanks! Can I have chocolate next time |
| 19:34 | recur | ,(clojure.repl/doc first) |
| 19:34 | clojurebot | "([coll]); Returns the first item in the collection. Calls seq on its argument. If coll is nil, returns nil." |
| 19:35 | recur | sweet, learned how to use namespaces at the same time. Pretty useful 5 mins :) |
| 19:35 | recur | thanks for the info! |
| 19:36 | recur | hehe, with light table and doc, I now have my own personal dynamic reference page :) |
| 19:58 | wingy | lein is the defacto for clojure i guess. no need to look at maven at all? |
| 19:59 | gfredericks | not unless you're already using it or have some organizational incentive like that |
| 19:59 | ivaraasen | i really need to try Overtone |
| 20:01 | wingy | looks really cool |
| 20:01 | wingy | music in code |
| 20:03 | SrPx | Can I use java libs on clojurescript? (guess not =S ) |
| 20:03 | wingy | SrPx: yes |
| 20:03 | SrPx | wingy: o.o |
| 20:03 | wingy | full java interop |
| 20:03 | gfredericks | no |
| 20:03 | SrPx | ... |
| 20:04 | wingy | oh ... |
| 20:04 | wingy | O_o |
| 20:04 | gfredericks | unless maybe you run it on rhino I suppose |
| 20:04 | gfredericks | but if you're doing that there's no reason to use cljs |
| 20:04 | wingy | oh clojurescript :P |
| 20:04 | gfredericks | there are easier ways to slow your code down |
| 20:04 | gfredericks | I recommend Thread/sleep |
| 20:05 | wingy | :) |
| 20:06 | wingy | overtone looks neat! |
| 20:06 | wingy | finally no more software pianos! |
| 20:06 | SrPx | õo |
| 20:06 | SrPx | lol. |
| 20:18 | kovasb | this 1424 build of cljs is killing me |
| 20:18 | kovasb | anyone know how satisfies? has changed? |
| 20:19 | ivaraasen | wingy: also, OSC integration is quite nice. i've done a few small live sessions using my Android phone to control Renoise. |
| 20:20 | gfredericks | I'm not sure how lein cljsbuild tests are supposed to work |
| 20:21 | kovasb | clojure needs the sponsorship of some internet billionare |
| 20:21 | kovasb | so many lose ends |
| 20:23 | gfredericks | a lot of ends have been tightened so far |
| 20:23 | kovasb | yes, but the surface area is speeding :) |
| 20:23 | kovasb | spreading |
| 20:25 | kovasb | fml. i can't event ind where satisfies? is implemented in the source |
| 20:27 | kovasb | ah there we go. |
| 20:42 | gfredericks | with the cljsbuild browser repl, is there any way to update code without restarting everything involved? |
| 20:45 | kovasb | update code? |
| 20:45 | wingy | seems that you really don't need to install clojure at all |
| 20:45 | gfredericks | like change my source code |
| 20:45 | gfredericks | and have the repl reflect that. |
| 20:45 | kovasb | you can reload the application without rebooting the repl |
| 20:45 | wingy | your install jvm then lein .. and it will fire up clojure using "lein repl" |
| 20:45 | kovasb | the repl state will remember what namespace you are in |
| 20:46 | kovasb | but the state in the browser will be wiped out |
| 20:46 | gfredericks | so refresh the page and reconnect? |
| 20:46 | wingy | could someone confirm |
| 20:46 | kovasb | the connect should happen automatically |
| 20:46 | kovasb | wingy: yes |
| 20:47 | wingy | kovasb: yay |
| 20:47 | gfredericks | kovasb: mine is manual |
| 20:47 | kovasb | often i just move to the namespace at the repl and paste the new code in |
| 20:47 | kovasb | hmm |
| 20:47 | gfredericks | which is how I set it up |
| 20:47 | gfredericks | just to aggravate myself apparently |
| 20:48 | kovasb | cool YMMV but it works "most" of the time for me |
| 21:08 | wingy | why do i have to quite 1: (def a ^{:created (System/currentTimeMillis)} 1) |
| 21:08 | wingy | that wont work, this do: (def a ^{:created (System/currentTimeMillis)} '1) |
| 21:08 | wingy | i dont get why |
| 21:09 | wingy | since (def a 1) without quoting works |
| 21:10 | gfredericks | oh you can't put metadata on numbers |
| 21:10 | gfredericks | it works the second way but not really |
| 21:10 | gfredericks | it just doesn't crash |
| 21:11 | gfredericks | when you add the quote you're essentially writing (quote 1) |
| 21:11 | Iceland_jack | gfredericks: Doesn't it apply the metadata to the quote? |
| 21:11 | Iceland_jack | Right |
| 21:11 | gfredericks | so the metadata gets added to that list |
| 21:11 | gfredericks | which gets lost at compile time |
| 21:11 | gfredericks | so there's no effect |
| 21:11 | gfredericks | you can put the metadata on the var though |
| 21:12 | arohner_ | wingy: metadata can only be added to clojure objects (vars, symbols, datastructures) |
| 21:12 | wingy | i thought that was what i did |
| 21:12 | arohner_ | java ints and strings are final, so clojure can't extend them |
| 21:12 | gfredericks | wingy: move it to before the a |
| 21:12 | wingy | this works: (def a ^{:created (System/currentTimeMillis)} |
| 21:12 | wingy | [1 2 3]) |
| 21:12 | wingy | ah .. i think i get it |
| 21:12 | gfredericks | wingy: yeah vectors can have metadata |
| 21:13 | wingy | right |
| 21:13 | gfredericks | ,(with-meta {:foo 2} #{1 2 3}) |
| 21:13 | clojurebot | #<ClassCastException java.lang.ClassCastException: clojure.lang.PersistentHashSet cannot be cast to clojure.lang.IPersistentMap> |
| 21:13 | gfredericks | ,(with-meta #{1 2 3} {:foo 2}) |
| 21:13 | clojurebot | #{1 2 3} |
| 21:16 | wingy | is ^ a sugar syntax for with-meta? |
| 21:16 | gfredericks | not quite |
| 21:16 | gfredericks | ^ is read-time metadata attached to the code itself |
| 21:16 | gfredericks | whereas with-meta is a runtime function call |
| 21:17 | wingy | but in the end the meta data that is created is no different? |
| 21:17 | wingy | just different ways to create it? |
| 21:18 | gfredericks | well you have to be careful with the difference. In a lot of cases read-time metadata only has any effect if a macro or an element of the compiler is expecting it |
| 21:18 | gfredericks | if not it may not make it through to runtime |
| 21:19 | gfredericks | I could say (if foo ^{:haha true} bar baz) in my code |
| 21:19 | gfredericks | and the metadata would be meaningless |
| 21:19 | wingy | i see |
| 21:20 | gfredericks | because the compiler isn't expecting metadata there |
| 21:21 | gfredericks | ,(meta (with-meta {} {:my :meta})) |
| 21:21 | clojurebot | {:my :meta} |
| 21:21 | gfredericks | ,(let [x {}] (meta ^{:my :Meta} x)) |
| 21:21 | clojurebot | nil |
| 21:22 | gfredericks | ^ that's the difference I'm talking about |
| 21:22 | gfredericks | ,(meta ^{:my :Meta} {}) |
| 21:22 | clojurebot | {:my :Meta} |
| 21:22 | gfredericks | ^ however that also |
| 21:25 | wingy | didnt know the last one worked |
| 21:25 | gfredericks | it's because the map {} compiles to itself |
| 21:25 | gfredericks | so it carries the metadata with it to runtime |
| 21:25 | wingy | so ^ isnt counted as a arg |
| 21:25 | gfredericks | correct |
| 21:26 | gfredericks | the reader immediately places the metadata on the map it creates |
| 21:26 | gfredericks | the compiler sees a list of two elements |
| 21:26 | gfredericks | a symbol meta and an empty map |
| 21:26 | gfredericks | it resolves the symbol meta to clojure.core/meta, and compiles to code that will call that var with the map as its argument |
| 21:26 | wingy | i see |
| 21:27 | gfredericks | it's the same map that the reader attached the metadata to, so it's still there |
| 21:27 | gfredericks | but in the middle case the reader attached the metadata to the symbol x |
| 21:27 | wingy | good thing to do is to know how clojure works exactly under the hood |
| 21:27 | gfredericks | which is not what the clojure.core/meta function is receiving as its argument |
| 21:27 | wingy | right |
| 21:28 | gfredericks | it took me a while to get the readtime/runtime distinction |
| 21:28 | wingy | i understood parse time and run time pretty quick in js .. have to get the clojure internals more in details |
| 21:29 | gfredericks | macros are a lot easier once you understand read vs compile vs run |
| 21:29 | wingy | run is eval? |
| 21:29 | gfredericks | no I just meant runtime |
| 21:30 | wingy | ok so 3 phases |
| 21:30 | gfredericks | yeah, at least abstractly |
| 21:30 | gfredericks | I'm not actually familiar with the internals too muchu |
| 21:31 | wingy | read time: source code to code structure, compile time: code structure to byte code, run time: run byte code |
| 21:31 | wingy | is that correct? |
| 21:31 | gfredericks | yep |
| 21:31 | gfredericks | macros run at compile time |
| 21:32 | wingy | yeah they manipulate the data structure at compile time |
| 21:32 | gfredericks | exactly |
| 21:34 | wingy | so the reader is for the first part, the compiler for the next .. is there a "runner" or is the compiler running it once it has the byte code? |
| 21:34 | gfredericks | I think that's just the jvm running it |
| 21:34 | wingy | ok |
| 21:35 | wingy | someone here said that parse-string is the reader |
| 21:35 | gfredericks | read-string? |
| 21:35 | clojurebot | read-string |is| as unsafe as eval unless *read-eval* is bound to false. |
| 21:35 | wingy | yeah |
| 21:35 | gfredericks | yeah that's basically it |
| 21:35 | wingy | and if you pass the returned data structure to eval it will be compiled and run |
| 21:35 | gfredericks | yep |
| 21:36 | gfredericks | read-string is good for figuring out what the reader macros do |
| 21:36 | wingy | so one can say from a higher perspective that eval is compiler/runner ? |
| 21:36 | gfredericks | I think it wraps the expr in a function, compiles that, and calls the function |
| 21:36 | gfredericks | so sorta |
| 21:36 | wingy | ok |
| 21:37 | mindbender | how do I install a plugin in lein2? |
| 21:40 | wingy | gfredericks: for how long have you been using cljure? |
| 21:40 | gfredericks | three or four years or something |
| 21:40 | wingy | wow |
| 21:40 | wingy | you must be very productive in it |
| 21:41 | gfredericks | it just makes me grumpy about other languages |
| 21:41 | wingy | yeah |
| 21:41 | wingy | it already has that affect on me |
| 22:45 | wingy | isnt there a good way to browse https://clojars.org/ |
| 22:54 | mindbender | does the :extra-classpath-dirs option still work with lein2 cos I just got an error when trying to swank into a project that uses that option to specify the file the jvm was complaining of not finding? |
| 22:55 | mindbender | technomancy: ^^ |
| 22:55 | technomancy | mindbender: it was removed in 2.x; try :resource-paths |
| 23:18 | frozenlo` | I'm using org-mode to write a text. In it I link to some images (with [[./folder/img.jpg]]). I want to use the exported as an input for Noir. So I do this `(slurp "my-html.html") and it works perfectly... except for the images. The "." appears in the images path, messing evertyhing up. Any workaround? |
| 23:30 | mindbender | technomancy: :resouce-paths got me up to having swank server started. I'm using :plugin [lein-swank "1.4.0"] then I get similar issue to https://github.com/technomancy/swank-clojure/issues/92. I on cygwin emacs 23.4.1 |
| 23:32 | technomancy | hm; I don't know what causes that |
| 23:32 | mindbender | even slime-connect says connected but doesn't create slime-repl buffer |
| 23:35 | mindbender | could it be a plugin conflict? |
| 23:35 | technomancy | unlikely; it's probably on the elisp side |
| 23:38 | frozenlo` | Solved my problem. If anyone is interested, here is a little function to export org document to an html usable by Noir. https://gist.github.com/3026701 |
| 23:54 | michaelr525 | good morning |
| 23:58 | wingy | good morning |