2012-12-07
| 00:04 | lynaghk | amalloy: no luck. Here's what I'm trying: https://www.refheap.com/paste/7370 |
| 00:05 | Raynes | Yay, Kevin uses refheaps. |
| 00:05 | lynaghk | each invocation takes the same amount of time (7 seconds...) |
| 00:05 | lynaghk | Raynes: trying to get my money's worth =P |
| 00:05 | Raynes | And he even takes the time to set the syntax highlighting to the actual language instead of leaving it at 'Clojure' |
| 00:05 | amalloy | well at the very least you need to export those vars to the drip process |
| 00:06 | amalloy | it can't see those at all, right now |
| 00:06 | Raynes | lynaghk: Man, you don't know how helpful that was. |
| 00:06 | lynaghk | amalloy: prefixing with export? No change. |
| 00:06 | amalloy | after that i think you have to look up the arcane format of the INIT variables |
| 00:07 | amalloy | ISTR they're a bit weird |
| 00:07 | Raynes | I've been getting back into refheap. Going to be working on some new features soon. Important ones are paste history, markdown rendering, and a mechanism for displaying multiple pastes on one page (analogous to github's mutli-file pastes). |
| 00:07 | amalloy | but tbh i haven't looked deeply into it; you might want to just email ninjudd, who probably remembers it all |
| 00:07 | Raynes | I'll give you your money's worth. Just slowly. |
| 00:07 | Raynes | ;) |
| 00:08 | Raynes | And you will definitely want to *email* him, because you will never elicit a response on IRC. |
| 00:08 | lynaghk | amalloy: okay, I might try that. I'm still a bit confused as to why those things are necessary. In the wiki for, e.g., JRuby, it shows drip making: drip -cp jruby.jar org.jruby.Main -e 'puts 8 * 8' super fast |
| 00:09 | lynaghk | and I would have that that AOT compiling my class and calling in the exact same way would make it, fast as well. |
| 00:10 | lynaghk | amalloy, Raynes: I'll open up an issue on the github project. thanks for the help. |
| 00:10 | amalloy | clojure probably does a runtime require anyway if the sources are available, even if the class is AOTed |
| 00:11 | amalloy | lynaghk: note that INIT_ARGS is newline-separated list of args |
| 00:12 | amalloy | so it's supposed to be something like "-e\n(require\n'ccplot.samples.markdown-env)", except i don't know the right way to get newlines into a bash string |
| 00:12 | lynaghk | amalloy: I would think "-e '(+ 1 2)'" is one arg, not tow |
| 00:13 | amalloy | it's definitely two |
| 00:13 | amalloy | try passing that, with quotes, to a normal java -jar invocation |
| 00:14 | amalloy | (it won't work, because -e has to be a separate arg from the thing to eval) |
| 00:15 | lynaghk | amalloy: ah, that seemed to have made a difference |
| 00:16 | lynaghk | though it looks like I am outpacing drip's ability to spin up new JVMs---I assumed it was doing some kind of forking from a pristene copy, but that doesn't seem to be the case |
| 00:17 | amalloy | no |
| 00:17 | amalloy | if you know how to do that, i'm sure ninjudd would love a pull request :P |
| 00:17 | lynaghk | heh |
| 00:18 | amalloy | but i think you lose the ability to fork(2) once you're inside the jvm |
| 00:18 | lynaghk | yeah, that's what stackoverflow is telling me. |
| 00:19 | lynaghk | damn, I guess I'll just have to throw a copy of Compojure into this library and have that provide fast access |
| 00:22 | bbloom | so what's the correct way to go about making tagged literals now? |
| 00:22 | bbloom | i need to use `lein trampoline repl` right? |
| 00:22 | lynaghk | bbloom: how do you mean? |
| 00:24 | bbloom | lynaghk: whats the right way to add my own #bbloom [1 2 3] |
| 00:24 | Raynes | I don't think we have the technology to serialize human consciousness yet, bbloom. |
| 00:25 | lynaghk | bbloom: I register records with print-method to spit out tagged literal strings. |
| 00:25 | bbloom | Raynes: i was attempting to avoid further abuse of #foo :-) |
| 00:25 | lynaghk | bbloom: https://github.com/keminglabs/c2po-clojure/blob/master/src/clj/c2po/literals.clj |
| 00:27 | bbloom | lynaghk: not sure what i'm looking at |
| 00:27 | bbloom | i know i can just set! *data-readers* but is there a proper api for that? |
| 00:27 | lynaghk | when you say making tagged literals, do you mean writing or reading from strings? |
| 00:27 | bbloom | i want to define a new tagged literal to be read in my own source files |
| 00:28 | lynaghk | bbloom: ah, I see. so you're typing it in and need it to be read |
| 00:28 | lynaghk | yeah, set *data-readers* |
| 00:28 | lynaghk | or you can add to a magic file |
| 00:28 | lynaghk | data_readers.clj, I believe. |
| 00:29 | bbloom | i saw mention of that, but can't find any real documentation |
| 00:32 | ChrisP | Hi everyone, wondering if there was a quick answer to this -- is there a framework that gives Websocket / SSE with long-polling fallback? Similar to Atmosphere, but lighter and... clojure-y? |
| 00:32 | bbloom | oh dur lynaghk it's documented on *data-readers* |
| 00:32 | bbloom | i feel dumb for missing that |
| 00:33 | lynaghk | bbloom: nah, it took me forever to figure out the *data-readers* stuff. Clojure is not the hottest w.r.t documentation |
| 00:33 | lynaghk | (I am part of the problem here, of course. Learning how to use Sphinx now...) |
| 00:34 | cemerick | bbloom, lynaghk: this is the clearest official statement on them AFAIK: https://github.com/clojure/clojure/blob/master/changes.md#21-reader-literals |
| 00:35 | bbloom | cemerick: thanks |
| 00:35 | bbloom | tpope: how are you determining what an expression is? ie for cpp. searching for enclosing parens? delegating to VimClojure? |
| 00:45 | bbloom | k i seem to have it all working |
| 00:46 | bbloom | feels kinda weird that namespace-free tags are reserved |
| 00:46 | bbloom | but i guess if they weren't then tagged literals would need complete integration with require, refer, use, etc |
| 00:46 | bbloom | :-/ namespaces are hard. |
| 00:46 | bbloom | but oh so damn useful |
| 00:46 | Apage43 | bbloom: pretty sure it sends what you would select if you type %v% |
| 00:47 | bbloom | Apage43: ah, that makes sense |
| 00:47 | Apage43 | er, or not |
| 00:47 | bbloom | although, sadly, it's not sufficient for tagged literals, which i just accidentally discovered |
| 00:47 | bbloom | #foo 1 |
| 00:47 | bbloom | gotta visual-select :Eval for that |
| 00:48 | Apage43 | bbloom: or cp<motion> |
| 00:48 | Apage43 | cp$ for (from here to end of line) |
| 00:48 | bbloom | ah yes, you're right |
| 00:48 | bbloom | actually, i think my fingers knew that |
| 00:49 | bbloom | i certainly didn't, but i'm almost certain i did that several times already :-) |
| 00:50 | sshack | Okay, clojure tools for database schema migration ? What's available in Clojure? |
| 00:50 | Apage43 | bbloom: mmhm, I kind of instinctively figured up cpap for doing whole defns (as long as I don't have line breaks inside the defn, of course) |
| 00:50 | cemerick | danger, will robinson! |
| 00:50 | cemerick | sshack: here be dragons, re: schema migration |
| 00:50 | sshack | Okay, enlighten me. |
| 00:51 | bbloom | mmm schema migrations, the cause of and solution to all of your database problems |
| 00:51 | sshack | bbloom: I thought that was php and mysql "coders"? |
| 00:51 | cemerick | it's a nightmare in general, and in clojure-land |
| 00:51 | bbloom | sshack: heh, are you on postgres? |
| 00:52 | sshack | I am. |
| 00:52 | sshack | II've been button by mysql data bugs before. |
| 00:52 | sshack | s/button/bitten/ |
| 00:52 | bbloom | sshack: hurray transactional DLL! |
| 00:53 | sshack | bbloom: No. This was back in the late 90's when mysql would just eat your data for no reason. |
| 00:53 | bbloom | I'll let cemerick comment on clojure-related database stuff, since all my SQL database experience is prior to clojure |
| 00:53 | bbloom | my hurray was for postgres |
| 00:53 | sshack | cemerick: Enlighten me on the clojure way of databases. |
| 00:53 | sshack | bbloom: ahh, yes. I agree. |
| 00:54 | sshack | I got bitten by that bug tou recently. But it was in the process of exporting from mysql to postgres. |
| 00:55 | cemerick | sshack: don't ask me, really. I try to stay away from real RDBMS stuff. |
| 00:55 | cemerick | I abuse postgres as a kv store sometimes, but that's the extent of it. |
| 00:56 | cemerick | sshack: technomancy was deep into schema migration bits for a while, I think. |
| 00:56 | bbloom | heh |
| 00:56 | sshack | Okay, We have very different viewpoints then. |
| 00:56 | bbloom | sshack: my schema migration strategy of choice has always been a custom bag of bash and ruby |
| 00:56 | bbloom | sshack: i never found a schema migration package i liked. especially not activerecord |
| 00:56 | sshack | I'm trying to bring my platform for this project down to two languages. |
| 00:56 | bbloom | but then again, i'm a well known ORM hater :-P |
| 00:56 | sshack | Mathematica, and Clojure. |
| 00:56 | bbloom | heh |
| 00:57 | cemerick | When I *did* use a database, it was with sqlalchemy. Magic and terror. |
| 00:57 | cemerick | Loooong time ago. Sorta. |
| 00:58 | cemerick | sshack: there are clojure libs for this, I just don't know of them |
| 00:58 | cemerick | oh, right, this is one: http://budu.github.com/lobos/ |
| 00:59 | cemerick | There was one other that was jousting for the privilege of being hated for all time by all Clojure database programmers. |
| 00:59 | amalloy | sqleton? |
| 00:59 | sshack | So clojure programmers are a very easy going, accepting bunch, right? |
| 01:00 | cemerick | heh, quite |
| 01:00 | cemerick | sshack: do you have a grand confession to make or something? ;-) |
| 01:02 | sshack | I'm a secret lover of visual basic. |
| 01:02 | bbloom | sshack: you say you only want to use mathematica and clojure, but you kinda have no choice but to use pgsql… why not just write pgsql ? |
| 01:02 | cemerick | hah, nice! |
| 01:02 | bbloom | hence my vote for cat scripts.... |
| 01:03 | bbloom | cat <<EOF |
| 01:03 | bbloom | ….pg sql here ... |
| 01:03 | bbloom | EOF |
| 01:03 | sshack | bbloom: I like tools to automate parts of my lifting for me. |
| 01:03 | bbloom | slap that in migrate.sh |
| 01:03 | cemerick | you *could* use plv8 + ClojureScript :-P |
| 01:03 | bbloom | ./migrate.sh | psql ... |
| 01:03 | sshack | actually, experience has taught me it is a requirement. |
| 01:03 | bbloom | poof works like magic |
| 01:03 | cemerick | sshack: the first code I sold was written in RealBasic, targeting windows :-D |
| 01:04 | sshack | cemerick: Nice. Pascal, technically. But first real work was c++ on iris/sco and linux (all at once) |
| 01:04 | sshack | s/iris/irix/ |
| 01:04 | bbloom | we did several migrations a week and all the automation in rails annoyed the hell out of me. i replaced it all with a handful of lines of bash and everythign was more pleasant |
| 01:04 | bbloom | and faster too |
| 01:05 | sshack | bbloom: Fair enough. Different folks, different strokes. |
| 01:05 | bbloom | sshack: it was still automated |
| 01:05 | bbloom | it was just *simpler* |
| 01:05 | sshack | I understand. |
| 01:05 | bbloom | hit the db once with select max(version) from migrations |
| 01:06 | bbloom | then do a find -newer … ./migrations |
| 01:06 | bbloom | or whatever |
| 01:06 | bbloom | then a for loop cat into a single psql call |
| 01:06 | bbloom | and poof, fully automated migrations |
| 01:06 | bbloom | be sure to set -x on your deploy scripts and everything is magic |
| 01:07 | sshack | bbloom: So you're suggesting I write my own migration tool. |
| 01:07 | bbloom | sshack: i'm suggesting migrations are much simpler than needing a tool :-) |
| 01:07 | bbloom | also, i'm saying right tool for the job |
| 01:07 | bbloom | i wouldn't use a big clojure library where a simple cat script would get the job done |
| 01:08 | muhoo | what's the current status of cljs in nrepl.el? |
| 01:10 | sshack | bbloom: We'll agree to disagree here. I've stepped on a few land mines before where something a bit more sophisticated than a cat script would have helped out. |
| 01:11 | bbloom | *shrug* i also prefer Makefiles over Puppet and Chef, so I understand my tastes aren't for everyone |
| 01:11 | sshack | Particularly with altering data in columns. |
| 01:11 | sshack | Have you tried scons by any chance? |
| 01:12 | bbloom | no |
| 01:12 | sshack | I switched from makefiles to scons about a decade ago. Can't stand brittle makefiles now. |
| 01:13 | sshack | It's a build system based on python code. Very nice. |
| 01:13 | bbloom | *shrug* |
| 01:20 | derrida | Do I want to be using nrepl or REPL-y as my repl in emacs? |
| 01:20 | Raynes | bbloom: Agreeing to disagree is the best thing to do when you're obviously wrong. |
| 01:20 | brehaut | nprepl is a protocol |
| 01:20 | brehaut | reply is an nrepl client |
| 01:20 | derrida | hm |
| 01:20 | brehaut | reply is also the default repl for the 'lein repl' command |
| 01:21 | bbloom | Raynes: which thing am i wrong about? it's not obvious to me? :-) |
| 01:21 | Raynes | bbloom: That was a joke, sir. |
| 01:21 | derrida | for some reason my setup keeps getting confused and it knows about two different looking repls, one is REPL-y and the other is what I was calling "nrepl" |
| 01:21 | bbloom | heh, ok then |
| 01:21 | muhoo | derrida: are you using nrepl.el? |
| 01:22 | derrida | If I C-c C-z from a clj file before manually entering nrepl-interaction-mode in the file, it connects to REPL-y. If I nrepl-jack-in from the file buffer, it will create a more sparse repl that just says: "; nREPL 0.1.6-preview" |
| 01:23 | derrida | muhoo: yes, and clojure-mode |
| 01:23 | brehaut | bbloom, schema migrations arent the cause of all your database problems, only a large chunk :P |
| 01:23 | brehaut | bbloom: you have to give the query optimizer some credit too |
| 01:23 | derrida | I had to strip the swank stuff out of clojure-mode to stop it from borking my slime-repl though :( |
| 01:23 | bbloom | brehaut: was a homer simpson beer reference :-) |
| 01:23 | brehaut | oh true. lol |
| 01:23 | bbloom | haha but yeah brehaut you're right, that damn query optimizer |
| 01:25 | muhoo | derrida: oh, you've got slime/swank going too for another lisp? i've never tried to get those to coexist. hmm. |
| 01:25 | derrida | bbloom: I think there is something to be said for the ubiquity of Makefiles. I had to deal with a project that was using premake last week and it really hammered in for me why I will never use an obscure build system. |
| 01:26 | bbloom | derrida: the main problem with makefiles is that people try to use them to do anything other than shell out to other things based on file time stamps |
| 01:26 | bbloom | people try to figure out crazy complex fancy features |
| 01:26 | derrida | muhoo: yeah, I'm a CL person that's exploring/learning clojure. they seem to coexist a heck of a lot better than they did a year ago now that nrepl is around. |
| 01:26 | bbloom | and in reality, the simplest thing to do is to run a shell script which outputs makefile gunk, and then causes re-evaluation to occur in gnu or bsd make |
| 01:26 | bbloom | my make files generally have zero logic in them |
| 01:27 | bbloom | and are like 10 or 20 lines |
| 01:27 | bbloom | and then i have a bunch of shell scripts that do any interesting work |
| 01:27 | derrida | yeah, I agree, I've seen very clean makefiles that prove it. |
| 01:27 | bbloom | so pleasant to work with |
| 01:28 | bbloom | redis, for example |
| 01:28 | muhoo | derrida: great, welcome! nrepl is the current recommended way to do emacs interation with clojure IIRC |
| 01:28 | Apage43 | psh, makefiles |
| 01:28 | bbloom | antirez needs to teach a course :-) |
| 01:28 | Apage43 | just write your app as a single .c file; make <name> will run $CC main.c -o main |
| 01:29 | derrida | muhoo: so, the "correct" repl that should appear is the 0.1.6 nrepl preview? not the REPL-y one? |
| 01:29 | muhoo | derrida: nrepl.el basically just talks to a running clojure process using the nrepl protocol. nrepl is editor-or-client-independent. |
| 01:30 | muhoo | derrida: i have a slightly different workflow than most people, but just doing jack-in is supposed to Just Work (TM) |
| 01:30 | muhoo | nrepl-jack-in |
| 01:30 | muhoo | not clojure-jack-in |
| 01:30 | derrida | yeah, that's what I'm using |
| 01:30 | derrida | didn't Just Work for me though :D |
| 01:31 | seangrove | Is there a way to specify the 'g' flag in cljs using the regex literal syntax? |
| 01:31 | derrida | I'm having to manually put buffers in nrepl-interaction-mode after jacking in |
| 01:31 | derrida | which I can probably fix by adding a hook, but I'm guessing something is up since I have to do that? |
| 01:32 | muhoo | derrida: yeah, sounds like something in clojure-mode |
| 01:32 | muhoo | the hook is supposed to make nrepl-minor-mode for all clojure-mode files |
| 01:32 | derrida | maybe the clojure-mode in melpa is too old or something, I'll try cloning from git |
| 01:32 | derrida | *github |
| 01:32 | muhoo | derrida: i'm using elpa, and it works |
| 01:33 | muhoo | emacs 24 |
| 01:33 | muhoo | clojure-mode 1.11.5, nrepl 0.1.5 |
| 01:33 | derrida | hmm, older nrepl than me |
| 01:34 | muhoo | yeah, i have made a few additions to it. was lazily wondering if cljs support is improved, i should just go rtfc on github |
| 01:34 | derrida | ah, yeah, looks like there's a new update from yesterday |
| 01:36 | muhoo | it may not be a bad idea to start up a fresh emacs too, without any cl/swank/slime stuff running, and try nrepl-jack-in from there |
| 01:38 | derrida | I actually did try that, behaves the same way. |
| 01:39 | derrida | muhoo: is it normal for nrepl to give you a buffer that's in the user> ns? (or should it be putting me in the ns of the project being loaded) |
| 01:41 | muhoo | yes |
| 01:41 | muhoo | i always get user> |
| 01:42 | muhoo | then i have some stupid macros i wrote to do what i want from there |
| 01:42 | muhoo | and by stupid, i mean elisp code, because i haven't figured out how to write nrepl middleware yet |
| 01:42 | muhoo | https://www.refheap.com/paste/7372 |
| 01:45 | muhoo | i usually do (require 'my.project.foo :reload-all) and then (in-ns 'my.project.foo) |
| 01:45 | muhoo | and then i hit that hotkey again to run my elisp. it's, um, ridiculous, but it works. |
| 01:48 | muhoo | heh, i love that there's a branch in nrepl.el git called "blowing-chunks" |
| 01:54 | seangrove | ,(map identity {:a 10 :b 12}) |
| 01:54 | clojurebot | ([:a 10] [:b 12]) |
| 01:54 | seangrove | uhg |
| 01:54 | seangrove | In cljs I think that comes out as 12 |
| 01:54 | seangrove | But glad I'm not totally insane anyway |
| 01:58 | seangrove | Need to get a clojurebot hooked up to cljs in a browser env in here |
| 01:58 | seangrove | ~cljs |
| 01:58 | clojurebot | Titim gan éirí ort. |
| 02:02 | Apage43 | seangrove: http://himera.herokuapp.com/index.html ? |
| 02:02 | Apage43 | shows the same as clojurebot in here when I punch that in |
| 02:02 | amalloy | Apage43: if it came out as 12 i'm pretty sure all of cljs would explode on itself |
| 02:02 | seangrove | Yeah, I think that's rhino |
| 02:03 | seangrove | Haha |
| 02:03 | seangrove | Alright, well, I've just done something wron here then |
| 02:03 | Apage43 | seangrove: it executs in the browser |
| 02:03 | Apage43 | Try (js/alert "BLAH") |
| 02:03 | Apage43 | *executes |
| 02:04 | seangrove | hrm, wow |
| 02:04 | seangrove | It's working properly now, same repl, same line |
| 02:04 | seangrove | I'll attribute it to user error |
| 02:36 | llasram | seangrove: Hey, did you get your "M-up" -> "A" issue sorted out? |
| 02:36 | seangrove | llasram: Yes, appreciate you tip, ended up googling around for that and figuring it out |
| 02:37 | llasram | Oh, ok, cool. You'd logged off, but I figured out I'd actually ended up just teaching Emacs the new keys. How did you end up fixing it? |
| 02:38 | llasram | s,new keys,new key mappings, |
| 02:38 | seangrove | I'm using iTerm2, ended up configuring the profile to use the keys properly |
| 02:38 | llasram | Oh ok, cool |
| 02:38 | seangrove | It's a better solution over, since I think emacs isn't getting someother keys I'd like it to, and now I have a better idea why |
| 02:38 | llasram | (A phrase I apparently say a lot when I wake up at 2am) |
| 02:38 | llasram | Oh, I agree |
| 02:39 | seangrove | Heh, I'm about to pass out if I can just get this cljs-form validation bit working |
| 02:39 | seangrove | Very close now... |
| 02:41 | llasram | Well best of luck |
| 02:41 | Tolstoy | Has anyone used clojure.java.jmx? I've set up a bean, and a thread to adjust the value once in a while, but console doesn't graph it. |
| 02:42 | Tolstoy | Er, mbean, and jconsole. |
| 02:49 | borkdude | goat moaning everyone |
| 02:52 | llasram | heh |
| 02:56 | andrewmcveigh | morning. |
| 02:56 | p_l | borkdude: and yak shaving to you |
| 03:08 | borkdude | is there a kind of "powered by Clojure" logo you can use on your website when it is mainly written in Clojure? |
| 03:16 | Tolstoy | Hm. Creating a proxy / interface to use as an MXBean seems to allow jconsole to graph changes in attribute values. The dynamicMbean prevents that for some reason. |
| 05:17 | jml | is there a web page w/ release notes for clojure? (something analogous to http://docs.python.org/3/whatsnew/index.html, say) |
| 05:18 | llasram | jml: https://github.com/clojure/clojure/blob/master/changes.md |
| 05:18 | jml | llasram: thanks. |
| 05:25 | muhoo | this feels... wrong https://www.refheap.com/paste/7379 |
| 05:26 | muhoo | ah, maybe another situation where for is the right answer |
| 05:27 | llasram | What feels wrong about it? |
| 05:41 | hyPiRion | I'd probably do it like this |
| 05:42 | hyPiRion | https://www.refheap.com/paste/7381 |
| 05:42 | hyPiRion | But it seems pretty much right for me |
| 05:44 | ro_st | is it possible to destructure both a seq of args and a map of optional params from the same fn args? |
| 05:48 | Mr_Bond | ro_st: should be fine if you use the sequence-functions ? |
| 05:49 | muhoo | hyPiRion: that improves it a lot. i think it's the anonymous inside map that makes me think i should bust out for. |
| 05:49 | Mr_Bond | ro_st: the zipmap function maybe? |
| 05:58 | ro_st | i've realised it's not going to solve my problem |
| 05:58 | ro_st | thanks for responding, even so :-) |
| 06:18 | borkdude | so, what's the coolest static site generator in clojure nowadays? |
| 06:23 | ro_st | clojure has those? |
| 06:23 | vijaykiran | there's misaki |
| 06:24 | vijaykiran | https://github.com/liquidz/misaki |
| 06:24 | borkdude | I added a footer to my little app: http://twitter.michielborkent.nl/ |
| 06:24 | borkdude | vijaykiran ah that's the one I searched for |
| 06:25 | vijaykiran | Btw, http://amsclj.nl/ is built using that |
| 06:25 | ivaraasen | borkdude: getting an error on the redirect after authing with Twitter |
| 06:25 | ivaraasen | redirected to localhost:8080 |
| 06:26 | vijaykiran | interesting clojure-toolbox.com doesn't have static-site-gen section. Someone should fix that :) |
| 06:26 | borkdude | ivaraasen hmm, shit. will have to change my apache config then |
| 06:26 | borkdude | ivaraasen tnx for noticing |
| 06:27 | borkdude | ivaraasen try again |
| 06:28 | ivaraasen | borkdude: works now, awesome |
| 06:29 | ivaraasen | only thing you'll need to implement next is a selection list to unfollow en masse. |
| 06:30 | borkdude | ivaraasen yes, well, that's a bit rigorous, I would never use that ;) |
| 06:37 | ivaraasen | borkdude: select all -> defollow, and deselecting important people. I would use it, at least |
| 06:37 | ivaraasen | dunno if the Twitter API would allow it tho |
| 06:37 | borkdude | ivaraasen it allows it, I'd have to create a new app key for it though |
| 06:46 | borkdude | ivaraasen this was more a proof of concept for me, such sites already exist btw |
| 06:53 | tgoossens | i never quite understand how you dynamically typed languages in general can lead to robust code. don't you just have to do the type checks yourself.. reinventing overloading etc? |
| 06:58 | tgoossens | its a design decision in clojure i don't understand why it was done that way |
| 06:59 | tgoossens | maybe just because being a lisp? |
| 07:00 | borkdude | tgoossens more freedom |
| 07:01 | tgoossens | but that freedom comes at a cost |
| 07:01 | borkdude | tgoossens yes, but type systems have costs too |
| 07:01 | borkdude | tgoossens it's an ancient old discussion |
| 07:02 | tgoossens | i'm just getting into it. clojure is my first experience with dynamically typed language |
| 07:02 | kmicu | tgoossens https://s3.amazonaws.com/github/downloads/frenchy64/papers/paper.pdf |
| 07:02 | borkdude | tgoossens it's strongly typed though, which is better than weakly typed imho |
| 07:03 | kmicu | A Practical Optional Type. System for Clojure. Ambrose Bonnaire-Sergeant. |
| 07:03 | tgoossens | borkdude: access denied link ? |
| 07:04 | borkdude | kmicu do you have experience with typed clojure? |
| 07:05 | kmicu | only read paper |
| 07:06 | borkdude | tgoossens there are other functional langs that have advanced type systems though (Haskell) |
| 07:06 | borkdude | tgoossens so you could just choose what suits you |
| 07:08 | borkdude | so, debian seems like a good choice for a vps… going for it then |
| 07:12 | tkoskine | Coming from Ada (with all this very strongly typed goodness), I still haven't got used to Clojure's system and I use a lot of assertions and pre/post-conditions, but it is nice to see how little effort you need to see to get even some more complex algorithm done in Clojure (good for prototyping, for example). |
| 07:13 | borkdude | solid set of unit tests help of course |
| 07:14 | borkdude | but again, it's a discussion that's probably never going to end |
| 07:14 | tkoskine | Yep. |
| 07:15 | borkdude | having an optional type system (typing by demand) would be really cool, so typed clojure could maybe fulfill that role |
| 07:15 | borkdude | haven't worked with it yet though |
| 07:20 | kmicu | tgoossens: you can check also http://blog.fogus.me/2010/05/25/trammel-contracts-programming-for-clojure/ |
| 07:22 | fredyr | just how much do you guys feel you get bitten by the dynamic typing though? |
| 07:23 | cshell | fredyr: do you mean how much do we have runtime casting exceptions? |
| 07:24 | kmicu | per hour |
| 07:24 | kmicu | ;] |
| 07:24 | kmicu | or per LOC |
| 07:24 | cshell | lol |
| 07:24 | fredyr | lol |
| 07:24 | fredyr | i wasn't really looking for a metric |
| 07:24 | fredyr | but if you think it's a big issue not having static typing |
| 07:25 | cshell | when I was really new I had a couple problems, but that was cause I was still thinking the java way |
| 07:25 | kmicu | it's not an issue, it's a choice/tradeoff and I take it fully! |
| 07:25 | tgoossens | fredyr: never made large software projects with a dynamic language so far. My only real experiency lies with java |
| 07:25 | cshell | hickey's talk on using abstractions really helped me, so now I usually return a map or a sequence and then everythign works well |
| 07:26 | tgoossens | i figured that |
| 07:26 | kmicu | tgoossens: why not scala then? |
| 07:26 | tgoossens | in clojure for example it doesn't really matter that much because you don't invent a new type for every new piece of data you want to represent |
| 07:26 | kmicu | if you love type system so much :) |
| 07:26 | fredyr | ohmy, what did i start now :) |
| 07:27 | tgoossens | kmicu: i don't love type system so much, its just, i have no significant experience with any dynamically typed language. |
| 07:27 | cshell | it's very different when you're used to all these different types (ie java) |
| 07:27 | tgoossens | and during my student job somebody gave me some initiation to clojure |
| 07:27 | tgoossens | and i kept playing with it |
| 07:28 | cshell | but if you learn to use one or two types/abstractions everywhere then there's a very low chance of type problems and much higher reuse |
| 07:28 | cshell | so I wonder if it's fair to say that strong typing can reduce reusability |
| 07:28 | tgoossens | it was my first experience with dynamically typed languages. |
| 07:28 | kmicu | it will be good |
| 07:28 | kmicu | but do not trust me :) |
| 07:28 | tgoossens | haha |
| 07:29 | tgoossens | cshell: i think it is more valid to say that using less types for representing data increases reusability |
| 07:30 | cshell | tgoossens: yes, that might be something you learn once you've used both |
| 07:30 | kmicu | tgoossens: http://www.infoq.com/presentations/Code-Testing |
| 07:30 | cshell | tgoossens: cause in java we could pass around maps everywhere |
| 07:32 | tgoossens | cshell: i've been experimenting with using maps in java instead of classes |
| 07:32 | tgoossens | also using ImmutableMap from guava |
| 07:33 | tgoossens | but to get it to work i had to invent some ways to |
| 07:33 | tgoossens | put any type in the map |
| 07:33 | kmicu | there is not reason to be upset because of the lack of typing system |
| 07:33 | tgoossens | and then get that value out with proper casting |
| 07:34 | tgoossens | currently i've done it with something like this: |
| 07:34 | tgoossens | Map<FieldName<T>,T> |
| 07:35 | tgoossens | but it is probably a good way |
| 07:35 | tgoossens | *not a good way |
| 07:35 | borkdude | technomancy what linux do you use, just wondering |
| 07:35 | kmicu | not idiotmatic for sure |
| 07:36 | tgoossens | no but its not because it is not idiomatic it is bad |
| 07:36 | kmicu | tgoossens: why not scala? :) |
| 07:36 | borkdude | or Haskell |
| 07:37 | kmicu | Haskell@JVM? |
| 07:37 | kmicu | ;] |
| 07:37 | tgoossens | never looked into it. Maybe i should. but first i'm going to continue experimentation with clojure :D |
| 07:37 | borkdude | kmicu Frege |
| 07:37 | borkdude | tgoossens knowing at least one lisp is good for common programming knowledge probably, and clojure is a very nice lisp |
| 07:38 | tgoossens | and haskell i'll be seeing in next year's course (also prolog) so for now i'm exploring other languages |
| 07:39 | borkdude | I think I read sometime in a common lisp book or essay: "Lisp is the language of love", I think that's true - it makes many programmers happy. =) |
| 07:40 | fredyr | :D |
| 07:40 | fredyr | i like that |
| 07:41 | kmicu | it makes me happy for sure ;] |
| 07:44 | borkdude | ah, this is it: "Lisp is the language of loveliness." http://www.dreamsongs.com/ArtOfLisp.html |
| 07:45 | borkdude | by Richard P. Gabriel (foreword of Succesful Lisp) |
| 07:45 | kmicu | borkdude: thx! |
| 07:46 | Mr_Bond | the guys at the office like the "Land of lisp" book |
| 07:47 | Mr_Bond | not read it my self |
| 08:10 | borkdude | lol: http://www.youtube.com/watch?feature=player_embedded&v=cZ34RDn34Ws |
| 08:39 | yedi | when building non-trivial webapps, do you think it's a pain in the ass to use multiple kinds of dbs (depending on what fits the job) or would you recommend just sticking to one? |
| 08:54 | clgv | Does anyone know whether I can use a FileOutputStream to write header data first and after that wrap it into a DeflaterOutputStream to compress the following data? I am encountering an exception complaining about a too short ZLIB header |
| 09:23 | clojure-newb | hey guys, how do I set response encoding to UTF-8 with ring-json 0.1.2 ? |
| 09:26 | clgv | does anyone have experience with apache commons-compress related to its performance? |
| 09:38 | tgoossens | Someone should start Google plus clojure community :D |
| 09:42 | tgoossens | Oh nvm |
| 09:53 | bsalty | @tgoossens it would be plus Google then wouldn't it? |
| 09:58 | hyPiRion | (inc Google) is more like it |
| 09:59 | cark | rather (partial + google) |
| 09:59 | bsalty | dammit i still need to read about partial |
| 10:00 | cark | it's easy : partial application |
| 10:00 | cark | ,((partial + 3) 5) |
| 10:00 | clojurebot | 8 |
| 10:08 | borkdude | eh, someone an idea what could be wrong? https://www.refheap.com/paste/7387 |
| 10:11 | borkdude | eh nm.. fixed |
| 10:11 | bsalty | @borkdude maybe this is a stupid answer but looks like ning is missing from class path? |
| 10:12 | borkdude | bsalty that's right, I included a dependency indirectly before, so when I removed one dependency only then I saw this error |
| 10:12 | bsalty | ah |
| 10:12 | bsalty | too much magic in inferred deps |
| 10:41 | gfredericks | is there any documentation about using a proxy with clojure.java.jdbc? |
| 11:09 | pepijndevos | How to find a good ASP dev. It seems to me the ecosystem doesn't culture good devs. |
| 11:12 | S11001001 | pepijndevos: find good non-ASP dev willing to learn it |
| 11:12 | rkz | pepijndevos: look for people doing ASP in F# |
| 11:14 | S11001001 | rkz: sounds right |
| 11:14 | pepijndevos | Oh yea, I heard good things about F#. F# is to C# what Scala is to Java, I imagine. |
| 11:14 | S11001001 | pepijndevos: yeah |
| 11:15 | S11001001 | the best devs I know won't be pigeonholed into "<some language/framework> dev", pepijndevos |
| 11:15 | pepijndevos | S11001001: Yea, my initial thought was, find a polyglot. |
| 11:22 | borkdude | F# is quite nice |
| 11:23 | tpope | bbloom: right now cpp is just mapped to cpab |
| 11:35 | DaReaper5 | I am still slightly confused with defn and how it returns values. How can I do an action/method call before returning an actual value? |
| 11:35 | Hodapp | DaReaper5: The same way you'd do it in any other expression. |
| 11:36 | Hodapp | or do you mean you need side effects or something? |
| 11:36 | tufflax | DaReaper5, I don't understand your question :p |
| 11:37 | DaReaper5 | (defn take-from-q [q key] (some-method)(.take q)) |
| 11:37 | DaReaper5 | i can do that |
| 11:37 | DaReaper5 | but what if i want to call some-method after the take |
| 11:37 | DaReaper5 | can i store it in a let and then return the let after |
| 11:38 | Hodapp | DaReaper5: why are you concerned with the order here? |
| 11:38 | tufflax | You can save the result of (.take q) with a let, and return it after (some-method) |
| 11:38 | DaReaper5 | how do i return the let value |
| 11:39 | DaReaper5 | hodapp i am concerned because .take is a blocking action and i need to change something after it unblocks |
| 11:39 | DaReaper5 | (defn take-from-q [q key] (let [r-value (.take q)](some-method)(r-value)) |
| 11:39 | DaReaper5 | ? |
| 11:39 | tufflax | You know that in both let and defn the last form is returned, right? So you can do (let [result (.take q)] (some-method) result) |
| 11:39 | DaReaper5 | ok just wihtout the brackets |
| 11:39 | DaReaper5 | ok thanks |
| 11:40 | DaReaper5 | thats what I was thinking but i couldn't find any examples along those lines |
| 11:40 | DaReaper5 | Thanks tufflax |
| 11:40 | tufflax | DaReaper5, parens almost always is a call, so (r-value) would try to call r-value as a function |
| 11:41 | DaReaper5 | ya |
| 11:41 | DaReaper5 | i keep forgetting that but i realized after i typed it. Force of habbit i guess |
| 11:41 | DaReaper5 | lol |
| 11:41 | tufflax | ;) |
| 12:09 | Kowboy | anyone here use the counterclockwise eclipse plugin? |
| 12:11 | joegallo | ~anybody |
| 12:11 | clojurebot | No entiendo |
| 12:11 | joegallo | ~anyone |
| 12:11 | 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 ..." |
| 12:12 | Hodapp | I used to use it, until I stopped because I found it to be awful. |
| 12:14 | cemerick | Kowboy: Yeah, I use it. |
| 12:14 | seangrove | Is there let-when or something similar? |
| 12:14 | cemerick | Hodapp: not an eclipse fan? :-P |
| 12:14 | Kowboy | when I try to create a new Leiningen project, it created the project directory and then seems to "hang" |
| 12:14 | apwalk | seangrove: when-let |
| 12:15 | seangrove | apwalk: Hah, thanks |
| 12:16 | Hodapp | cemerick: Eclipse is fine. Counterclockwise just did not work right. |
| 12:17 | cemerick | Kowboy: I see a delay of ~5s while it does an initial dependency resolution, but it doesn't hang. |
| 12:21 | jml | what's the point of the discard operator in edn? https://github.com/edn-format/edn |
| 12:28 | technomancy | borkdude: hey just saw your message |
| 12:28 | technomancy | I use Debian |
| 12:28 | technomancy | clojurebot: anybody is anyone |
| 12:28 | clojurebot | You don't have to tell me twice. |
| 12:28 | borkdude | technomancy ok tnx, I'm thinking about using it too |
| 12:28 | technomancy | it's pretty great |
| 12:28 | technomancy | especially when you add nix into the mix |
| 12:30 | borkdude | nix? |
| 12:30 | clojurebot | nix is a purely functional package manager exhibiting many similar characteristics to Clojure's persistent data structures or git commit trees: http://nixos.org/nix/ |
| 12:31 | borkdude | whaa |
| 12:31 | technomancy | nix is amazing |
| 12:33 | uvtc | anybody? |
| 12:33 | clojurebot | anybody is anyone |
| 12:34 | technomancy | dang it clojurebot |
| 12:34 | technomancy | how does the inference engine work again? |
| 12:34 | hiredman | that is how it works |
| 12:34 | hiredman | inference may or may not happen |
| 12:34 | hiredman | ~anybody |
| 12:35 | clojurebot | anybody is anyone |
| 12:35 | hiredman | ~anybody |
| 12:35 | clojurebot | anybody is anyone |
| 12:35 | hiredman | ~anybody |
| 12:35 | clojurebot | anybody is anyone |
| 12:35 | hiredman | ~anybody |
| 12:35 | 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 ..." |
| 12:35 | hiredman | ~botsnack |
| 12:35 | clojurebot | Thanks! Can I have chocolate next time |
| 12:35 | metellus | ~chocolate |
| 12:35 | clojurebot | No entiendo |
| 12:36 | hiredman | if you want to reinforce an inferred fact, you need to give a botsnack with in some amount of time of the inference |
| 12:37 | hiredman | ~anybody |
| 12:37 | clojurebot | anybody is anyone |
| 12:37 | hiredman | ~anybody |
| 12:37 | clojurebot | anybody is anyone |
| 12:37 | hiredman | bleh |
| 12:37 | technomancy | wait seriously? |
| 12:37 | DaReaper5 | if i define a "let" and then try to return it. Does that nto work because of the lifetime of the let? |
| 12:37 | hiredman | I was going to say "since I did that, it is now more likely to show up" |
| 12:37 | technomancy | botsnacks have an effect; that's sweet |
| 12:37 | thorwil | technomancy: heard of guix https://savannah.gnu.org/projects/guix/ |
| 12:37 | hiredman | ~anybody |
| 12:37 | clojurebot | anybody is anyone |
| 12:37 | hiredman | clojurebot: jerk |
| 12:37 | clojurebot | you cut me deep, man. |
| 12:37 | technomancy | thorwil: yeah... mixed feelings about it |
| 12:37 | technomancy | hiredman: does "jerk" have the opposite effect? |
| 12:38 | hiredman | technomancy: no |
| 12:38 | technomancy | thorwil: I think it's a really good thing that nix package definitions are 100% declarative, and doing them in scheme loses that property |
| 12:38 | technomancy | thorwil: I wish they had used racket instead of guile so they could define a subset of scheme instead of being limited to a superset |
| 12:38 | technomancy | but OTOH building your own language is crazy and tooling sucks, so maybe it's a win |
| 12:39 | thorwil | technomancy: interesting points. i guess racket was out because this project is meant to be very gnu |
| 12:39 | DaReaper5 | if i define a "let" and then try to return it. Does that not work because of the lifetime of the let? |
| 12:40 | technomancy | thorwil: yeah, shame when politics get in the way of technical decisions like that |
| 12:40 | technomancy | guile is probably a lot smaller though |
| 12:40 | technomancy | which is ironic considering racket's appeal here comes from the ability to define a smaller language |
| 12:40 | hiredman | DaReaper5: please continue repeating your nonsense question every few minutes |
| 12:40 | DaReaper5 | (defn take-from-q [q] (let [q-interaction (.take q)] q-interaction )) |
| 12:40 | DaReaper5 | hiredman: np |
| 12:41 | DaReaper5 | q-interaction is null |
| 12:41 | DaReaper5 | when i know it is not because i have a println |
| 12:41 | DaReaper5 | or more specificaly take-from-q returns null |
| 12:42 | tmciver | DaReaper5: then (.take q) must be returning null |
| 12:42 | hiredman | or the code you pasted is not the code that is running |
| 12:43 | hiredman | tmciver: java queues cannot hold nil (null) and take blocks until it can return an element |
| 12:43 | hiredman | so it cannot return nil |
| 12:43 | tmciver | ah, right |
| 12:59 | Kowboy | cemerick, my network at work can be god aweful slow sometimes |
| 12:59 | Kowboy | it may just be that |
| 12:59 | Kowboy | but if I create the project outside of eclipse and then import it, I seem to get up and running much faster |
| 12:59 | cemerick | interesting |
| 13:00 | cemerick | Kowboy: Your slow network may very well have something to do with it |
| 13:00 | Kowboy | I am behind a proxy |
| 13:00 | Kowboy | I will try again shortly |
| 13:01 | cemerick | I don't know much about the lein integration, but IIRC, it doesn't make any use of offline mode when it might otherwise be able to (yet?) |
| 13:05 | Kowboy | is the leiningen plugin for eclipse a separate project? |
| 13:05 | Kowboy | btw, I tried again and no luck |
| 13:06 | Kowboy | I click on finish, I see the project pop up in the project explorer, but the Leiningen project wizard is still open, and the project directory has nothing in it but a .project file |
| 13:08 | dabd | should I go for JNA or JNI for interfacing with native C code that does not require passing huge data structures but relies mostly on speed? |
| 13:09 | cemerick | Kowboy: it's a separate plugin, but has the same lead |
| 13:09 | cemerick | Kowboy: I'd suggest reporting the hang to the ccw ML |
| 13:53 | nDuff | Can :type metadata be used for protocol dispatch, or do I need multimethods to take advantage of that? |
| 13:55 | technomancy | nDuff: need to use multimethods |
| 13:55 | technomancy | or rather, you get to use multimethods |
| 13:55 | SegFaultAX | Is there an online resource for looking at the Java source? |
| 13:55 | SegFaultAX | I'm interested at looking at java.util.concurrent.CountDownLatch |
| 13:56 | gfredericks | jml: #_ is a reader-level comment; it is useful often. |
| 13:57 | jml | gfredericks: when would you want to use that rather than ';'? |
| 13:57 | gfredericks | jml: to comment a form rather than a line |
| 13:57 | jml | gfredericks: makes sense. thanks. |
| 13:57 | gfredericks | clojure's comment macro does a similar thing, but that wouldn't be available in edn |
| 13:58 | gfredericks | ,[1 2 #_ 3 4] |
| 13:58 | clojurebot | [1 2 4] |
| 14:01 | hiredman | ,(comment 1) |
| 14:01 | clojurebot | nil |
| 14:01 | hiredman | ,(first [(comment 1)]) |
| 14:01 | clojurebot | nil |
| 14:01 | hiredman | ,(first [#_1]) |
| 14:01 | clojurebot | nil |
| 14:02 | hiredman | err |
| 14:02 | hiredman | ,(first [(comment 1) 2]) |
| 14:02 | clojurebot | nil |
| 14:02 | jmolet_ | SegFaultAX: javasourcode.org ? http://javasourcecode.org/html/open-source/jdk/jdk-6u23/java/util/concurrent/CountDownLatch.java.html |
| 14:02 | hiredman | ,(first [#_1 2]) |
| 14:02 | clojurebot | 2 |
| 14:02 | hiredman | anyway, the comment macro is meh |
| 14:03 | SegFaultAX | jmolet_: Thanks! |
| 14:10 | gfredericks | (defmacro don't [& args]) |
| 15:24 | gfredericks | is it unlikely to be possible to use the postgres UUID type in korma? |
| 15:24 | gfredericks | (insertion as a string fails) |
| 15:24 | thmzlt | gfredericks: that will do it |
| 15:25 | gfredericks | HA that's fantastic |
| 15:25 | gfredericks | thank goodness these things are immutable |
| 15:30 | technomancy | irony: ruby's UUID gem requires you to instantiate a factory before you can get any UUIDs, while Java's implementation doesn't |
| 15:31 | gfredericks | ruby has always bragged about being more object-oriented than java :) |
| 15:32 | hyPiRion | "Yay, we're more complex!" |
| 15:32 | technomancy | gfredericks: yeah, the irony there is that "more object oriented" usually means "it doesn't have primitives" which translates to "impossible to write fast numerics" |
| 15:32 | gfredericks | technomancy: the main thing it lacks is mutable numbers |
| 15:33 | gfredericks | I started a library to fix that |
| 15:33 | gfredericks | imagine being able to empty an array with my_array.length.zero! |
| 15:35 | hyPiRion | gfredericks: Well, that's convenient. |
| 15:35 | technomancy | well given that you can redefine == on an eigenclass... |
| 15:36 | gfredericks | technomancy: well fixnums don't have eigenclasses |
| 15:36 | technomancy | actually that probably only works once you leave tagged fixnums |
| 15:36 | gfredericks | I was going to define Flexnums as a separate class |
| 15:36 | gfredericks | but you can redefine the Fixnum math operations so that everything turns into a flexnum everywhere |
| 15:36 | technomancy | dun dun dun |
| 15:37 | gfredericks | suddenly your system is flowing with unheard of power |
| 15:37 | gfredericks | if your numbers don't have callbacks you're doing it wrong. |
| 15:37 | technomancy | gfredericks: did you see that one gem that defined class= |
| 15:37 | gfredericks | wat. |
| 15:38 | technomancy | I think it was from http://www.confreaks.com/videos/198-rubyconf2009-worst-ideas-ever |
| 15:39 | gfredericks | did it redefinie Object#class to go with it? |
| 15:39 | gfredericks | apparently you can redefine it but it doesn't have any effect :/ |
| 15:43 | muhoo | does nrepl do cljs yet? |
| 15:43 | osbert | is -?> in any of the modular clojure contrib libraries? |
| 15:43 | gfredericks | incubator maybe? |
| 15:44 | osbert | thanks |
| 15:45 | cemerick | muhoo: see piggieback |
| 15:45 | tgoossens | for the record a google plus community for clojure has been created |
| 15:45 | tgoossens | https://plus.google.com/communities/103410768849046117338 |
| 15:46 | borkdude | I hate these kinds of messages http://michielborkent.nl:8080/ <- how the hell can I see what is going wrong, it works locally |
| 15:48 | muhoo | cemerick: thanks, i'd forgotten about that |
| 15:50 | muhoo | borkdude: look in your logs |
| 15:51 | muhoo | borkdude: or hacks like this might work for production, https://github.com/kenrestivo/firealarm |
| 15:51 | borkdude | I'm going to try compojure next holiday ;) |
| 15:51 | muhoo | good plan |
| 15:52 | borkdude | fuck, I've been bitten by the require views inside jar thing again in Noir |
| 15:52 | borkdude | sorry for the language |
| 15:53 | muhoo | one of the hardest things i've ever done is teach a programming class to grade-school kids |
| 15:53 | muhoo | because, it is impossible for me to not curse when dealing with computers |
| 15:53 | muhoo | it's not a semicolon, it's a "fucking semicolon". always. |
| 15:54 | seangrove | Same here, but I drink heavily too at the end of it all |
| 15:54 | borkdude | lol |
| 15:55 | seangrove | Javascript, or closure's, event listening model is baffling |
| 15:55 | tgoossens | seangrove: explain! |
| 15:55 | seangrove | "When this even happens, call a function with this name" |
| 15:55 | seangrove | That's what I'd like |
| 15:55 | seangrove | So I can, in the repl, update the function and test |
| 15:56 | seangrove | Instead it seems to be "When this event happens, call *this* function, even though I've just given you a function reference" |
| 15:57 | bendlas` | cemerick: can you include patches and cut releases to/from incubator? |
| 15:58 | hiredman | seangrove: clojurescripts reference model is not very good |
| 15:58 | hiredman | seangrove: I would try giving it something like (fn [e] (my-fun e)) instead of just my-fun |
| 15:58 | seangrove | hiredman: good idea, let me try |
| 15:59 | cemerick | bendlas: yes, why? |
| 15:59 | hiredman | which is kind of lame, and in advanced complication will even get stripped away (I think) |
| 16:00 | hiredman | where as in clojure you can just do #'my-fun |
| 16:00 | cemerick | hiredman: waiting for you to build cljs vars out of atoms :-P |
| 16:00 | bendlas | cemerick: people have asked for apply-kw, so I made a patch: http://dev.clojure.org/jira/browse/CINCU-3 |
| 16:00 | hiredman | cemerick: :( |
| 16:00 | seangrove | I'm kind of with it being stripped out in advanced mode, though it seems a bit dangerous |
| 16:00 | bendlas | could you take a look at it and maybe apply it? |
| 16:01 | hiredman | seangrove: advanced mode munges names of everything anyway |
| 16:01 | hiredman | seangrove: so re-defining a function will not work anyway |
| 16:01 | seangrove | Yeah, not worried about redefining it once it's in advanced-mode/production |
| 16:01 | seangrove | Just worried I'll do something stupid forget it, and lose a night tracking it down |
| 16:02 | seangrove | hiredman: That did it, yes, thanks |
| 16:02 | seangrove | Does that mean I can't do #'my-fun inc ljs? |
| 16:02 | seangrove | cljs* |
| 16:04 | seangrove | And is that something that can be changed in the compiler, or a fundamental limitation of the js model? |
| 16:04 | hiredman | #' is var quote, clojurescript has no vars |
| 16:04 | seangrove | Ah, ok |
| 16:04 | cemerick | bendlas: oh, I generally don't touch anything in core.incubator outside of the strint stuff I wrote originally... |
| 16:05 | cemerick | ...which I need to just bust out into a separate library (again) so it can breathe free ;-) |
| 16:06 | cemerick | bendlas: honestly, it's been suggested that incubator should be shuttered, as it's premise seems faulty |
| 16:07 | cemerick | or, suboptimal, anyway |
| 16:07 | seangrove | cemerick: Actually, I just came across your strint stuff this morning, hoping to use it in cljs |
| 16:07 | bendlas | cemerick: I see |
| 16:07 | cemerick | seangrove: Should just work :-) |
| 16:07 | hiredman | or the name is misleading |
| 16:08 | cemerick | github.com/clojure/bag-o-stuff |
| 16:09 | cemerick | now that more threading macros are in core, all that's left is dissoc-in, seqable?, new-by-name (WTF), and strint |
| 16:09 | bendlas | cemerick: isn't it supposed to be potential new clojure.core/... entries? |
| 16:10 | cemerick | bendlas: that was the theory. *maybe* dissoc-in would get in, but none of the rest would. |
| 16:10 | cemerick | s/would/would or have |
| 16:10 | cemerick | All of it has been sitting around for a while. |
| 16:11 | hiredman | new-by-name? |
| 16:11 | bendlas | hm, in the case of apply-kw I'd discourage its use in most cases, but it should be there for people building DSLs |
| 16:11 | cemerick | hiredman: "Constructs a Java object whose class is specified by a String." |
| 16:11 | amalloy | hiredman: presumably for (let [x 'String] (new-by-name x)) or some similar |
| 16:12 | cemerick | bendlas: maybe amalloy et al. have something similar in flatland/useful? |
| 16:12 | bendlas | so I also see it for functions that are general purpose but might be a code smell in a lot of cases. |
| 16:12 | cemerick | amalloy: which is busted on travis atm |
| 16:13 | bendlas | cemerick: good idea, I'll look that up |
| 16:13 | bendlas | it's definitely one of the bigger bags-o-stuff around ;) |
| 16:14 | amalloy | cemerick: we should probably stop pretending to support 1.2, then :P |
| 16:14 | cemerick | was that some version of Clojure or something? |
| 16:15 | amalloy | cemerick: yes, flatland/useful is failing on clojure 1.2 |
| 16:18 | technomancy | "bag-o-stuff" <- sounds like the goal of original monolithic contrib was preserved in 1.3+ |
| 16:18 | cemerick | IIRC, it was created after a bunch of stuff didn't make the first cut into new-contrib. |
| 16:19 | muhoo | doesn't python have a "from future import" feature for stuff like that? |
| 16:19 | muhoo | stuff that didn't make it into the current version, but was backported, so to speak? |
| 16:20 | cemerick | It does, but future is supposed to include only things that will actually be in the stdlib eventually. |
| 16:20 | cemerick | As of 1.5, nothing in core.incubator qualifies on that count AFAICT. |
| 16:21 | Raynes | amalloy, cemerick: I'll fix that in a second. |
| 16:21 | borkdude | is there an way to "force" a path and a file into existence, like writing to ~/.somename/logs.txt, even if .somename doesn't exist yet (without manually checking, etc) |
| 16:22 | technomancy | borkdude: pretty sure you need .mkdirs |
| 16:23 | muhoo | borkdude: "mkdir -p"? |
| 16:23 | borkdude | muhoo in clojure (or Java for that matter) |
| 16:24 | muhoo | borkdude: oh, then, what technoancy said |
| 16:24 | Raynes | Bahahaha |
| 16:24 | borkdude | k tnx you both |
| 16:24 | Raynes | technomancy, amalloy: I was trying to figure out why no useful tests would pass just now and realized it's because my copy of leiningen is broken because of the test selector mods I'm making. :p |
| 16:25 | Raynes | Stash time. |
| 16:25 | muhoo | developer cut by own sharp edges :-) |
| 16:26 | muhoo | hell, i didn't know piggieback existed, except that 4 months ago i not only knew it existed, but submitted patches to it! early alzheimer's sucks. |
| 16:27 | cemerick | muhoo: we have similar ailments :-) |
| 16:27 | borkdude | muhoo is that a joke, or real? ;) |
| 16:35 | muhoo | cemerick: i'm not sure, actually. could be normal aging, docs are still tracking that one down. |
| 16:38 | borkdude | I'm starting to like working with paredit…. finally! |
| 16:39 | Raynes | muhoo: borkdude was the one that asked you. |
| 16:39 | Raynes | Which is even more cause for concern. |
| 16:40 | borkdude | lol |
| 16:40 | Raynes | I'm sorry to hear there is an actual problem. :( |
| 16:40 | borkdude | ah, wait, I didn't even took it that seriously… I read docs as documentation (wtf..) |
| 16:42 | Raynes | Oh no, not you too! |
| 16:42 | muhoo | hehe |
| 16:44 | borkdude | cemerick what do you mean? |
| 16:45 | borkdude | (kidding) |
| 16:45 | Raynes | muhoo: Seriously though, hope you find out you're just stupid and that it isn't a medical issue. |
| 16:45 | muhoo | well let's just put it this way: don't eat shrimp from the gulf of mexico 6 months after a major oil spill, unless you want to risk toxic poisoning and liver (and potentially brain) damage. that's the current theory anyway, nobody really knows yet. |
| 16:47 | borkdude | muhoo sucks man, sorry to hear it's a real issue |
| 16:47 | Raynes | I like to drip my shrimp in 10W-40. |
| 16:48 | muhoo | thanks, i didn't want to get into TMI, but i figured, maybe best to just out with it |
| 16:48 | muhoo | indeed, corexit makes a fine condiment. |
| 16:49 | muhoo | but if i can get piggieback + browser repl working than i can at least have more opportunites to be stupid in a great language. |
| 17:05 | brondo | hello, does anyone have any experience loading a directory from resources/ in an uberjar? |
| 17:05 | hiredman | you cannot load a directory via the classloader |
| 17:05 | brondo | loading files works great, but I want to get the path to a lucene index that's in my resources folder and always get nil with (clojure.java.io/resource "indexes/") |
| 17:05 | tmarble | technomancy: I can't seem to get clj-stacktrace to work with lein2, despite the tips on https://github.com/mmcgrana/clj-stacktrace (are those instructions up-to-date)? |
| 17:05 | borkdude | I think I've seen this once, but I forgot.. is it possible to "use" one var like with use and :only, but then with require? |
| 17:06 | brondo | hiredman, thank you! is there any known way to do this? |
| 17:06 | hiredman | brondo: you cannot do that |
| 17:07 | borkdude | brondo I'm currently working around an issue exactly like that… sometimes it works great, but now it gives me problems again.. |
| 17:08 | brondo | borkdude, hiredman is the normal way to do this to have an absolute reference to the directory and not try to pacakge it in the uberjar? |
| 17:09 | borkdude | there was something like "you can do everything with require (or was it use?) now", can't remember exactly what it was |
| 17:09 | hiredman | one way is to package it as a single file (zip or something) inside the jar, then pull it from the jar and extract it to tmp or something |
| 17:09 | brondo | I see |
| 17:10 | borkdude | let's put it like this: I want to require a namespace with :as, but want to use one thing from it with :only |
| 17:10 | amalloy | :refer |
| 17:11 | borkdude | amalloy :refer in require? |
| 17:11 | amalloy | yes |
| 17:11 | borkdude | amalloy does this work in clojure 1.3? |
| 17:11 | Joreji | Hey everybody, I'm trying to call clojure from java by doing: "RT.loadResourceScript("main/clojure/de/karolski/berkelium_clj/core.clj"); clojure.lang.RT.`var`("de.karolski.berkelium-clj","ensure-init").invoke();" But for some reason I get the exception: "Exception in thread "Thread-1" java.lang.IllegalStateException: Attempting to call unbound fn: #'de.karolski.berkelium_clj/ensure-init" Anyone knows what I'm doing wrong? The function ... |
| 17:12 | Joreji | ... definitely exists. |
| 17:12 | amalloy | i think it's 1.4 |
| 17:12 | borkdude | amalloy ok, good, because I dont see it on clojuredocs |
| 17:15 | egghead | is {:keys [field otherfield] :as whole-map} a legal destructuring? |
| 17:15 | egghead | nvm, typo in my source.. |
| 17:17 | Joreji | nvm, found the error. Was missing a .core in the ns. |
| 17:37 | TEttinger | @title http://duckduckgo.com |
| 17:37 | TEttinger | !title http://duckduckgo.com |
| 17:37 | TEttinger | hm, what is lazybot's prepend? |
| 17:38 | bbloom | ,(inc 5) |
| 17:38 | clojurebot | 6 |
| 17:38 | bbloom | &(inc 5) |
| 17:38 | lazybot | ⇒ 6 |
| 17:39 | bbloom | or ##(identity "inline") |
| 17:39 | lazybot | ⇒ "inline" |
| 17:40 | TEttinger | &title http://duckduckgo.com |
| 17:40 | lazybot | java.lang.RuntimeException: Unable to resolve symbol: title in this context |
| 17:40 | TEttinger | no, not trying to eval |
| 17:40 | bbloom | ~lazybot |
| 17:40 | clojurebot | Huh? |
| 17:40 | TEttinger | trying to call the plugin, I have a lazybot of my own |
| 17:40 | TEttinger | not here |
| 17:41 | TEttinger | `title http://duckduckgo.com |
| 17:41 | amalloy | TEttinger: lazybot's prepend is $. iirc if you start your own instance it defaults to @ |
| 17:41 | TEttinger | $title http://duckduckgo.com |
| 17:41 | lazybot | "DuckDuckGo" |
| 17:41 | TEttinger | thanks amalloy |
| 17:41 | TEttinger | $title https://duckduckgo.com/?q=github+lazybot |
| 17:41 | lazybot | Page has no title. |
| 17:41 | TEttinger | ah that's why |
| 17:41 | TEttinger | $title https://duckduckgo.com/?q=\!github+lazybot |
| 17:41 | lazybot | Page has no title. |
| 17:42 | TEttinger | $title https://duckduckgo.com/?q=\\!github+lazybot |
| 17:42 | lazybot | Page has no title. |
| 17:42 | TEttinger | sorry about the spam |
| 17:42 | amalloy | TEttinger: you can /msg him |
| 17:42 | TEttinger | is there a better place to test lazybot oh ok |
| 17:43 | TEttinger | well amalloy, maybe you can answer my question... |
| 17:43 | TEttinger | https://duckduckgo.com/?q=\!github+lazybot should be a redirect page. how can I get the title of what it redirects to? |
| 17:44 | TEttinger | https://duckduckgo.com/?q=\feeling+lucky+punk should also be a redirect page. |
| 17:44 | amalloy | improve the title plugin to use something smarter than slurp |
| 17:45 | TEttinger | it uses slurp-or-default right? |
| 17:46 | TEttinger | i mean would clj-http have something for that? |
| 17:46 | amalloy | probably |
| 17:47 | bbloom | i never know what to call "setter" functions |
| 17:47 | bbloom | i much prefer foo over get-foo, but set-foo just seems wrong when talking about an immutable structure |
| 17:48 | TEttinger | could it be... as simple as slurping the slurp? |
| 17:48 | bbloom | and with-foo implies dynamic context |
| 17:48 | bbloom | foo! implies mutation |
| 17:48 | bbloom | foo= implies equality |
| 17:48 | bbloom | (foo x new-val) is ambiguous with (foo x default-val) |
| 17:48 | bbloom | names are hard. |
| 17:50 | bbloom | conventions? opinions? |
| 17:53 | technomancy | update-* |
| 17:54 | bbloom | technomancy: better, but feels kinda long |
| 17:56 | bbloom | tpope: so far plugin is working beautifully |
| 17:56 | tpope | awesome |
| 17:57 | bbloom | feels vim-y too, which is nice |
| 17:57 | tpope | that was a design goal |
| 17:57 | tpope | that's always a design goal |
| 17:58 | ohpauleez | bbloom: You mean it isn't a mess of over-used leader key combos? :) |
| 17:58 | Sgeo|web | What is this "disable locals clearing" about? |
| 17:58 | Sgeo|web | I see it mentioned in Compiler.java |
| 17:58 | bbloom | ohpauleez: bingo. plus it plays nice with text objects |
| 17:58 | ohpauleez | bbloom: I name setter functions the verb of the mutation, or an arrow if it's a conversion (foo->bar ...) |
| 17:59 | bbloom | ohpauleez: yeah, sometimes there isn't an obvious verb. in *many* cases i discover that anytime there isn't a verb or an obvious x->y name, then there is a better design |
| 18:00 | bbloom | shortly after i asked that previous question, i realized that there was a far superior name for my use case |
| 18:00 | ohpauleez | agreed |
| 18:00 | ohpauleez | oh, stellar |
| 18:00 | bbloom | it also changed the signature of the function and cleaned up some of my thinking |
| 18:00 | bbloom | which is what clojure tends to do :-) |
| 18:01 | rlander | Hey, does anyone care to critique this for style and idiomatic usage? https://www.refheap.com/paste/7395 |
| 18:03 | bbloom | rlander: you don't need to convert a character back to a string |
| 18:03 | bbloom | ,(= \/ (last "some/url/") |
| 18:03 | clojurebot | #<ExecutionException java.util.concurrent.ExecutionException: java.lang.RuntimeException: EOF while reading> |
| 18:03 | bbloom | ,(= \/ (last "some/url/")) |
| 18:03 | clojurebot | true |
| 18:04 | rlander | bbloom oh, thats nice, thanks! |
| 18:04 | nDuff | It's going to be a lot slower to convert the string to a seq and back than to use (.endsWith url "/") |
| 18:04 | nDuff | (or whatever the java.lang.String method is |
| 18:04 | bbloom | nDuff: premature optimization |
| 18:05 | rlander | nDuff at this point I'm just trying to write idiomatic code, but thanks for the tip |
| 18:06 | Raynes | bbloom: Common sense, I think. |
| 18:06 | Raynes | Nothing wrong with .endsWith |
| 18:06 | nDuff | bbloom: There's optimization, and then there's writing code that's not needlessly slow. |
| 18:06 | Raynes | I use it all the time. |
| 18:06 | nDuff | bbloom: I'm pretty sure this is a cat-2. |
| 18:06 | Raynes | And I'm a pretty cool guy. |
| 18:07 | bbloom | as a guy doing lots of CLJS, damn you and your usage of common java-isms in core code paths! :-) |
| 18:07 | bbloom | also available: regexes |
| 18:07 | nDuff | Ahh. :) |
| 18:07 | bbloom | ,(re-matches #".*/$" "some/url/") |
| 18:07 | clojurebot | "some/url/" |
| 18:07 | bbloom | ,(re-matches #".*/$" "some/url") |
| 18:07 | clojurebot | nil |
| 18:07 | bbloom | which, might be what he actually wants here: |
| 18:07 | Raynes | The day I start trying to write Clojure code that works in ClojureScript is the day I check myself into Arkham. |
| 18:08 | rlander | bbloom sorry, I don't follow |
| 18:08 | Raynes | I had a feeling you were a leader. |
| 18:09 | bbloom | rlander: clojure.string/replace allows regexes |
| 18:10 | bbloom | although my knowledge of java regex expressions is apparently poor |
| 18:11 | hyPiRion | Hmm, that would also be an issue with regexes |
| 18:11 | Apage43 | I need to whip out the reference most of the time |
| 18:11 | hyPiRion | and interop |
| 18:11 | bbloom | yeaaaaah java regexes != javascript regexes :-/ |
| 18:11 | hyPiRion | /s/interop/other clojures on other platforms |
| 18:11 | ohpauleez | java regexes != ANY OTHER REGEX |
| 18:11 | ohpauleez | :) |
| 18:12 | technomancy | could be worse; could be elisp regexes |
| 18:12 | bbloom | true story. |
| 18:12 | hyPiRion | could be worse, could be no regexes |
| 18:12 | hyPiRion | Well, I'm not even sure if that's worse sometimes. |
| 18:12 | ohpauleez | haha |
| 18:12 | rlander | bbloom Ok, I see. add-slash is actually going to be a middleware that adds a missing "/' to :uri. It's not used inside any of the functions in that paste |
| 18:12 | bbloom | fun fact: there generally aren't REGexes |
| 18:13 | bbloom | perl regexes are not regular |
| 18:13 | bbloom | :-/ |
| 18:13 | arrdem | does clojure have an equivalent to C's __file__ variable for use in macro expansion? |
| 18:13 | ohpauleez | cue the regex joke, "You have a problem and you think, 'Oh! I can solve this with regex' ..." |
| 18:13 | hyPiRion | bbloom: Do you mean the formal definition of regular expressions? |
| 18:13 | technomancy | arrdem: clojure code is usually loaded from jar files, so it's not very useful but there's *file* |
| 18:13 | arrdem | silly perl... regexes can't be recursive... |
| 18:13 | bbloom | hyPiRion: http://swtch.com/~rsc/regexp/regexp1.html |
| 18:13 | bbloom | hyPiRion: and http://code.google.com/p/re2/ |
| 18:14 | arrdem | technomancy: gah ofc. Been writing C for the last few months and my brains a little addled from it. |
| 18:15 | bbloom | i recall a dramatic performance bug that i fixed at google by inserting the character "2" to the code `#include "goog/whatever/re.h"` |
| 18:15 | seangrove | About to dive into goog.async.Deferred - anyone have any experience or quick high-level tips around it? |
| 18:15 | nDuff | arrdem: ...there's also reader matadata... |
| 18:15 | nDuff | gah, metadata |
| 18:16 | hyPiRion | bbloom: The first one's just speedups though |
| 18:16 | hyPiRion | The second one shows the issue better :) |
| 18:17 | bbloom | rlander: also on the idiomatic list: (if ?x ?y nil) can be (when ?x ?y) |
| 18:17 | arrdem | back in the C project I'm now running away from I had a DEBUG() macro that generated printf()s with the file and line no. that's what I'm trying to get. |
| 18:17 | bbloom | rlander: it's not common to see commas used in such short expressions like [k, v] |
| 18:17 | bbloom | rlander: indentation on line 29 is weird |
| 18:18 | rlander | bbloom Honest mistake from a Pythonista [k, v] |
| 18:19 | rlander | bbloom the identation is sublimetext's fault. Just fixed it. |
| 18:23 | rlander | bbloom all fixed https://www.refheap.com/paste/7397 |
| 18:23 | rlander | bbloom again, thanks for the corrections, much appreciated |
| 18:25 | Foxboron | rlander, using Sublime Text? |
| 18:26 | rlander | Foxboron yup. Not very good for clojure. |
| 18:26 | Foxboron | rlander, i did put up some snippets for Clojure with package manager. |
| 18:26 | Foxboron | Its lacking a REPL with the Lein version 2, but. |
| 18:27 | rlander | Foxboron: excellent for everything else. |
| 18:27 | Foxboron | I was wondering if you would like to test a Sbulime plugin i have been working on. |
| 18:27 | Foxboron | Basically a ClojureDoc searcher with some neat features |
| 18:28 | rlander | FoxBoron, sure. Sounds nice. |
| 18:28 | rlander | Foxboron https://github.com/Foxboron/ClojureDoc-Search ? |
| 18:28 | Foxboron | Hah, yeah :) |
| 18:29 | Foxboron | Also, the snippets i have pushed to Package manager should help on some of the functionality |
| 18:29 | Foxboron | Just hoping they will get SublimeREPL working soon :/ |
| 18:29 | rlander | Foxboron I'll try it right now |
| 18:30 | Foxboron | Foxboron, snippets are at the package manager, the searcher is submitted but not accept atm |
| 18:30 | Foxboron | hah, i just highlighted myself :P |
| 18:31 | Foxboron | rlander, just come with suggestions and bug reports if you encounter them. |
| 18:31 | rlander | Foxboron, package manager has totally spoiled me. |
| 18:31 | Foxboron | haha, yeah :P |
| 18:32 | rlander | trying to remember how to manually install a package from a repo |
| 18:32 | Foxboron | rlander, download the zip, go to sublime. pref -> browse packages |
| 18:32 | Foxboron | Move folder to the package folder. |
| 18:34 | rlander | Foxboron, oh, right, thanks |
| 18:34 | Foxboron | np ^^ |
| 18:36 | rlander | Foxboron, cmd+shift+c doesn't seem to be working |
| 18:37 | Foxboron | hmmm |
| 18:38 | Foxboron | rlander, Linux or OSX? |
| 18:38 | Foxboron | or Windows? |
| 18:38 | rlander | Foxboron osx |
| 18:38 | Foxboron | yeah umm, go to the keybidn file and change ctrl to cmd. |
| 18:38 | Foxboron | i forgot adding Linux and OSX keymap files. |
| 18:38 | Foxboron | Doing that now |
| 18:39 | Foxboron | keybind* |
| 18:44 | rlander | Foxboron this is awesome |
| 18:45 | Foxboron | rlander, thanks :) |
| 18:45 | flying_rhino | hello guys |
| 18:46 | Foxboron | rlander, if you get an auto-match, but still wanna see other results, you can bush esc |
| 18:46 | Foxboron | push* |
| 18:46 | Foxboron | actually, you can push back. |
| 18:47 | flying_rhino | it is possible that I am a friggin idiot, but I installed leinangen and got it to work, but can't figure out how to use anything bigger than REPL in command prompt. I can create new project but have no idea what to do with it. |
| 18:48 | Foxboron | flying_rhino, common beginner problem TBH. I had the same problem. Lets see if i can find the tutorial which sat me on the right track :D |
| 18:48 | technomancy | flying_rhino: have you read `lein help tutorial`? |
| 18:48 | rlander | Foxboron, you mean, for example, when searching for "cond" I'd push esc to see "condp" too? |
| 18:49 | Foxboron | rlander, you can use the option back, and you see other search results. |
| 18:49 | Foxboron | I justs did so that 100% matches gets right to the main menu. |
| 18:49 | rlander | Fonxboron push back does work, but esc doesn't |
| 18:49 | Foxboron | yeah, i was wrong. |
| 18:49 | Foxboron | esc works in other scenarios :) |
| 18:50 | rlander | Foxboron seriously, this is very useful |
| 18:50 | Rich_Morin | Are there any ClojureWest group discounts for Meetup groups, etc? |
| 18:50 | rlander | why is it "Insert example" and not "View examples" ? |
| 18:51 | egghead | oo reminds me, I wanna go to clj west! |
| 18:52 | Foxboron | rlander, good question, i thought it would be more reasonable. Dunno why. |
| 18:52 | nDuff | Hrm. |
| 18:53 | Foxboron | rlander, however glad you liked it. If you get any problems or find any bugs, just PM me. Been striving for a long time to find a clojure user using Sublime which would try the plugin :) |
| 19:34 | bbloom | is there a way to get nrepl to pretty print by default? |
| 19:39 | ohpauleez | bbloom: it looks like the middleware is marked TODO - but I'm not a definitive source |
| 19:39 | bbloom | ohpauleez: i'm getting so spoiled by cpw to print the value of a def |
| 19:40 | bbloom | used to have to type out (pprint thevar) |
| 19:40 | ohpauleez | it's pretty stellar |
| 19:40 | tpope | I didn't even think of that |
| 19:41 | hiredman | (alter-var-root #'clojure.core/prn (constantly @#'clojure.pprint/pprint)) |
| 19:41 | hiredman | or something |
| 19:42 | bbloom | tpope: oh yeah, it's glorious :-) |
| 19:43 | bbloom | tpope: some more feedback: i expect {} and [] to count as blocks, not just () |
| 19:43 | tpope | reasonable |
| 19:43 | tpope | I used ab as a quick hack |
| 19:43 | tpope | with the idea that it could be swapped out later |
| 19:44 | bbloom | tpope: it's pretty effective for a quick hack |
| 19:44 | tpope | yep, which is why I haven't been in a rush to fix it |
| 19:44 | bbloom | also, i'm almost 100% convinced that cpp should be top level by default |
| 19:44 | bbloom | maybe ohpauleez wants to weigh in on that too |
| 19:44 | tpope | wait, you have top level {} and []? |
| 19:44 | bbloom | no |
| 19:44 | bbloom | i'm referring to our conversation from yesterday regarding eval form or eval top-level form as the default for cpp |
| 19:45 | bbloom | but top level {} and [] aren't completely unheard of in my scratch files when they have sub expressions that are interesting |
| 19:45 | tpope | I mean on one hand you want cpp to see []/{}, but on the other hand you just want it to do toplevel? |
| 19:45 | bbloom | [:foo (some-complex-thing :bar)] |
| 19:46 | bbloom | tpope: i want cpab to see [] and {} |
| 19:46 | tpope | well it'd have to be some other operator, since ab is a built in |
| 19:46 | bbloom | hm ok |
| 19:46 | tpope | but yeah, I agree |
| 19:47 | tpope | but for that matter, should it also grab atoms? |
| 19:47 | bbloom | if we ever meet, remind me that i owe you a beer. |
| 19:47 | tpope | will do :) |
| 19:47 | bbloom | you mean the @ outside of () ? |
| 19:47 | tpope | no I mean like symbols or strings or whatever |
| 19:47 | bbloom | hm, not sure |
| 19:48 | bbloom | would have to play with it, i think |
| 19:48 | ohpauleez | bbloom: tpope: Originally I wanted top-level (paragraph), but I actually like it form, since I can toggle to top-level pretty fast |
| 19:48 | tpope | by toggle you just mean move your cursor? |
| 19:48 | tpope | (that's what I do) |
| 19:48 | ohpauleez | like I said in my ticket, I don't use f,t - so I've been banging cpp cpw cpf constantly |
| 19:49 | ohpauleez | tpope: (yeah, hit next ")") |
| 19:49 | tpope | I was going to revisit the whole file mapping this weekend |
| 19:50 | tpope | along with the associated bug |
| 19:50 | ohpauleez | I could cpp, cpf), cpf), etc |
| 19:50 | bbloom | once i discovered `` as the intra-line equivalent of '', then (cpp`` became somewhat reasonable |
| 19:50 | bbloom | still kinda long |
| 19:50 | ohpauleez | welp, I'll remap to cpr right now |
| 19:50 | tpope | :) |
| 19:51 | ohpauleez | bbloom: does my recipe above work for you? |
| 19:51 | bbloom | ohpauleez: i'm not sure i follow it |
| 19:51 | ohpauleez | tpope: Please ignore all of terrible ideas - eventually I'll find the light :) |
| 19:52 | nDuff | Is there a standard-library equivalent to (partial map-indexed (fn [x y] [x y]))? |
| 19:52 | tpope | I'm pretty good at filtering out terrible ideas :) |
| 19:52 | ohpauleez | bbloom: You start in some inner form, you cpp, you want to see what the next form is going to be, you cpf) |
| 19:52 | tpope | some might say too good |
| 19:52 | ohpauleez | tpope: I still hate how r breaks the sentence-format |
| 19:52 | bbloom | ohpauleez: the next form may span multiple lines |
| 19:53 | nDuff | ...oh. |
| 19:53 | bbloom | ohpauleez: also, that doesn't go back to the beginning of the current top level |
| 19:53 | tpope | hmm? |
| 19:53 | nDuff | *facepalm*. |
| 19:53 | ohpauleez | I need to see how f and F differ |
| 19:53 | bbloom | fX searches current line until X |
| 19:53 | tpope | you mean cpr? |
| 19:53 | bbloom | FX searches backwards |
| 19:53 | ohpauleez | ahh |
| 19:53 | bbloom | ohpauleez: you need to learn to use f and t :-) |
| 19:54 | ohpauleez | I never use them |
| 19:54 | ohpauleez | haha |
| 19:54 | bbloom | ohpauleez: i use them constantly |
| 19:54 | ohpauleez | I just use search and % |
| 19:54 | ohpauleez | but now I'm thinking, I'd use cpf) a lot |
| 19:55 | bbloom | f and t are crazy useful for modifications intrasymbol |
| 19:55 | ohpauleez | cs'" |
| 19:55 | ohpauleez | I use surround for that |
| 19:55 | bbloom | eg if you have foo-bar and you're cursor is before the f, you can ct-xyz<esc> and you've got xyz-bar |
| 19:55 | antoineB | hello, does exist a parser for clojure? |
| 19:55 | ohpauleez | change-surrounding-symbol-symbol |
| 19:56 | ChongLi | antoineB: for clojure source code? |
| 19:56 | nDuff | Could I ask for some eyes on https://gist.github.com/2235a2fa03ecd57b0a7c? I'm trying to get a flat sequence of nodes from walking a tree, and that's very much not actual behavior. |
| 19:56 | antoineB | ChongLi: yes |
| 19:56 | ChongLi | antoineB: well, there's eval |
| 19:56 | ChongLi | what exactly are you looking to do? |
| 19:56 | ohpauleez | bbloom: ahh gotcha |
| 19:57 | ohpauleez | I usually blast words away at that point |
| 19:57 | antoineB | ChongLi: i would like to do a little helping tool to deal with clojurescript |
| 19:57 | bbloom | when i was learning vim for real, i decided to print out a cheat sheet and to pick one key per week to learn |
| 19:58 | antoineB | ChongLi: i need to parse ns, deftype, def, defn and defprotocol |
| 19:58 | bbloom | i'd force myself to use it every time it was applicable until i had it committed to muscle memory |
| 19:58 | bbloom | then i'd X the letter off my printed cheatsheet |
| 19:58 | bbloom | within 3 months, i became a text editing ninja :-) |
| 19:58 | bbloom | yet i still discover new stuff nearly daily! |
| 19:58 | ChongLi | antoineB: you'll want to look at the clojurescript compiler |
| 19:58 | ChongLi | https://github.com/clojure/clojurescript |
| 19:59 | ohpauleez | tpope: what about cpn? |
| 19:59 | ohpauleez | namespace |
| 20:00 | tpope | ohpauleez: you could conceively push "till next search result" |
| 20:00 | ohpauleez | ah true |
| 20:00 | ChongLi | antoineB: there was a commit just a few weeks ago adding parse-ns to the compiler |
| 20:00 | ChongLi | https://github.com/clojure/clojurescript/commit/a27f811f046cd1ace9e4b9461181e5a5fb23b682 |
| 20:00 | tpope | you need something that actually changes the buffer for the third character |
| 20:01 | tpope | ohpauleez: I never heard a good explanation of why evaluating the buffer is superior to just requiring it |
| 20:01 | tpope | cpr is perfect for "require" |
| 20:02 | ohpauleez | tpope: Oh yeah, I agree with :Require |
| 20:02 | ohpauleez | but that's a verb |
| 20:02 | ohpauleez | I want a noun |
| 20:02 | ohpauleez | cp-word cp-paragraph |
| 20:02 | ohpauleez | cp-require? |
| 20:02 | dnolen | antoineB: but what do you mean by "parse", parse into an AST? |
| 20:02 | tpope | well think of it as "requiring" |
| 20:02 | dnolen | lynaghk: ping |
| 20:02 | tpope | you're pushing a require request |
| 20:03 | tpope | a "requiring" |
| 20:03 | clojurebot | Pardon? |
| 20:03 | tpope | a "dumb bot" |
| 20:04 | ohpauleez | haha |
| 20:04 | tpope | a "requirement" |
| 20:04 | tpope | a "require dispatch" |
| 20:04 | ohpauleez | I'm going to personally map to cpa; cp-all-of-it |
| 20:04 | ohpauleez | nice on qwert and dvorak |
| 20:04 | antoineB | dnolen: parse into something more easy to deal with (in order to extract information) |
| 20:04 | tpope | then you clobber cpab, cpap, etc |
| 20:04 | ohpauleez | damnit! |
| 20:04 | ohpauleez | hahaha |
| 20:04 | tpope | I almost said cpA |
| 20:04 | tpope | that's perfectly available |
| 20:04 | ohpauleez | I'm for it |
| 20:04 | tpope | but not quite as nice |
| 20:05 | dnolen | antoineB: analyzer parses and produces AST which you can extract info if that's what you mean. |
| 20:05 | dnolen | antoineB: but it doesn't handle full Clojure of course |
| 20:06 | ohpauleez | I'll just think of "cpr - bringing it back to life" |
| 20:06 | tpope | ha! |
| 20:09 | tufflax | what's going on here? tpope making some sort of vim plugin for clojure? |
| 20:09 | egghead | lol |
| 20:10 | bbloom | tufflax: https://github.com/tpope/vim-foreplay |
| 20:10 | tpope | made |
| 20:10 | tpope | in the shade |
| 20:10 | ohpauleez | tpope: Just a heads up, I'm getting an EOF Java Exception with cpF( |
| 20:10 | antoineB | dnolen: what i want to do is for a given namespace (bounded to a file) give a list of all function, protocol, type, definition and protocol function + their associated data like doc, arguments name etc |
| 20:10 | tpope | ohpauleez: pretty sure you've misunderstood F :/ |
| 20:10 | dnolen | antoineB: if you want this for ClojureScript the analyzer does that for you. |
| 20:11 | tpope | ohpauleez: that will evaluate everything from the cursor position to the previous ( |
| 20:11 | antoineB | dnolen: i think a function that take a file/string and give me a clojure list could do the trick |
| 20:11 | tpope | ohpauleez: you're looking for more like F(cpp |
| 20:11 | tpope | although hcpp would work just as well |
| 20:11 | dnolen | antoineB: anayzer doesn't give you a list but it does give you a atom that holds a map of everything. |
| 20:11 | dnolen | analyzer |
| 20:15 | ohpauleez | tpope: Ah yes, this makes more sense now |
| 20:16 | tomoj | bbloom: do you plan to integrate qplan with core.logic somehow? I guess core.logic won't work for doubles, so your test needs a=2b-c written thrice? but core.logic might work for grid layout? pixels?? |
| 20:16 | lazybot | tomoj: Definitely not. |
| 20:17 | bbloom | tomoj: i'm not using qplan yet, so i'm not sure how it will evolve. the part written 3 times was just a test case. some higher level binding framework with explicit knowledge of linear equations could generate it |
| 20:17 | ohpauleez | bbloom: Personal question - |
| 20:17 | ohpauleez | Where do you think you really leveled up? |
| 20:18 | ohpauleez | between Drexel and now |
| 20:18 | ohpauleez | because there is a stark (very good) difference |
| 20:18 | bbloom | i'm just a shitty student. |
| 20:18 | ohpauleez | (not to say I ever thought you were bad) |
| 20:18 | ohpauleez | ahh |
| 20:19 | bbloom | happy to discuss further details privately :-P |
| 20:19 | ohpauleez | :) |
| 20:22 | tpope | I pushed cpr |
| 20:22 | tomoj | writing out equations would seem great. I don't understand yet how working manually with constraint methods would be |
| 20:22 | tpope | so you can stop trying to rename it :) |
| 20:24 | bbloom | tomoj: i'd expect not to write too many methods by hand, they are tricky to get right |
| 20:24 | bbloom | even that little test case is probably horribly wrong in a larger application |
| 20:25 | tomoj | because usually you don't want to implement all the methods for a relation? |
| 20:25 | bbloom | tomoj: because you need to design your methods such that you have free variables |
| 20:26 | bbloom | so you wind up with constraints being a higher-level grouping then you'd expect |
| 20:26 | bbloom | consider that slider with a midpoint example |
| 20:27 | bbloom | if you had three constraints: left > 0, midpoint = (left+right)/2, and right < max |
| 20:27 | bbloom | then only the midpoint would be a free variable |
| 20:27 | bbloom | so it wouldn't be resolvable in some cases |
| 20:27 | bbloom | but moreover, it would involve the other two as outputs, so there wouldn't be a free method |
| 20:27 | bbloom | it's a pretty constrained solving approach |
| 20:28 | bbloom | no pun intended RE: "constrainted" |
| 20:34 | stokachu | hi ive got a question about doing some multi-site work with clojure/enlive.. my problem is I am unable to get the template to reload based on what the current server-name in the ring request is: http://stackoverflow.com/questions/13772481/clojure-enlive-multi-site |
| 20:34 | stokachu | i can get the server-name based on whatever host i've setup but it seems like deftemplate will not re-request a new template page if the hostname changes |
| 20:36 | tomoj | "left > 0" is, uh, {:inputs #{:left} :outputs #{:left} :f (fn [{:keys [left]}] (max left 1e-100))}.. or what? |
| 20:36 | tomoj | er, {:left (max left 1e-100)} ofc |
| 20:39 | brehaut | stokachu: im running from memory here, but deftemplate is a macro that builds a template function and caches the html content. I think you'll need to go a bit lower level if you wish to have templates change their html content on each request |
| 20:39 | stokachu | brehaut: ah ok, it seemed like something was caching ill look through the enlive source at the other functions to see what i can find |
| 20:40 | stokachu | brehaut: thanks for clearing that up |
| 20:40 | brehaut | stokachu: from memory still i think 'at' is the form used for the guts of templates and snippets |
| 20:41 | stokachu | cool i will definately start there |
| 20:41 | stokachu | i saw the tutorial which mentioned using at so ill refresh my memory from that too |
| 20:41 | brehaut | you will probably want to investigate some sort of caching yourself though, based on hostname, because loading the templates isnt exactly fast |
| 20:42 | bbloom | tomoj: (min left 0) |
| 20:42 | stokachu | good point i haven't really given much thought about that, it may be wise to break up this app further and keep it hostname specific |
| 20:43 | bbloom | tpope: is there a way to interrupt an evaluation? |
| 20:43 | bbloom | say, if i, stupidly wrote an infinite loop? |
| 20:44 | stokachu | im curious though, is a "cloud" type deployment with a war for each domain running under a jetty instance seem like a decent idea? |
| 20:44 | stokachu | i was trying to do a umbrella approach where clients coming in would be proxied to a different template based on the url |
| 20:45 | brehaut | I have no experience with war deployment, or clouds in general |
| 20:46 | stokachu | yea me either still trying to jump on the boatr |
| 20:48 | brehaut | i dont think theres any problem with the 'umbrella' mechanism you are suggesting though |
| 21:05 | antoineB | dnolen: analyze-file is what i need, but how use it in my personal project? (i copy paste for now) |
| 21:07 | bbloom | any idea how i'd go about walking a sub tree with a zipper? looping with zip/next and zip/end? is pretty easy, but it's not obvious to me how to stop at (zip/right sub-tree-root) |
| 21:19 | tpope | bbloom: if it's using if_ruby, no :(. it times out after 16 seconds |
| 21:23 | bbloom | tpope: it seems like the request timed out, but the nrepl session got blocked |
| 21:23 | bbloom | i had to restart nrepl since i didn't know how to attach to a headless session and terminate the process |
| 21:24 | tpope | after my first infinite loop, I added a 16 second timeout wrapped around the connection code |
| 21:25 | tpope | when I tried exceeding it, I got a socket error over in the nrepl, but everything seemed to work fine after that |
| 21:25 | tpope | if you're having issues, it's presumably possible to send an interrupt back to nrepl. the interface is "interruptable eval" after all |
| 21:27 | tpope | you should try with a head and see if you can reproduce |
| 21:27 | bbloom | tpope: just upgraded to master a tiny bit ago. next time i write an infinite loop ill explore |
| 21:31 | devn | howdy tpope |
| 21:31 | devn | welcome to the party |
| 21:36 | ghachey | Hi, not sure if this is the best place to ask. I'm trying to get started with ClojureScript One. But one of the very first step, lein bootstrap, fails with: 'bootstrap' is not a task. See 'lein help'. I read a few places that people think this is because of an incompatibility lein (my first thought as well). I use the latest lein 2. I don't really won't to downgrade. Any suggestions where to go next? Thank you. |
| 21:37 | devn | ghachey: let me try it out... I'm on lein 2 as well, one moment... |
| 21:38 | devn | ghachey: i have the same issue. |
| 21:38 | devn | one second, let me see if i can figure out a way around it |
| 21:40 | devn | ghachey: yeesh. this project looks awfully neglected. 52 issues and 5 open pull requests. |
| 21:41 | devn | ghachey: the lein version is definitely the problem, and i dont blame you for not wanting to downgrade |
| 21:41 | tpope | you should see my repos :/ |
| 21:42 | devn | tpope: :) it's a blessing and a curse, i'm sure. |
| 21:44 | devn | ghachey: perhaps there's a fork of the project that works with lein2, it looks like a couple of people have been working on that... |
| 21:45 | flying_rhino | Foxboron: found that tutorial yet? |
| 21:46 | devn | ghachey: check out brentonashworth's other branches, speficially M003 |
| 21:46 | devn | it looks like that might work out of the box? |
| 21:48 | devn | ghachey: try this: `git fetch origin && git branch --track M003 origin/M003 && git checkout M003 && lein repl` |
| 21:48 | ghachey | devn: thank you will check that out. |
| 21:48 | devn | at the REPL type: (go) |
| 21:48 | devn | it worked for me. |
| 21:49 | devn | ghachey: also, open an issue to bug brenton to merge some of this lein2 support into master :) |
| 21:50 | ghachey | devn: will do, thanks. |
| 21:50 | devn | cheers! |
| 21:51 | devn | flying_rhino: what tutorial are you looking for? |
| 21:51 | Foxboron | flying_rhino, oh f-... totally forgot. |
| 21:52 | Foxboron | flying_rhino: http://debugme.wordpress.com/2012/05/30/leiningen-a-basic-tutorial/ |
| 21:52 | flying_rhino | thanks |
| 21:52 | flying_rhino | and this shows how you work with projects and stuff? |
| 21:52 | devn | tpope: by virtue of the above feedback from bbloom I'm guessing you have a repo out in public now, 'zat true? |
| 21:53 | devn | foreplay! :D |
| 21:54 | Foxboron | flying_rhino, pure basics. It should get you started with lein. Leiningen isnt that complicated ;) |
| 21:54 | flying_rhino | thanks again |
| 21:54 | devn | (happy clojuring) |
| 21:55 | Foxboron | flying_rhino, np. Sorry for the time, coding stuff and forgot my place in the time. |
| 21:55 | flying_rhino | Foxboron: no problem at all. I should have reminded you sooner |
| 21:55 | devn | Foxboron: he didn't forget your identity, though. |
| 21:55 | flying_rhino | I was also doing other stuff |
| 21:55 | tpope | devn: yep |
| 21:56 | tpope | how did you miss foreplay.vim?! |
| 21:56 | Foxboron | devn, and great is that :) |
| 21:56 | devn | tpope: :X I've been sick for a week, quite literally. The flu is *rough* this year. |
| 21:58 | tpope | aww |
| 22:02 | flying_rhino | Foxboron: I must say (I feel like broken record really) that while there is plenty to like about clojure I wish that mutability wasn't the dirty word it is. Functional is okay as DOMINANT paradigm, but something doesn't sit right with excluding everything else. For example how am I going to create the new sort of immutable type, (say vector that acts like db table) if I don't have acess to basic (i.e. mutable) building blocks? |
| 22:03 | flying_rhino | I fell like building blocks I have aren't fine grained enough... |
| 22:04 | bbloom | flying_rhino: what mutable building blocks don't you have? |
| 22:06 | muhoo | any ideas how i'd convert a jodatime object to json using cheshire? |
| 22:06 | devn | flying_rhino: you *do* have access. You can do whatever you like. |
| 22:07 | devn | flying_rhino: it's just, state is dealt with differently in clojure. |
| 22:07 | flying_rhino | maybe I can tell you what I would like to do and then you can tell me how to do it? If I am not annoying to you. |
| 22:08 | devn | flying_rhino: specifics are good. for instance: "I have (1 2 3) and I want (6 5 4)" |
| 22:08 | devn | but more general questions are of course encouraged as well |
| 22:10 | devn | flying_rhino: either way, clojure is not purely functional. it strongly encourages it for numerous reasons, but it doesn't prevent you from doing what you need to do. stuart halloway put it best a long time ago: "Clojure is a consenting adults language." |
| 22:12 | devn | flying_rhino: for instance... |
| 22:12 | devn | ,(let [x (transient [1 2 3])] (persistent! (conj! x 1))) |
| 22:12 | clojurebot | [1 2 3 1] |
| 22:13 | muhoo | hm, found it, add-encoder. sweet. |
| 22:13 | devn | flying_rhino: see http://clojure.org/transients |
| 22:15 | devn | flying_rhino: so uh, long story short, no, you're not annoying anyone. this isn't that kind of community. no one is going to kick you out of the channel for asking questions. :) |
| 22:15 | muhoo | hmm, wait, no. add-encoder doesn't exist. gah, documentation mismatch |
| 22:15 | muhoo | ok, this is why i really REALLY would love it if README.md for the version of a jar were included in the actual jar. |
| 22:16 | flying_rhino | I would like to have new data type that is similar to vector but acts more like db table. It acts like db table in that, when you remove something from the middle (or rather make cheap copy with something removed) higher numbers stay intact. if you have 5 elements and remove third, last two are still marked as 4 and 5. If you remove 5 and then add new thing, it will be marked 6. So index should act like auto increment primary key. |
| 22:16 | flying_rhino | If this was Java I would use hash table that has numeric keys and bundle it with increment_number in a class. How do you do it in Clojure? |
| 22:16 | muhoo | because, digging up the README.md from github produces stuff having nothing to do with the particular version of the library i've actually got loaded into the repl :-/ |
| 22:16 | tomoj | hmm.. conj!, end!, deliver, and fail in cljque scare me |
| 22:17 | tomoj | but I rationalize their presence with "consenting adults.." |
| 22:17 | flying_rhino | devn: that, in short is what I need :) |
| 22:17 | tomoj | in q.js, the promise is a separate object from the thing which you deliver to or fail |
| 22:18 | tomoj | one big reason for that is that the author wants to make a promise a safe thing to share across some kind of semitrusted (untrusted?) js boundary |
| 22:19 | tomoj | but I tend to think of "the rest of my code" as semitrusted.. |
| 22:20 | Raynes | I have devn and I want tomoj. |
| 22:20 | flying_rhino | devn: I hope I havent lost you :) |
| 22:21 | devn | flying_rhino: what about sorted-map? |
| 22:21 | tomoj | you want me? |
| 22:21 | devn | Raynes: im trying to golf on that as we speak |
| 22:22 | devn | ,(require '[clojure.string :as s]) |
| 22:22 | clojurebot | nil |
| 22:22 | devn | ,(s/replace "devn" #"devn" "tomoj") |
| 22:22 | clojurebot | "tomoj" |
| 22:23 | devn | err i guess you want a damned symbol back, eh Raynes? ;) |
| 22:23 | tomoj | a synchronous analogy would be that, when you block on a lazy seq, any other consumer of that lazy seq may throw an exception up to you |
| 22:23 | tomoj | I think? |
| 22:23 | flying_rhino | devn: it is more about encapsulation. I would like to 'hide' the mechanism that auto-increments numbers so it is simple to use and you can't screw something up accidentally. I am just not sure how to create new data type. But yes, sorted-map or something should be used at the core of what I want. |
| 22:27 | flying_rhino | am I talkin nonsense? |
| 22:27 | devn | nah, im just not sure the answer |
| 22:27 | devn | i've never needed that, personally |
| 22:29 | devn | flying_rhino: extend-type clojure.lang.IPersistentVector? |
| 22:29 | devn | flying_rhino: i realize that is wildly vague, but it seems like it's moving closer to what you're after |
| 22:29 | flying_rhino | because the way it would work now whould be two variables one sorted-map and one integer containing next-id. |
| 22:30 | flying_rhino | what does persistent vector do? |
| 22:30 | devn | ,(class []) |
| 22:30 | clojurebot | clojure.lang.PersistentVector |
| 22:31 | devn | ,(class (sorted-map)) |
| 22:31 | clojurebot | clojure.lang.PersistentTreeMap |
| 22:33 | devn | flying_rhino: you want this type. maybe another question would be why? |
| 22:34 | flying_rhino | I want to implement Entity Systems in clojure. |
| 22:34 | flying_rhino | there is whole blog dedicated to those. |
| 22:34 | devn | flying_rhino: clojure-games? |
| 22:35 | flying_rhino | Normaly they are mutable, but I would love to see if it is viable to create immutable Entity Systems. |
| 22:35 | flying_rhino | yeah they are mostly for games. |
| 22:35 | devn | flying_rhino: http://www.clojure-games.org/component-entity-system |
| 22:35 | devn | have you seen that? |
| 22:35 | flying_rhino | nope |
| 22:36 | flying_rhino | I'll have to study that |
| 22:36 | devn | flying_rhino: hopefully that gives you a place to start? |
| 22:37 | flying_rhino | to see if it is what I meant (since there are several similar but subtly differen ES approaches). But yes it is a place to start ! |
| 22:37 | flying_rhino | thank you! |
| 22:37 | devn | flying_rhino: wish i could be of more help! |
| 22:38 | devn | flying_rhino: https://gist.github.com/858586 |
| 22:38 | devn | that seems to be the bread and butter. |
| 22:39 | devn | flying_rhino: boom! https://github.com/ibdknox/gambit |
| 22:41 | devn | flying_rhino: more reading... http://stevelosh.com/blog/2012/07/caves-of-clojure-interlude-1/ |
| 22:45 | flying_rhino | have to study that A LOT more but at a glance it seems to be different kind of entity systems. Ones I am interested in are purer, with more separation of code and data. These seem to bunde everything together. http://t-machine.org/index.php/category/entity-systems/ |
| 22:48 | flying_rhino | devn: if you want to read more, start here http://t-machine.org/index.php/2007/09/03/entity-systems-are-the-future-of-mmog-development-part-1/ |
| 22:49 | devn | flying_rhino: thanks. interesting stuff. |
| 22:49 | flying_rhino | devn: that page isn't labeled as entity system on his blog, but is first and most importatnt |
| 22:50 | devn | flying_rhino: how familiar are you with clojure's agents, refs, and atoms? |
| 22:50 | flying_rhino | devn: basics only, at this point. But I have idea what are they for. |
| 22:51 | devn | i havent finished reading your suggestions, but the first post you linked above under the category "entity-systems" immediately made me think about refs and agents |
| 22:52 | devn | again, that is wildly vague. it just seems to sort of "fit" |
| 22:52 | devn | the whole idea of "identity matters" |
| 22:52 | flying_rhino | point of entity systems (the ones used in mmorpgs as described on blog) is to separate code and data |
| 22:52 | devn | you want a db-like datatype |
| 22:52 | devn | etc. |
| 22:53 | flying_rhino | basically at one pile you ahve bunch of pseudo-tables |
| 22:53 | devn | flying_rhino: but i mean, that's sort of the fundamental draw of clojure |
| 22:53 | devn | code *is* data |
| 22:54 | flying_rhino | these are tables are components. Entities provide identity (like that creature consists of this and that component) |
| 22:54 | flying_rhino | systems are where code is |
| 22:54 | flying_rhino | *these tables are components |
| 22:54 | flying_rhino | every tick systems process components |
| 22:54 | devn | is this akin to agent-based modeling? |
| 22:55 | flying_rhino | not sure |
| 22:55 | devn | http://en.wikipedia.org/wiki/Agent-based_model |
| 22:56 | tomoj | a db-like datatype.. like datomic.Database? :) |
| 22:57 | tomoj | but "mmorpg" hmm.. :/ |
| 23:03 | devn | tomoj: im stargazing as well :) |
| 23:04 | devn | i keep thinking of the ants simulation |
| 23:04 | devn | but with added metadata |
| 23:04 | flying_rhino | basically componets are like records. Physic component would be (:x-position :y-position :x-speed :y-speed) . Health would be (:current-health :max-health :regeneration-rate) . Weapon would be (:ammo :rate-of-fire :damage :max-ammo). You get the point. Entity is solely to keep track of what components each creature in game has. It just has list of components (and each component refers to it). Systems are where actual code is. Phys |
| 23:04 | flying_rhino | ics system graphic system, interface, ai |
| 23:05 | muhoo | cheshire is awesome. the way javascript handles floats is not awesome. |
| 23:05 | devn | the way javascript handles numerics in general: not awesome. |
| 23:06 | flying_rhino | thus is possible to compose new creature by simply entering right data, without code. |
| 23:06 | flying_rhino | only when you want brand new behaivor you need to touch code |
| 23:06 | flying_rhino | it is VERY data driven |
| 23:07 | devn | flying_rhino: i wish ibdknox were here... |
| 23:07 | flying_rhino | ibknox? |
| 23:07 | devn | chris granger -- he wrote gambit and i'm guessing has some opinions or ideas about what you're discussing |
| 23:08 | devn | muhoo: exactly :) |
| 23:08 | flying_rhino | devn: it is actually quite simple |
| 23:08 | flying_rhino | I am not sure if doing it this way in immutable language is even a right approach |
| 23:08 | tomoj | flying_rhino: I think you should look into datomic, but it probably can't handle an mmorpg, at least not without using multiple transactors (and dealing with that somehow..) |
| 23:08 | flying_rhino | tomoj: I am not building mmorpg per se |
| 23:09 | devn | flying_rhino: it is all quite simple ceteris paribus |
| 23:10 | flying_rhino | I just want code to be (potentialy) extremely scalable and to be easy to compose new stuff. And I am aware that entity systems are great for that. |
| 23:10 | tomoj | well, if you can afford to put all your write load on one box (which is not as bad as usual with datomic, but still a problem sometimes) and have all your writes broadcast to all jvms doing queries, then I think you should definitely look into it |
| 23:11 | tomoj | even if just to take ideas from it |
| 23:11 | devn | tomoj: it seems like he's not in need of that, that the regular facilities in clojure provide for what he's looking for |
| 23:11 | tomoj | that is, no durability? |
| 23:11 | dabd | I'd like to keep the largest value in the resulting list without having to invoke last which is O(n). What is the idiom? |
| 23:11 | dabd | (take-while (fn [x] (< x 72)) (map #(i/choose % 5) (range 4 72))) |
| 23:11 | dabd | i/choose is incanter.core/choose |
| 23:12 | devn | tomoj: it seems like he's describing passing around game state |
| 23:12 | tomoj | oh I missed the actual problem and only looked at the mmorpg stuff |
| 23:12 | devn | like the whole board is visible to all actors, and actors can be imbued with properties |
| 23:13 | flying_rhino | ystems should create new state (that is new copies of components) every thick |
| 23:13 | flying_rhino | *systems |
| 23:13 | tomoj | nevermind :) |
| 23:13 | flying_rhino | and no, not every systems needs to see every component |
| 23:15 | flying_rhino | *system |
| 23:15 | tomoj | so in the ants demo, each grid cell is a ref and each ant is an agent? |
| 23:15 | flying_rhino | I have no idea if building this in clojure is a good idea |
| 23:15 | clojurebot | Ok. |
| 23:15 | flying_rhino | AT ALL |
| 23:16 | devn | flying_rhino: nor do i. my guess? try it. :) |
| 23:16 | devn | flying_rhino: your response to other component entity systems written using clojure are coupled |
| 23:16 | flying_rhino | we are still stuck with what datatype acts like a table :) |
| 23:17 | devn | but maybe your version of coupled doesn't fit in clojure |
| 23:17 | devn | maybe it *isn't* |
| 23:17 | devn | im just posing what-ifs here, not saying you're wrong |
| 23:18 | devn | s/using clojure are coupled/using clojure is that they are coupled |
| 23:19 | bbloom | flying_rhino: "acts like a table" isn't just one datatype |
| 23:20 | flying_rhino | devn: if you mean coupling data and code, t=machine guy doesn't consider those to be 'real' entity systems http://t-machine.org/index.php/2007/11/11/entity-systems-are-the-future-of-mmog-development-part-2/ |
| 23:21 | bbloom | flying_rhino: the built in data types provide various space/time guarentees for various protocol functions |
| 23:21 | bbloom | you can create a compound data structure that provides indexes, etc |
| 23:21 | bbloom | but none of the built ins are going tod o that for you for multiple sorts, perspectives, views etc |
| 23:21 | bbloom | if you want a single sorted order preserved, you should use sorted-map or sorted-set |
| 23:21 | bbloom | (most likely) |
| 23:22 | flying_rhino | bbloom: how would you build compound data type? I know how to do that with classes, but what clojure uses for that? |
| 23:22 | bbloom | you can define types with deftype |
| 23:22 | tomoj | it's somewhat likely that idiomatic clojure for doing what you want would use something pretty different from what you think you need |
| 23:22 | bbloom | however, if you're really new to clojure, i suggest avoiding defining types right away |
| 23:23 | bbloom | start with getting really comfortable with the built in types |
| 23:23 | devn | defrecord |
| 23:23 | devn | deftype, defrecord |
| 23:23 | flying_rhino | defrecord is just for structs with no behaivor. Or am I wrong? |
| 23:23 | bbloom | flying_rhino: deftype is a primitive, so to speak |
| 23:24 | bbloom | defrecord is sugar which calls deftype and then adds map-like behavior to that new type it defines |
| 23:24 | bbloom | you can add ADDITIONAL behavior to your record types |
| 23:25 | bbloom | you most likely won't want to even use deftype if you don't need it |
| 23:25 | bbloom | let's say you have a collection of people with first and last names |
| 23:25 | bbloom | [{:first "Brandon" :last "Bloom"} {:first "Dev" :last "N"}] |
| 23:26 | bbloom | call that rows |
| 23:26 | bbloom | you can use a sorted set: (sorted-set compare-first-name rows) |
| 23:26 | bbloom | and (sorted-set compare-last-name rows) |
| 23:26 | devn | (or sorted-set-by) |
| 23:26 | bbloom | yeah that |
| 23:26 | devn | ((if that's helpful to you)) |
| 23:26 | bbloom | you can stick those inside a map to group them together |
| 23:27 | bbloom | {:indexed-by-first-name …, :indexed-by-last-name ...} |
| 23:27 | bbloom | and you can create a one-off function which lets you insert-person or remove-person |
| 23:27 | bbloom | insert-person would just add an item to both sets |
| 23:27 | bbloom | remove would remove it from both sets |
| 23:27 | bbloom | just start with that |
| 23:27 | bbloom | get used to working with those core data types |
| 23:28 | bbloom | you don't need to define a new type to have two indexes |
| 23:28 | bbloom | just create a small set of functions that do the operations you want |
| 23:28 | bbloom | start there |
| 23:29 | bbloom | if you're in a rush to deftype, then you're not thinking clojure-y enough yet :-) |
| 23:29 | bbloom | flying_rhino: does that make sense? |
| 23:30 | devn | flying_rhino: i gotta agree with bbloom -- there's a lot of room (and rope) in the core datatypes. when you find the point where you actually need to use deftype, that's the point at which you start trying to build your own |
| 23:31 | bbloom | deftype when you need type dispatch |
| 23:31 | flying_rhino | I don't want two indexes. I just want that when I remove something from the middle, higher stuff has same index. If you remove from the end and add something else, it has bigger index. Like auto increment primary key. In java I would implement it with hash table and next-id integer. |
| 23:31 | devn | flying_rhino: but this isn't java |
| 23:32 | flying_rhino | but changing indexes for items is what I seek to avoid! |
| 23:32 | flying_rhino | index must be unique for each item and must not be re-used. |
| 23:33 | flying_rhino | okay I'll think about this stuff |
| 23:33 | flying_rhino | I am a bit tired, it is late over here |
| 23:33 | bbloom | (let [db {:next-id 1 :rows {}}, id (:next-id db), new-row "fred"] (-> db (assoc :next-id (inc id)) (update-in [:rows] assoc id))) |
| 23:33 | bbloom | ,(let [db {:next-id 1 :rows {}}, id (:next-id db), new-row "fred"] (-> db (assoc :next-id (inc id)) (update-in [:rows] assoc id))) |
| 23:33 | clojurebot | #<ArityException clojure.lang.ArityException: Wrong number of args (2) passed to: core$assoc> |
| 23:33 | bbloom | ,(let [db {:next-id 1 :rows {}}, id (:next-id db), new-row "fred"] (-> db (assoc :next-id (inc id)) (update-in [:rows] assoc id new-row))) |
| 23:33 | clojurebot | {:next-id 2, :rows {1 "fred"}} |
| 23:33 | bbloom | flying_rhino: there, that 1 worked |
| 23:33 | devn | :) |
| 23:33 | flying_rhino | thanks |
| 23:34 | bbloom | it's the same idea: top level map to group a next-id and a set of rows together |
| 23:34 | bbloom | transform them at once |
| 23:34 | bbloom | wrap the whole thing up in an atom, and you've got a mini db :-) |
| 23:34 | devn | that reminds me a bit of stupiddb |
| 23:34 | devn | an old Licenser project |
| 23:34 | flying_rhino | thanks |
| 23:35 | devn | https://github.com/Licenser/stupiddb |
| 23:35 | flying_rhino | well a kind of stupid db is more or less what this thing is. Although bonus is that you can serialize stuff to actuall db easy. |
| 23:35 | bbloom | devn: nice. |
| 23:36 | bbloom | flying_rhino: https://github.com/Licenser/stupiddb/blob/master/src/stupiddb/core.clj kinda neat |
| 23:37 | flying_rhino | also some mmorpgs use (I hear) actual DB's for backend. No idea how they take data in and out in real time games. |
| 23:38 | flying_rhino | but that's flexibility of entity systems. You can start with pseudo-db and later switch to real one. |
| 23:38 | dOxxx | probably snapshots that are written to the disk in background |
| 23:38 | flying_rhino | and use db to serialize data in between. |
| 23:39 | flying_rhino | when you entangle code and data, you lose that flexibility. |
| 23:41 | bbloom | you're preaching to the choir about tangling code & data in this channel :-) |
| 23:43 | devn | flying_rhino: that temporary serialization of data is exactly what stupiddb provides |
| 23:43 | flying_rhino | OOP S.U.C.K.S (well, at least as a general purpose organizational technique; it has some use for specific stuff) |
| 23:43 | devn | or, close to it |
| 23:44 | flying_rhino | (now I better come down from a soapbox before I am lynched) |
| 23:45 | flying_rhino | *the |
| 23:45 | dOxxx | Does a hammer suck? Yes, if you're trying to put a turn a nut on a bolt with it. |
| 23:45 | dOxxx | :) |
| 23:45 | devn | flying_rhino: a "soapbox" is what snake oil salesman use. |
| 23:46 | devn | you don't strike me as a snake oil salesman. |
| 23:46 | devn | soapbox away! |
| 23:47 | flying_rhino | but really I no longer have any idea if ES (the kind I want to use) make any sense in clojure. |
| 23:47 | devn | flying_rhino: perhaps you're too concerned with up-front verification? Why don't you give it a try? |
| 23:49 | devn | flying_rhino: maybe the kind you want to use just *looks* different in clojure. |
| 23:49 | dOxxx | The Entity System that t-machine article is about seems to be fairly independent of language. |
| 23:49 | dOxxx | It's more of a architectural thing. |
| 23:50 | flying_rhino | basically we are using systems to create chaep copies of components (tables) every game tick (that is every quater second) |
| 23:50 | flying_rhino | *cheap |
| 23:51 | dOxxx | I'd think that creating copies of a non-trivial amount of data 4 times per second is going to cause you trouble no matter language you use |
| 23:51 | devn | flying_rhino: cheap "copies" over time sounds like persistent data structures to me. |
| 23:51 | devn | dOxxx: that's an assumption |
| 23:51 | flying_rhino | dOxxx: in mutable language I would simply alter those components |
| 23:52 | flying_rhino | here I can't alter anything. |
| 23:52 | devn | flying_rhino: that's patently false |
| 23:52 | devn | atoms, refs, agents |
| 23:52 | devn | alter them. |
| 23:53 | flying_rhino | I thout that here you alter stuff primarily via creating modified (cheap) copies of stuff. |
| 23:53 | flying_rhino | *thought |
| 23:53 | devn | ,(let [my-ref (ref [])] (dosync (alter my-ref conj 1))) |
| 23:53 | clojurebot | [1] |
| 23:53 | flying_rhino | (I am new to clojure) |
| 23:53 | devn | literally (alter) |
| 23:54 | devn | flying_rhino: no, take a deeper look at refs, agents, and atoms |
| 23:54 | devn | i think everything you need is right there |
| 23:54 | dOxxx | basically, clojure does have mutable state |
| 23:54 | dOxxx | it's just mutable state that uses immutable structures |
| 23:54 | devn | (but it's done in a way that doesn't suck) |
| 23:55 | dOxxx | i.e. you have a list that you want to change. you don't modify the list itself, you replace its with a new list that contains the original and the new elements |
| 23:55 | devn | not a new list per se |
| 23:55 | devn | a shared structure |
| 23:55 | dOxxx | yeah |
| 23:56 | flying_rhino | dOxxx: and that is called cheap copy, since it is shared structure? |
| 23:56 | dOxxx | yes since new list is constructed like (head = new item, tail = old list) |
| 23:56 | dOxxx | it doesn't have to make a copy of old list into the new list, it just references it. that's what makes it cheap |
| 23:57 | flying_rhino | then my description "basically we are using systems to create chaep copies of components (tables) every game tick (that is every quater second)" |
| 23:57 | flying_rhino | is correct |
| 23:57 | flying_rhino | I specified "cheap" copies. I know those are shared memory structures. |
| 23:57 | devn | flying_rhino: i dont think anyone is arguing |
| 23:57 | devn | flying_rhino: but cheap copies does not immediately imply "persistent hash array mapped tries" |
| 23:58 | dOxxx | I think my point was that it may be "cheap" but it's not "free" :) |
| 23:58 | flying_rhino | dOxxx: so the question is is there too much overhead or not? |
| 23:58 | dOxxx | that's what testing is for |
| 23:59 | dOxxx | I actually went through something like this a few months ago |
| 23:59 | dOxxx | I had an algorithm for parsing a text file of a fixed format written in Scala, in an mostly imperative fashion using mutable structures. |
| 23:59 | dOxxx | I decided to rewrite it using immutable structures in Clojure. |