2011-04-08
| 00:00 | livingston | eh, I got enough of what I need, more or less |
| 00:02 | Raynes | livingston: Opening it up in a text editor usually works for me. |
| 00:03 | livingston | Raynes: yeah I did I saw enough, I mostly wanted to verify what method signatures were there. then I confirmed it by importing the class into my repl and calling show on it. |
| 00:08 | mec | anyone know how to disable the automatic stack trace on exception in emacs? |
| 00:09 | livingston | mec: why? (in slime?) |
| 00:09 | mec | because 99% of the time just printing the exception to the repl would be fine |
| 00:10 | livingston | oh you mean you want it to just automatically hit '0' for you? |
| 00:12 | livingston | i'm sure if there isn't a setting for that, you could probably write some elisp to catch that buffer and just send it a '0' as input. |
| 00:13 | Havvy | My output is a lazy-seq and (doall) isn't removing the lazyness. :( |
| 00:14 | Havvy | Hmm, might be the placement of the (doall) |
| 00:15 | mec | Im sure I saw a setting somewhere that enabled the stack trace, I just cant find it again |
| 00:32 | Havvy | (str (interpose " " ["nick:" |
| 00:32 | Havvy | nick-lower "cmd:" cmd-lower "params:" parameters-lower] |
| 00:32 | Havvy | ,(str (interpose " " ["nick:" |
| 00:32 | clojurebot | EOF while reading |
| 00:32 | Havvy | nick-lower "cmd:" cmd-lower "params:" parameters-lower])) |
| 00:33 | Havvy | ,(str (interpose " " ["nick:" "cmd:"])) |
| 00:33 | clojurebot | "clojure.lang.LazySeq@73ee01f6" |
| 00:33 | mec | ,(apply str (interpose " " ["nick:" "cmd:"])) |
| 00:33 | clojurebot | "nick: cmd:" |
| 00:34 | Havvy | Why do you apply? |
| 00:35 | mec | ,[(str [1 2 3]) (apply str [1 2 3])] |
| 00:35 | clojurebot | ["[1 2 3]" "123"] |
| 00:35 | Havvy | Oh. |
| 00:35 | livingston | so if I'm calling some clj from java with something like this: ((IFn)RT.var("clojure.core", "println").deref()).invoke("Hello World"); |
| 00:36 | livingston | but I want to call my own function in another ns that hasn't been loaded yet, how do I load it... I'm assuming there a function on RT? |
| 00:40 | Havvy | So, (or (= var 1) (= var 2)) and (#{1 2} var) are equivalent? |
| 00:42 | mec | yes |
| 00:43 | Havvy | Sweet. |
| 00:46 | mec | ok so it looks like i need to disable sldb any idea where that setting might be? |
| 00:48 | livingston | Havvy: if that's all you were doing and those are constants the first is greatly preferred |
| 00:49 | livingston | first you're not created a set, and second, your intensions as a coder are clearer. unless you actually have a set of numbers you're testing against. |
| 00:55 | dnolen | Havvy: livingston: the second version is three times faster. |
| 00:56 | livingston | how can that be? |
| 00:58 | dnolen | livingston: sorry it depends. if the data doesn't match often 2nd version quicker. depending on the number of tests (each a fn call), 2nd version faster. |
| 00:59 | mec | checking against a set is just a hash table lookup |
| 00:59 | dnolen | in anycase, 2nd version is plenty idiomatic. |
| 01:00 | livingston | the second version is hashing too... there's no way. that hash table would have many items I would think. if you're talking find in a linked-list verus a hash-table, usually you have to get up 10's of things before the hashtable wins. I don't know if there is something sneaky under the hood of clj for small sets |
| 01:01 | mec | I cant for the life of me figure out where swank-clojure actually hooks exception handling into sldb |
| 01:02 | dnolen | livingston: in an or test you have multiple fn calls. a hash look up 1 call. |
| 01:02 | mec | i believe small sets may use lists, at least clojure specifically says it changes underlying types sometimes for speed |
| 01:06 | dnolen | ,(type #{1 2}) |
| 01:06 | clojurebot | clojure.lang.PersistentHashSet |
| 01:06 | dnolen | ,(type {1 2}) |
| 01:06 | clojurebot | clojure.lang.PersistentArrayMap |
| 01:07 | dnolen | ,(type (into {} (map vec (partition 2 (range 32))))) |
| 01:07 | clojurebot | clojure.lang.PersistentHashMap |
| 01:27 | amalloy | i guess livingston is gone by now, but if someone else wanted to look into a compiled java .class file, javap is a good builtin |
| 01:41 | hiredman | I've been thinking of writing some to take clojure class file and print it out as pseudo clojure code |
| 01:42 | hiredman | but javap works well |
| 01:50 | tomoj | hostname |
| 01:50 | tomoj | oops |
| 01:55 | bartj | I see that the title-case function of c.c.str-utils2 is not implemented |
| 01:55 | bartj | how do I go about submitting an implementation ? |
| 01:56 | brehaut | bartj: well, old contrib is no longer being maintained |
| 01:56 | bartj | oh |
| 01:56 | brehaut | bartj: otherwise you need to have signed the contributer agreement and then should post to the dev mailing list |
| 01:57 | brehaut | the maintainer of the package (or someone equally authoritive) will tell you the next step |
| 01:57 | bartj | I think it is Sierra |
| 01:59 | amalloy | isn't str-utils2 basically EOLed anyway? |
| 01:59 | brehaut | it seems likely |
| 02:00 | bartj | EOLed ? |
| 02:00 | brehaut | end of life |
| 02:00 | bartj | end of life ? |
| 02:00 | bartj | deprecated ? |
| 02:00 | amalloy | i think book authors should say "use this library, which at some point in the future will surely be deprecated" |
| 02:00 | bartj | ok, there are some useful functions in str-utils/str-utils2 |
| 02:01 | bartj | which seem to be missing in clojure.string |
| 02:01 | amalloy | bartj: a lot of those got promoted to clojure.core |
| 02:01 | amalloy | er |
| 02:01 | amalloy | clojure.string |
| 02:02 | amalloy | i like c.c.string, personally, but it's deprecated and that's just tough luck. there are good reasons, like not working well for non-english languages, i'm sure |
| 02:02 | bartj | hmm, ok; so I gather it is not worth the effort in this case |
| 02:02 | bartj | thanks |
| 02:39 | seancorfield_ | i rely on c.c.sql so i want to see that promoted to core :) |
| 02:40 | amalloy | seancorfield_: tried clojureql? |
| 02:41 | seancorfield_ | yeah, but i haven't really settled into it yet |
| 02:42 | seancorfield_ | i think i prefer the c.c.sql approach to be honest |
| 02:42 | markoman | anyone recall the site that had a good list of things you should know before running Clojure? |
| 02:43 | markoman | it talked about installing, lein, ides and so forth |
| 02:43 | markoman | short article / blog post |
| 02:44 | seancorfield_ | http://dev.clojure.org/display/doc/Getting+Started ? |
| 02:47 | markoman | it wasnt that. it was more oriented for people who know almost nothing about clojure and what they would expect to face when learning it |
| 02:47 | seancorfield_ | amalloy: my concern with clojureql is that it builds a representation of that then needs to be translated to sql (each time)... and i'm actually trying to get away from sql abstractions at the moment :) |
| 02:48 | seancorfield_ | markoman: hmm, then i've no idea... but i'd like to read it if someone figures out which page it is :) |
| 02:49 | seancorfield_ | i could do with more such references to feed to friends that i want to convert to clojure! |
| 03:05 | markoman | right, i bookmarked too much sites last week and some i didnt, so im messed with all information at the moment myself :) |
| 03:08 | markoman | dont you think lein is very easy? just load the script on bin directory, run it and lein repl and there you go? |
| 03:16 | amalloy | markoman: it sure is! |
| 03:39 | seancorfield_ | markoman: oh, i love leiningen... that's my build tool of choice... i wish CCW respected it better :) |
| 03:40 | markoman | i have added some custon tasks/targets on lein, but im not sure, if I can get them on IntelliJ Lein panel like the default targets are there visible and usable as single clicks |
| 03:40 | markoman | or double clicks maybe |
| 04:08 | ejackson | Salwe. |
| 04:12 | amalloy | hey ejackson, fliebel was looking for you, in search of an airplane quote |
| 04:13 | ejackson | lol. Not surprisingly netjets figured I was a joker. I'm going to try again. |
| 04:13 | amalloy | hahaha |
| 04:13 | ejackson | they can smell time rich, money poor over the phone |
| 04:14 | amalloy | $mail fliebel netjets thinks ejackson is a wacko. he's trying again. next time you're looking for him, utilize sexpbot to $mail him instead of wandering away :) |
| 04:14 | sexpbot | Message saved. |
| 04:15 | ejackson | ,(conj long-list-of-people-who-thingk-ejackson-is-a-wacko netjets) |
| 04:15 | clojurebot | java.lang.Exception: Unable to resolve symbol: long-list-of-people-who-thingk-ejackson-is-a-wacko in this context |
| 04:46 | cuvavu | Hi |
| 04:47 | cuvavu | Is anyone using appengine-magic successfully with eclipse and ccw? |
| 04:52 | markoman | i have tried but couldnt |
| 04:53 | markoman | then i tried netbeans, didnt work too good and finally IntelliJ which has been working best in my case |
| 05:00 | markoman | they have a google group for support |
| 05:07 | markoman | what should I know when using lein pom to publish my jar to clojars? |
| 05:09 | markoman | and can i use lein to upload something to clojars? |
| 05:13 | cuvavu | what is their google group? |
| 05:14 | cuvavu | I've found a general web-apps one - is there one for appengine-magic itself? |
| 05:20 | ejackson | anybody else lost doc in swank with 1.3.0 ? |
| 05:24 | amalloy | markoman: lein push |
| 05:24 | markoman | cuvavu: https://groups.google.com/group/clojuredev-users |
| 05:25 | markoman | i havent found any group for magic thou... |
| 05:25 | amalloy | cuvavu: i just saw constantine today, he said he follows the webdev list |
| 05:25 | cuvavu | thanks, both of you :) |
| 05:26 | markoman | amalloy: i used the command from clojars scp, but when i try to get project on other machine i get a lot of errors about missing artifacts, maven and such... |
| 05:27 | amalloy | markoman: the information content in that statement, with regard to how someone could help you debug it, is zero |
| 05:29 | markoman | i think its a very common... oh my mistake, typo going on. it worked fine |
| 05:35 | markoman | when I create and use project.clj with lein, can I specify :main to point to my jar lib instead of src dir? |
| 06:13 | markoman | amalloy: for some reason i dont have push task on lein... |
| 06:21 | clgv | markoman: then I'd guess it's a plugin/extension ;) |
| 06:32 | markoman | clgv: very much so ;) |
| 06:43 | Borkdude | what is the appropriate way to end a "lein repl" or "lein swank"? |
| 06:44 | Borkdude | with (System/exit 0) I get some exceptions |
| 06:44 | clgv | ctrl+d` |
| 06:44 | Borkdude | in Windows? |
| 06:45 | clgv | in linux. |
| 06:45 | Borkdude | ah yes |
| 06:45 | clojurebot | No entiendo |
| 06:45 | Borkdude | in Windows it also works |
| 06:45 | clgv | it means end of file if I remember correctly |
| 06:45 | fliebel | Borkdude: By any chance IndexOutOfBounds? |
| 06:46 | Borkdude | with "lein swank" it doesn't work though |
| 06:46 | Borkdude | but then I can do "ctrl-C" to end the batch-file |
| 06:47 | Borkdude | fliebel: Exception in thread "Thread-3" java.lang.RuntimeException: java.net.SocketExcept ion: Connection reset |
| 06:56 | fliebel | Does anyone know the state of this thing? https://github.com/hoeck/clojurebox2d It seems at least pre-lein and tied to clj-processing, which are not desirable for me. I do like to have wrapper for JBox2D. |
| 06:58 | hoeck | fliebel: maybe write your own jbox2d wrapper, its not that hard anyway |
| 07:00 | fliebel | hoeck: Yea, I'll see what happens. I was just surfing around. Would you say it's harder to beat this into shape than write my own wrapper? |
| 07:12 | hoeck | fliebel: depends on your goals, https://github.com/hoeck/clojurebox2d/blob/master/hoeck/clojurebox2d/jbox2d.clj and utils are the main namespaces for jbox2d wrapping action, and they do not depend on clj-processing |
| 07:13 | hoeck | fliebel: unfortunately, I had to write my own iteration macro, because jbox2ds c++ heritage, many things are done by mapping/filtering java arrays, and I don't want to use lazy-seqs for that in the main loop |
| 07:14 | hoeck | if you're okay with the tradeoffs taken and the look of the interface, then its easier to beat this into shape |
| 07:15 | fliebel | hoeck: I see. Well, the goal is to have some more interesting stuff for my game engine. Right now I have collisions based on java.awt.Rectangle. This is all fine, but I was looking around if there was a simple way to get some more advanced stuff. |
| 07:15 | hoeck | using another backend for drawing is not a big deal |
| 07:16 | fliebel | Okay, so this is really 3 layers of duck tape. Running C++ code in Clojure via Java does not sound very ideomatic :) |
| 07:16 | hoeck | not c++, but c++ translated to java |
| 07:17 | fliebel | Same thing. |
| 07:18 | hoeck | leads to lots of set!s https://github.com/hoeck/clojurebox2d/blob/master/hoeck/clojurebox2d/jbox2d.clj |
| 07:19 | hoeck | but is fast and humble on resources, more things for clojure to spend, like using multimethods for object collision :) |
| 07:20 | hoeck | fliebel: if you already have a game engine, I ca extract all the jbox related stuff from clojurebox2d and make it a separate lib (if you're interested) |
| 07:23 | fliebel | hoeck: Well, I don't know. I don't need the physics right now, but I guess I'll need them later anyway. Game engine is a big word btw, I have a game loop and some drawing, animation and collision stuff. |
| 07:26 | fliebel | So, no, not right now. |
| 07:28 | fliebel | This is also an option(DIY): http://www.wildbunny.co.uk/blog/2011/04/06/physics-engines-for-dummies/ |
| 07:29 | hoeck | fliebel: right, and given all the new clojure capabilities (native ints, mutable deftypes), it may even perform well |
| 07:30 | fliebel | hoeck: I think you have to go pretty far in 2D for anything not to perform well. |
| 07:33 | fliebel | Actually, the only thing I had to do for smooth animations is changing the GC. Besides that it renders more frames than is useful for anything else than stress-testing. |
| 07:35 | fliebel | hoeck: I don't think we're supposed to use mutable deftypes for anything other than implementing Clojure in Clojure. |
| 07:38 | choffstein | I have a question. Is there a rule of thumb in clojure for knowing what goes first ... the 'subject' or the 'object'. e.g. (assoc hash key value) vs (cons element list). In the first, the object that the function is acting on comes first. In the latter, the object comes last. I find this sort of confusing and was wondering if there was a good way to remember it. |
| 07:41 | fliebel | &(println (subs (:doc (meta #'deftype)) 1043 1241)) |
| 07:41 | sexpbot | ⟹ Note well that mutable fields are extremely difficult to use correctly, and are present only to facilitate the building of higher level constructs, such as Clojure's reference types, in Clojure nil |
| 07:43 | fliebel | choffstein: I think the object comes first in most cases. The way I think about it is "what would make the most sense grammatically, or using partial" |
| 07:44 | fliebel | &(map (partial nth 3) [[1 2 3] [4 5 6]]) |
| 07:44 | sexpbot | java.lang.ClassCastException: clojure.lang.PersistentVector cannot be cast to java.lang.Number |
| 07:44 | fliebel | *facepalm* |
| 07:45 | choffstein | fliebel: hmm, okay. |
| 07:45 | fliebel | So, there are weird cases, but most of the time, it makes sense when you use partial and -> |
| 07:46 | choffstein | Alright. I'll try to keep that in mind. Time to jump on a plane. Have a wonderful day :) |
| 07:48 | fliebel | Does anyone have a more consistent view on these things? |
| 08:06 | hoeck | fliebel: re physics engines and deftypes: I would consider this as an excuse to use (thread confined) mutation of primitives and arrays :) |
| 08:06 | fliebel | hoeck: Maybe, but I see that as an optimization rout when, and only when I run into performance troubles. |
| 08:08 | fliebel | I'm not even using transients right now, while that would probably make the inner game loop a lot faster, it rules out any multithreading, and everyone I spoke to agreed it was bad style to expose transients to the outer world. |
| 08:13 | clgv | fliebel: you can't even expose transients to the outer world since in fact you cant read them only add to or change them |
| 08:13 | clgv | so the "exposing scenario" is extremely limited |
| 08:14 | fliebel | clgv: What do you mean by "can't read"? |
| 08:14 | clgv | hmm well, I might have to correct, what I experienced is that they are not seq-able. |
| 08:15 | clgv | I didnt try to use nth or something |
| 08:15 | fliebel | true, but you can get stuff from them, and update-in! (not in core) |
| 08:16 | clgv | ok nth works |
| 08:16 | clgv | so it's "only" the seq-able property but which is a huge show-stopper for elegant code on exposed transients ;) |
| 08:17 | clgv | I avoided doing that as result of that experiments ;) |
| 08:18 | fliebel | very true. |
| 08:18 | clgv | but knowing that nth works I might do a performance experiment some time later ;) |
| 08:19 | fliebel | So how fast is it to become a transient? Is it just a flag? Because I read it's constant-time. |
| 08:20 | clgv | well usually I started with empty transient collections |
| 08:20 | clgv | guess thats pretty much constant time ;) |
| 08:20 | fliebel | Because idk, the implementor might decide to use a transient during his modifications. |
| 08:20 | fliebel | &(doc transient) |
| 08:20 | sexpbot | ⟹ "([coll]); Alpha - subject to change. Returns a new, transient version of the collection, in constant time." |
| 08:21 | fliebel | I'll have to track that call down into clojure.lang sometime. |
| 08:21 | clgv | :) |
| 08:22 | fliebel | wow |
| 08:28 | fliebel | clgv: My game engine accidentally almost does not care if you use a vector or a map for the game state. I'm not sure how useful that is, but I'm considering going the full 100% now and make it work. |
| 08:29 | clgv | you have to point out the coolness aspect and its implications for the coffee-drained clgv ;) |
| 08:31 | fliebel | clgv: Well, imagine all sorts of things happening to the game state, like iterating over it and drawing it to the screen, or checking if 2 things collide. And it's written in such a way that it almost does not matter if I get just a val or a MapEntry. |
| 08:33 | fliebel | What I did is that I extended MapEntry to the protocol of my game objects, to save me from some destructuring. This means I can do (function MapEntry args) and it will transparently invoke that on its val. |
| 08:37 | clgv | ah kk. I did that for my improved clojure inspector ;) |
| 08:37 | fliebel | clojure inspector? |
| 08:38 | clgv | original: http://richhickey.github.com/clojure/clojure.inspector-api.html |
| 08:38 | clgv | I build upon the inspect-table function |
| 08:38 | clgv | to support map entries better and atoms and refs at all |
| 08:39 | clgv | and realized parts of infinite lazy collections ;) |
| 08:42 | clgv | oh I was wrong: I used inspect-tree as startpoint |
| 08:48 | fliebel | Hey, you Swing! Why are you beating my ref to death? RetryEx clojure.lang.LockingTransaction |
| 08:52 | AWizzArd | fliebel: what do you mean? Do you code something with Swing? |
| 08:53 | fliebel | AWizzArd: Yea, I have an event listener update a ref, but it gives me exceptions. |
| 08:55 | fliebel | The strange thing is that it is the only place that writes to it. Or… wait, maybe I just need to restart my repl. |
| 08:55 | fliebel | no... |
| 08:56 | fliebel | It used to work, but not anymore. A deref can never ever retry a transaction, can it? |
| 08:57 | AWizzArd | A deref outside of a dosync? |
| 08:57 | fliebel | yea |
| 08:57 | fliebel | no.. |
| 08:57 | fliebel | wait… this is all really weird stuff happening here :P |
| 08:57 | AWizzArd | A read outside should not force a transaction to retry. |
| 08:58 | fliebel | yes, outside, but it does not matter. |
| 09:00 | fliebel | w-wait… D'oh! I :reload-all'd the thing, which must have caused the thing to have registered 2 listeners or something. |
| 09:01 | stuartsierra | yeah, that kind of thing can happen |
| 09:02 | clgv | fliebel: but eventhandler should be sequential in the swing gui thread, shouldnt they? |
| 09:03 | fliebel | clgv: I'd say so, but still, not loading the event thing twice solved it. |
| 09:04 | clgv | fliebel: maybe they introduced a swing threadpool sometime... |
| 09:05 | fliebel | btw, in a dosync with but a single statement, is it useful to use commute? Because the change is communicative, but using commute will execute it twice. |
| 09:09 | clgv | are there any java-only implementations for console guis? |
| 09:32 | raek | Charva looks nice... I should use it some time (http://www.pitman.co.za/projects/charva/Screenshots.html) |
| 09:32 | raek | it's not pure java, though... |
| 09:32 | fliebel | You know what would be cool? A generic JSR 323(whatever; scripting bridge) REPL. So you could do any JVM lang on the REPL. |
| 09:34 | AWizzArd | fliebel: you can provide this from within Clojure. |
| 09:34 | fliebel | AWizzArd: How? |
| 09:34 | AWizzArd | (change-to-repl :jython) |
| 09:36 | fliebel | AWizzArd: Okay, and now back? |
| 09:44 | fliebel | oh! http://download.oracle.com/javase/6/docs/technotes/tools/share/jrunscript.html |
| 09:46 | fliebel | and https://github.com/pmf/clojure-jsr223 and http://java.net/projects/scripting/sources/svn/show/trunk/engines?rev=236 |
| 09:48 | AWizzArd | fliebel: this python-repl would be programmed in Clojure. You just sit in a loop/recur, and it runs the code via jython. |
| 09:48 | AWizzArd | In that repl however you won't have the clojure reader macros etc. |
| 10:03 | angerman | does anyone speak sapnish? |
| 10:03 | clgv | never done sap ;) |
| 10:03 | fliebel | does anyone know aleph? |
| 10:03 | fliebel | how many roads must a man walk down? |
| 10:03 | angerman | fliebel: that's the async server, no? |
| 10:04 | fliebel | angerman: What I meant is, ask your question :) |
| 10:04 | angerman | fliebel: I'm in need of a tiny translation (en->es) "Lock to Point" or "Lock to Here" |
| 10:05 | ejackson | angerman: now you're pushing the linguistic boundary... |
| 10:05 | angerman | https://img.skitch.com/20110406-qds7h4efuy6682y5eadrmwkd2y.png |
| 10:05 | angerman | ejackson: of course! :D |
| 10:05 | fliebel | ejackson: Hey, how is the jet stuff going? |
| 10:06 | ejackson | fliebel: netjets are studiously ignoring me |
| 10:06 | angerman | ejackson: weird thing is, even though I am German and live in Europe, I have more easy access to asian languages then to european… :/ |
| 10:06 | ejackson | is there context for your query ? |
| 10:06 | ejackson | I'm tracking down a spaniard for you |
| 10:07 | angerman | ejackson: see the iamge |
| 10:07 | angerman | https://img.skitch.com/20110406-qds7h4efuy6682y5eadrmwkd2y.png |
| 10:07 | ejackson | ummm.... what ? |
| 10:07 | angerman | if enabled, the first few digits to the blue bar are greyed out and will stay even when the field is cleared |
| 10:08 | ejackson | ok |
| 10:08 | angerman | idea is that if you have a bunch of euro notes in succession (e.g. with near continuous serial numbers), you might want to "lock" the first few, because they will always be the same. |
| 10:09 | ejackson | gotcha |
| 10:09 | angerman | And only the last two, three or what ever change :) |
| 10:11 | fliebel | ejackson: Ignore? They think you are mocking theme because you don't talk with a big cigar on the phone? |
| 10:11 | ejackson | yeah, they can tell i sound poor |
| 10:12 | clgv | how can I used destructuring in a function signature to refer to the parameters by name and as a vector as well? |
| 10:12 | angerman | ?! lol emendio got mentioned in a russion document about clojure use. |
| 10:13 | angerman | clgv: doesn't :keys … :as work_ |
| 10:14 | clgv | I guess :as could work. but I dont know whether it works outside that map with :keys |
| 10:14 | fliebel | ejackson: So the trick is to sound rich. don't ask "How much?" but say "I want a plane, sent me a quote please" O even "my boss wants…" :P |
| 10:14 | ejackson | oh no, I went even more hardcore |
| 10:14 | fliebel | tell me :) |
| 10:15 | ejackson | we're holding our company retreat, and I was thinking as a bonus for their hard work I'd fly the employees out |
| 10:16 | ejackson | angerman: my best guess is "fijar de aqui" |
| 10:16 | ejackson | where fijar is 'to fix' |
| 10:16 | ejackson | (or at least my hive mind tells me that is a good guess) |
| 10:17 | pdk | arreglar |
| 10:17 | pdk | fijarse de X = to notice X |
| 10:17 | angerman | ejackson: thanks. |
| 10:17 | fliebel | ejackson: Google Translate agrees more or less. |
| 10:18 | ejackson | better find you a real spaniard though :) |
| 10:18 | ejackson | pdk: cool |
| 10:18 | angerman | ejackson: if it's wrong I hope at least one spaniard will complain with a better translatioN :D |
| 10:18 | ejackson | i like it. |
| 10:18 | pdk | what are we translating, i didnt catch it |
| 10:18 | ejackson | 'lock to here' or 'fix to here' |
| 10:18 | fliebel | https://img.skitch.com/20110406-qds7h4efuy6682y5eadrmwkd2y.png |
| 10:19 | angerman | wow guys you are great… (and faster then I am… :D) |
| 10:19 | pdk | like |
| 10:19 | pdk | to affix something to a spot? |
| 10:19 | pdk | or to lock something into a socket etc |
| 10:19 | angerman | pdk: pressing that button will grey out the first digits up to the blue vertical line. |
| 10:20 | fliebel | Maybe someone needs to launch #lazyI18n on Twitter. |
| 10:20 | angerman | if the field is cleared, only the part that is not "fixed" (grey) is cleard. |
| 10:21 | pdk | hm |
| 10:21 | pdk | in that case fijar would prob work |
| 10:21 | pdk | fijar desde aquí |
| 10:22 | angerman | pdk, google translate sais desde would be "from"… and it's intention is "to" |
| 10:23 | angerman | e.g. the first digits are locked, not the last. |
| 10:23 | pdk | hasta then |
| 10:23 | ejackson | hasta la vista, BABY ! |
| 10:23 | pdk | de/desde would convey from |
| 10:23 | pdk | a = to, at |
| 10:23 | pdk | hasta would convey "up to" |
| 10:24 | angerman | pdk: fijar hasta aqui then, I assume. |
| 10:24 | pdk | yeah i'd go with that |
| 10:24 | pdk | note aquí though |
| 10:25 | angerman | aqu? google keeps on correcting me it's aqui… confused. |
| 10:25 | pdk | acute accent over the I |
| 10:26 | pdk | irc kicks ass so it probably dropped the accented I |
| 10:26 | _fogus_ | nick fogus` |
| 10:27 | angerman | pdk, ahh thanks |
| 10:27 | ejackson | fogus`: why with all the decorators ? |
| 10:27 | ejackson | what do they denote ? |
| 10:28 | ejackson | is _fogus_ dynamically scoped ? |
| 10:28 | pdk | they denote STYLE BABY |
| 10:28 | ejackson | lol |
| 10:28 | ejackson | no wonder i don't get it |
| 10:29 | fliebel | I know my client gets me fliebel1 when I log off an on real quick, and I've also seen people use a _ when they are away, such as amalloy_. |
| 10:30 | fogus` | ejackson: Someone else took fogus on freenode. |
| 10:31 | cemerick | there's more than one? |
| 10:31 | fliebel | ejackson's gone |
| 10:31 | fogus` | cemerick: Apparently. Weird huh? |
| 10:31 | fliebel | fogus`: Did you try talking to him? |
| 10:33 | cemerick | what *is* a fliebel, anyway? |
| 10:33 | fogus` | fliebel: I did, but he never responds. He's also squatting my Last.fm name |
| 10:35 | fliebel | cemerick: Dunno, but wait… Nope, my dictionary does not know either. I think me and my friends made that up a long time ago to mean 'something' |
| 10:36 | fliebel | but more specifically something dangling loose like a shoe tie or whatever. |
| 10:51 | Dantas | hi everyone !! using the map function over a map data structure (map f {:a 0, :b 1} ) . what is suppose to be the arguments passed through the function (f ) inside the map ? |
| 10:51 | pdk | ,(seq {1 2 3 4}) |
| 10:51 | clojurebot | ([1 2] [3 4]) |
| 10:52 | devn | hello all |
| 10:52 | pdk | each pair in the map is going to be passed to f in a vector [key value] |
| 10:52 | ejackson | dantas: kv pairs |
| 10:52 | Dantas | pdk: ejackson : Thanks a lot ! |
| 10:53 | jweiss_ | anyone have problem with swank-clojure to list callers using C-c C-w c, gets "Error in process filter: wrong type argument: char-or-string-p, nil"? |
| 10:53 | ejackson | ,(map (fn [[k v]] v) {:a 0, :b 1} ) |
| 10:53 | ejackson | hmm. |
| 10:53 | clojurebot | (0 1) |
| 10:53 | ejackson | $(map (fn [[k v]] v) {:a 0, :b 1} ) |
| 10:54 | ejackson | hmmm... the bots scorn me today |
| 10:54 | Dantas | exacly, I thought it was a sub map ! thanks a lot |
| 10:54 | ejackson | ,(map (fn [[k v]] k) {:a 0 :b 1 :c 2}) |
| 10:54 | clojurebot | (:a :b :c) |
| 10:55 | pdk | ,(type (seq {1 2 3 4})) |
| 10:55 | clojurebot | clojure.lang.PersistentArrayMap$Seq |
| 10:59 | raek | 'for' and destructuring can be very useful too: ##(for [[k v] {:a 0 :b 1 :c 2}] (inc v)) |
| 10:59 | sexpbot | ⟹ (1 2 3) |
| 11:01 | Dantas | ejackson: watching the pdk expression (type (seq {1 2 3 4})) i did the same to a list . is list a sequence ? |
| 11:02 | Dantas | ,type(seq '(1 2 3)) |
| 11:02 | clojurebot | #<core$type clojure.core$type@11c1cdf> |
| 11:02 | Dantas | ,(type(seq '(1 2 3) ) ) |
| 11:02 | clojurebot | clojure.lang.PersistentList |
| 11:02 | pdk | sequences are an abstraction over all four basic collection types |
| 11:02 | pdk | lists/vectors/sets/maps |
| 11:02 | pdk | and strings |
| 11:04 | Dantas | pdk, yeah . a interface , right ? |
| 11:04 | ejackson | sequences can be thought of a bit as like iterators... they're not, but its a nice crutch. |
| 11:04 | stuartsierra | A list is the only Clojure data structure that is its own sequence. |
| 11:04 | ejackson | lists, vectors, maps are concrete data structures |
| 11:04 | raek | lists are their own seqs |
| 11:04 | ejackson | a sequence is not |
| 11:04 | ejackson | (as far as i understand these things) |
| 11:05 | Dantas | pdf, but for a map the type is a nested class form the map - clojure.lang.PersistentArrayMap$Seq |
| 11:06 | raek | ,(isa? clojure.lang.PersistentArrayMap$Seq clojure.lang.ISeq) |
| 11:06 | clojurebot | true |
| 11:07 | raek | Dantas: yes, it's an interface |
| 11:07 | Dantas | thanks all !! |
| 11:17 | mefesto | Hey everyone. I have a leiningen project that has both clojure and java sources. When generating a pom file (lein pom) the result does not include the java source path. Is this a known problem or am I doing something wrong? |
| 11:18 | fliebel | mefesto: I think you need lein-javac |
| 11:18 | fliebel | Or cake |
| 11:18 | mefesto | fliebel: lein-javac will generate a different pom file? |
| 11:19 | fliebel | mefesto: I don't know. I've only heard you need that to compile java files. |
| 11:19 | mefesto | fliebel: leiningen is building the project correctly it's just the pom file that doesn't include the java src path |
| 11:20 | fliebel | oh, okay, don't know then. |
| 11:20 | mefesto | the only reason I care about the pom file is so I can seemlessly use netbeans for the gui form building portion and use emacs for general coding |
| 11:21 | mefesto | i could just give in and use netbeans clojure support but i just figured if lein pom included the java source path then it wouldn't matter |
| 11:22 | fogus` | How might one defer a test with clojure.test? |
| 11:23 | raek | mefesto: are you using the latest version of leiningen? |
| 11:23 | mefesto | raek: Leiningen 1.5.0 on Java 1.6.0_22 Java HotSpot(TM) 64-Bit Server VM |
| 11:25 | raek | mefesto: does the pom.xml need to contain the source paths? I have one which lacks those... |
| 11:26 | mefesto | raek: yeah for this project to work in netbeans. perhaps my setup is hoakey but I only use netbeans for the gui forms which are stored as java sources (plus some form type type) |
| 11:27 | trptcolin | fogus`: if you're running w/ leiningen you can tag them w/ metadata & use test-selectors to only run the ones you're interested in |
| 11:28 | fogus` | trptcolin: Anyway w/o Lein? |
| 11:29 | mefesto | my project layout is like this: http://pastie.org/1772379 |
| 11:29 | trptcolin | not that i know of aside from commenting them out :) |
| 11:29 | mefesto | I'd like to consolidate the myapp-client and myapp-client-ui into a single leiningen project |
| 11:29 | fogus` | trptcolin: Seems like a useful feature. :-( |
| 11:30 | mefesto | myapp-client-ui only contains the netbeans swing forms which myapp-client depends on. I'm open to other approaches :) |
| 11:33 | raek | mefesto: I would recommend asking on the lein mail list. the java source path missing sounds like an easy to fix bug to me, and I know that technomancy makes new releases quite often |
| 11:34 | mefesto | raek: Will do. Thanks |
| 12:06 | technomancy | mefesto: it's an unintended omission; go ahead and open an issue on github for it |
| 12:06 | technomancy | mefesto: if you can get a patch in for it, that would help it happen more quickly; otherwise I'll try to be sure it makes it into 1.5.1 |
| 12:09 | thickey | p.s. food |
| 12:09 | thickey | p.p.s BEER |
| 12:09 | thickey | lol, sry |
| 12:26 | jweiss_ | having a little trouble with destructuring - can :keys maps be nested? |
| 12:27 | jweiss_ | i am not quite sure what (defn g [{:keys [a b c {:keys [d e]} z]}] [a b c d e z]) will be interpreted as |
| 12:27 | jweiss_ | i can't seem to call it so that the d e or z are non-nil |
| 12:28 | raek | jweiss_: you can't use :keys like that. :keys is the shortcut for the case when you want to bind the symbol foo to the value associated with :foo. |
| 12:29 | jweiss_ | raek: ok. is it me or does the doc here http://clojure.org/special_forms#toc4 not consistent about whether you need the :as keyword? |
| 12:30 | jweiss_ | is it that if no other keywords are specified, :as is assumed? |
| 12:30 | raek | jweiss_: {a :a, b :b, c :c, {d :d, e :e} :z} |
| 12:30 | raek | or {:keys [a b c], {:keys [d e]} :z} |
| 12:30 | raek | :as is used when you want to call the whole map something |
| 12:31 | jweiss_ | raek: ok so what is z there? |
| 12:31 | jweiss_ | sorry :z |
| 12:32 | raek | when destructuring a map, a pair can either have a symbol or a keyword as its key |
| 12:32 | mefesto | technomancy: thanks, i'll try to put a patch together later today |
| 12:33 | raek | when it's a symbol, like in {a :b}, that symbol will be bound to the value you get when you look up :b in the map |
| 12:33 | raek | but instead of a symbol there, you can have another destructuring form |
| 12:33 | jweiss_ | raek: ok i think i see why i'm confused, the doc is showing let bindings, which is not what i'm doing :) |
| 12:34 | jweiss_ | i'm doing defn |
| 12:34 | mec | let and defn destructure identically |
| 12:35 | jweiss_ | mec, yeah, but in a let there's a 2nd item (the value being destructured) |
| 12:35 | raek | with let, you have [destructuring-form value, destructuring-form value, ...] but with function parameters, you only have [destructuring-form, destructuring-form, ...] |
| 12:35 | jweiss_ | so i was looking at "(let [{fred :fred ethel :ethel lucy :lucy} m] ..." |
| 12:36 | jweiss_ | and wondering what m was |
| 12:36 | jweiss_ | not realizing i'm looking at a le |
| 12:36 | jweiss_ | let |
| 12:36 | raek | as mec pointed out, "destructuring-form" works the same for let and fn |
| 12:37 | raek | jweiss_: ah, I see. :) was my example of nested map destructuring clear? |
| 12:37 | jweiss_ | raek: still having a bit of trouble interpreting {:keys [a b c], {:keys [d e]} :z} |
| 12:38 | jweiss_ | the :z seems to be dangling there |
| 12:39 | raek | if you "expand" the first :keys, it looks like this: {a :a, b :b, {:keys [d e]} :z} |
| 12:39 | jweiss_ | ah ok |
| 12:39 | jweiss_ | that helps thanks :) |
| 12:58 | amalloy | ejackson: for sexpbot it's &(expr) at start of line, or ##(dec 1) anywhere in the line; $ is for commands |
| 12:58 | sexpbot | ⟹ 0 |
| 12:59 | mec | sexybot gets it done |
| 13:09 | dabd | struggling with http-agent here: how do you make a POST? url encode the parameters? what is the separator? thx |
| 13:10 | amalloy | mec: i read that like four times before i even noticed you'd changed the P to a Y |
| 13:10 | mec | amalloy: lol thats how i read sexpbot all the time |
| 13:11 | ejackson | amalloy: gracias. |
| 13:12 | ejackson | amalloy: and If I could stop reading pom.xml as porn.xml... |
| 13:12 | amalloy | ejackson: sexiest data-exchange format around |
| 13:16 | Raynes | amalloy: Did he ask a question somewhere? I missed it. |
| 13:16 | amalloy | Raynes: no, he just discovered that, when he used the wrong syntax, sexpbot ignored him |
| 13:16 | robinkraft | newbie question: How do I use 3rd party Java libraries? I'd like to do something like (import import org.apache.thrift.TBase), or include thrift as a dependency in project.clj. Even if you don't know anything about thrift, general info on how to use 3rd party libraries would be really helpful. |
| 13:17 | robinkraft | Thrift is already compiled and works in my Mac Python environment. I can even get thrift to work using demo Java classes that come with the thrift source code. But that's as far as I've gotten. FWIW there's a a jar file at /usr/local/lib/libthrift.jar. |
| 13:17 | robinkraft | p.s. pardon the typos - just saw the "import import" |
| 13:19 | mec | if the jar is on your classpath then the (import ..) should work |
| 13:19 | amalloy | robinkraft: you can depend on backtype/thriftjava 1.0.0 |
| 13:19 | amalloy | surely the wrong way to do it, but i happen to know he's published thrift there |
| 13:19 | robinkraft | I'm not sure, probably |
| 13:19 | dnolen | robinkraft: you can also just copy that jar into your project lib folder. |
| 13:19 | robinkraft | but I'd like to know for other libraries that aren't so convenient |
| 13:20 | robinkraft | ok. what about using it from the repl |
| 13:20 | robinkraft | ? |
| 13:20 | dnolen | robinkraft: lein repl, user=> (import '[org.apache.thrift TBase]) |
| 13:22 | robinkraft | dnolen: seems it's not in my classpath. So, that's the next question I guess: how do I add something to my classpath? |
| 13:22 | dnolen | robinkraft: copy the jar into your project lib folder. |
| 13:23 | robinkraft | dnolen: so I can't just load it interactively in the repl? I need a project first? |
| 13:23 | dnolen | robinkraft: you can do it without a project but then you need manage the classpath yourself. |
| 13:24 | dnolen | robinkraft: ^ |
| 13:24 | dnolen | java -cp path/to/clojure.jar:path/to/thrift.jar clojure.main |
| 13:25 | robinkraft | ahhh that looks promising |
| 13:31 | fliebel | Is there something that lets me update multiple keys in a nested structure? |
| 13:32 | mec | are they all at the same level? |
| 13:32 | fliebel | yes |
| 13:32 | mec | ,(update-in [[[1 2 3]]] [0 0] assoc 0 2 1 3 2 4) |
| 13:32 | clojurebot | [[[2 3 4]]] |
| 13:33 | fliebel | w-what? |
| 13:33 | amalloy | fliebel: you want to do something like [:a :b [:c :d :e]]? |
| 13:33 | chrissbx | How do you install swank with leiningen? Someone showed it to me once, but it installed an old version of swank and there are issues with it. |
| 13:33 | mec | a map might be more clear: |
| 13:33 | fliebel | This is what my data looks like: {:a {:x 2 :y 2}} |
| 13:34 | mec | ,(update-in {:a {:x 2 :y 2}} [:a] assoc :x 3 :y 3) |
| 13:34 | clojurebot | {:a {:x 3, :y 3}} |
| 13:34 | robinkraft | dnolen: I think you gave me enough to go with, I just need to figure out where the right jar file is ... Thanks much for your help |
| 13:36 | amalloy | mec: i've never managed to find a version of that that lets you use something more like update-in at the bottom level instead of assoc |
| 13:36 | fliebel | mec: Very nice. Now say I want to *update* and not assoc. If it's more than one line, I wrote something that does this already using reduce. |
| 13:36 | fliebel | amalloy: Ah, right |
| 13:36 | amalloy | maybe this is finally an argument for a plain update (rather than update-in) |
| 13:36 | mec | i dont follow |
| 13:37 | amalloy | eg (update-in {:a {:x 2 :y 2}} [:a] update [:x :y] inc) |
| 13:37 | fliebel | amalloy, mec: This is what I have now: https://gist.github.com/910326 |
| 13:37 | chrissbx | Where should I start if I want to work with clojure from emacs? |
| 13:37 | amalloy | but update doesn't exist |
| 13:37 | mec | you can give update-in any function you want |
| 13:37 | fliebel | mec: But not multiple |
| 13:37 | amalloy | mec: you can't easily give it multiple keys |
| 13:38 | amalloy | obviously it's possible by asking update-in to use a function that does all the work, but the "prettiest" version of that would be a version of update that works like assoc |
| 13:38 | fliebel | Yea, I;ve always wondered why it does not exist. Is it in amalloy utils? |
| 13:39 | amalloy | fliebel: it's not; i haven't wanted it for several months |
| 13:39 | amalloy | after this discussion i'm thinking of adding it :P |
| 13:39 | fliebel | I still need a better acronym. |
| 13:40 | amalloy | ? |
| 13:40 | chouser | technomancy: no where useful. Mainly I wish there were no object model built in, no inheritance, and no requirement to declare an exception type ahead of time. |
| 13:41 | fliebel | amalloy: You made me an acronym to convince me that amalloy had nothing to do with your name. I need to make myself a better one, because it wasn't very convincing. |
| 13:41 | mec | $findfn {:a 1 :b 2} [:a :b] inc {:a 2 :b 3} |
| 13:41 | sexpbot | [] |
| 13:41 | amalloy | heh |
| 13:41 | fliebel | mec: It should at least be inc inc |
| 13:42 | fliebel | or.. maybe not. |
| 13:42 | fliebel | $findfn {:a 1 :b 2} [:a :b] inc inc {:a 2 :b 3} |
| 13:42 | sexpbot | [] |
| 13:42 | amalloy | fliebel: k it's written. not very complicated |
| 13:42 | mec | (update-in {:a {:x 2 :y 2}} [:a :x] inc) |
| 13:43 | fliebel | cool |
| 13:43 | mec | ,(update-in {:a {:x 2 :y 2}} [:a :x] inc) |
| 13:43 | clojurebot | {:a {:x 3, :y 2}} |
| 13:43 | dnolen | chrissbx: http://clojure02.managed.contegix.com/display/doc/Getting+Started+with+Emacs |
| 13:43 | amalloy | https://gist.github.com/910333, and i'll get it into amalloy-utils later |
| 13:43 | amalloy | i don't think you want inc inc |
| 13:43 | fliebel | amalloy: Why is it using update-in? I would have based it on get and assoc personally. |
| 13:44 | mec | you can do (apply update-in m [k] f args) instead of (update-in m [k] #(apply f % args)) |
| 13:45 | amalloy | mec: thanks, i knew it was silly to need a closure |
| 13:45 | fliebel | amalloy: Now you are updating the whole datastructure every time, while you could only update the outer one once and the inner one as much as you need. |
| 13:45 | amalloy | fliebel: what? (update-in {:a {:x 2 :y 2}} [:a] update [:x :y] inc) |
| 13:45 | mec | you would still use update-in for that |
| 13:45 | fliebel | okay… oh right... |
| 13:46 | amalloy | i used update-in because it's crazy to use get+assoc to change a value in a map when you have update-in available |
| 13:46 | fliebel | I wasn't reading and thinking in a coherent manner. |
| 13:47 | livingston | if I use extend to add a protocol to a defrecord, and then pass that record instance out to Java, there is no way for java to see or use that object as that interface, is there? I would have to put that interface/protocol on at defrecord definition time right? |
| 13:47 | fliebel | yes |
| 13:48 | fliebel | extend stores the extension on the protocol, not on the record. |
| 13:48 | fliebel | (I only recently found out protocols are actually just maps) |
| 13:48 | livingston | whammy ok, guess I need to reorganize this code |
| 13:50 | livingston | fliebel: huh, that's interesting, especially since they allow objects to be created that don't need any dispatch or anything to get to their methods. |
| 13:51 | fliebel | {:impls {java.lang.String {:stuff #<user$eval359$fn__360 user$eval359$fn__360@5c1a1ff9>}}, :on-interface user.stuffer, :on user.stuffer, :sigs {:stuff {:doc nil, :arglists ([x y]), :name stuff}}, :var #'user/stuffer, :method-map {:stuff :stuff}, :method-builders {#'user/stuff #<user$eval340$fn__341 user$eval340$fn__341@13899213>}} |
| 13:51 | livingston | one more question on exposing clj data to java, if I pass out a record, and (since it's also a map) the java side wanted one of the fields, they could get it with get and passing a keyword as a parameter, right? |
| 13:52 | mec | you can also just do record.field |
| 13:53 | livingston | ooh - that's hugely handy |
| 13:54 | livingston | even if I use assoc to add on fields? that won't work then right, it wouldn't be available to the compiler? |
| 13:54 | mec | no just the default fields |
| 13:55 | livingston | makes sense, how would I get a non-default then, with get, right? |
| 13:55 | fliebel | Yea, using the ILookup protocol. |
| 13:55 | fliebel | I think it's actually entryAt |
| 13:56 | cemerick | livingston: Just using get all the time is generally a lot easier than worrying about the impl details. |
| 13:56 | cemerick | (and having to document concrete types on the java side) |
| 13:56 | fliebel | cemerick: But is there get at the Java side? I thought it was called entryAt. |
| 13:57 | cemerick | fliebel: records implement j.u.Map |
| 13:57 | fliebel | As well as ILookup, so both work? |
| 13:57 | cemerick | yeah, it implements a bunch of interfaces |
| 13:58 | cemerick | ,(supers (defrecord A [])) |
| 13:58 | clojurebot | DENIED |
| 13:58 | cemerick | anyway |
| 13:58 | livingston | that's really convienent for the java side, I would assume they would just use the java.util.Map interface that they are used to |
| 13:58 | amalloy | fliebel: everything is a map if you stand far enough back |
| 13:59 | livingston | although the Java users hav |
| 13:59 | livingston | e a casting nightmare on their hands |
| 14:00 | amalloy | livingston: you can typehint record fields |
| 14:00 | amalloy | er, maybe no |
| 14:00 | amalloy | i guess you can typehint them as primitives but that's about it |
| 14:00 | stuartsierra | yeah, primitive or Object |
| 14:01 | livingston | Object is not very useful as an interface to the java guys, but I guess that's what they get. |
| 14:02 | livingston | if I have a map that could have symbols strings or numbers, there's no way to give their compiler a better type anyway |
| 14:09 | stuartsierra | Generic types in Java, like Map<String, String> are not much more than syntactic sugar for type casts anyway. |
| 14:10 | livingston | in the end yes, but it save you from either flagging off the type checking, or putting casts everywhere. (i'm trying to be as accommodating as I can) |
| 14:11 | livingston | is there an example out there of how to defrecord using 2 protocols at the same time. the docs make it look kinda like you can only use one. |
| 14:12 | dnolen | livingston: something like this, https://github.com/swannodette/logos/blob/master/src/logos/minikanren.clj#L71 |
| 14:13 | livingston | perfect (assuming that works for records too) thanks. the ordering of everything wasn't clear. |
| 14:14 | dnolen | livingston: works just the same for records, defrecord is just a deftype w/ extra stuff. |
| 14:15 | livingston | cool, thanks |
| 14:15 | livingston | what happens if two different protocols have the same function name? is that legal and can your point them to two different implementations or to the same implementation? |
| 14:16 | dnolen | livingston: two protocols can't use the same name with/in the same namespace as far as I understand. |
| 14:16 | mec | amalloy: in your update why do [& keys] instead of just keys |
| 14:16 | amalloy | &(doc update-in) |
| 14:16 | sexpbot | ⟹ "([m [k & ks] f & args]); 'Updates' a value in a nested associative structure, where ks is a sequence of keys and f is a function that will take the old value and any supplied args and return the new value, and returns a new nested structure. If any levels do not exist, hash-maps will be created." |
| 14:17 | amalloy | mec: i know it's not necessary. it makes it more clear, for me, that it should be a seq |
| 14:17 | amalloy | and i'm sure i've seen it somewhere in clojure.core. maybe ##(doc clojure.string/join)? |
| 14:17 | sexpbot | ⟹ "([coll] [separator [x & more]]); Returns a string of all elements in coll, separated by an optional separator. Like Perl's join." |
| 14:23 | stuartsierra | Clojure 1.2.1 is released and on its way to Maven Central. |
| 14:29 | technomancy | stuartsierra: still no tag? |
| 14:30 | stuartsierra | tag? |
| 14:30 | stuartsierra | oh, in git |
| 14:31 | stuartsierra | There's a branch I think. Bug stuarthalloway to make a tag. |
| 14:35 | Raynes | https://github.com/clojure/clojure/pull/6 |
| 14:36 | stuartsierra | rhickey doesn't accept pull requests. |
| 14:36 | Raynes | stuartsierra: He certainly wouldn't accept that one. |
| 14:36 | stuartsierra | well no |
| 14:38 | cemerick | that's sooo bizarre |
| 14:39 | redinger | Wow, he actually went through all the work to do that |
| 14:40 | cemerick | I presume it was just s/clojure/lava, but… |
| 14:40 | amalloy | redinger: what work? find . | xargs perl -pi -e 's/clojure/lava' |
| 14:40 | stuartsierra | I wonder if it builds? |
| 14:40 | cemerick | The fact that he submitted a pull request is great. |
| 14:40 | opqdonut_ | haha, what's the story behind lava |
| 14:40 | znutar | I think the story is that it's cool |
| 14:41 | amalloy | i like how he renamed the repo too. style |
| 14:41 | Raynes | So cool. |
| 14:41 | fliebel | #findfn [1 2 3 2 1] [1 2 3] |
| 14:41 | fliebel | $irc://irc.freenode.net:6667/#findfn [1 2 3 2 1] [1 2 3] |
| 14:41 | fliebel | $findfn [1 2 3 2 1] [1 2 3] |
| 14:41 | sexpbot | [clojure.core/distinct] |
| 14:41 | fliebel | ah |
| 14:41 | Raynes | fliebel: Type slower. :> |
| 14:41 | redinger | Well it's rename all the files & replace text in files. Not a lot of work still - but why |
| 14:42 | cemerick | Reminds me of the guy who cloned the google code repo, swapped out the copyright notices for his own name, and pushed to github. |
| 14:42 | amalloy | but he left the homepage the same. clojure.org |
| 14:42 | fliebel | Raynes: Good idea. |
| 14:42 | znutar | Lava's got a sophisticated French feel if you pronounce it right too. As a newbie clojure user I look for this in my languages. |
| 14:44 | Raynes | Looks like the guy is a big Go fan. |
| 14:44 | Raynes | The language; not the game. |
| 14:46 | raek | stuartsierra: will there be an official announcement for 1.2.1? |
| 14:46 | stuartsierra | raek: There just was. ;) |
| 14:47 | raek | :) |
| 14:47 | stuartsierra | Once it's sync'd to Central I'll notify the mailing list. |
| 14:47 | raek | I was thinking about a URL to point people to |
| 14:47 | raek | ok |
| 14:49 | stuartsierra | Don't tempt me. |
| 14:49 | stuartsierra | I just spent the past 3 weeks implementing a 6-machine deployment strategy in Bash. |
| 14:49 | cemerick | Holy jeebus. |
| 14:50 | stuartsierra | It wasn't that bad actually. |
| 14:50 | cemerick | That's a bad time / node ratio, dude. |
| 14:50 | cemerick | I've been spoiled in the department in the past year. |
| 14:51 | cemerick | s/in the/in that |
| 14:51 | sexpbot | <cemerick> I've been spoiled in that department in that past year. |
| 14:51 | stuartsierra | Well, it wasn't 3 weeks full-time. |
| 14:52 | cemerick | oh well |
| 14:52 | cemerick | it's makes for good lore, anyway |
| 14:52 | livingston | mvn has it crufty bits (especially for dynamic language debugging in repl etc.) but it makes a lot of things really easy too |
| 14:52 | cemerick | Next time someone asks me "how long will it take to implement a 6-machine deployment strategy?"… |
| 14:53 | stuartsierra | Ruby + Rails + Clojure + C + Bash + Cron + TCL + a bunch of other stuff I forgot. |
| 14:53 | cemerick | livingston: Of course, your environment really should pull config from your pom.xml once, and work from there without ever running mvn for REPL stuff. |
| 14:53 | kephale00 | Can anyone imagine complications with making the size of the fixed thread pool for agents tweakable? |
| 14:54 | stuartsierra | cemerick: On that note, I've been trying to think about what an interactive dev environment for Clojure would look like outside of an IDE. |
| 14:54 | stuartsierra | Maven alone isn't great for interactive development. |
| 14:54 | technomancy | we just had that discussion last night at seajure |
| 14:55 | stuartsierra | Oh, good, so you've solved it then? ;) |
| 14:55 | technomancy | apparently Steve Yegge is using Clojure for a cloud-y code indexing and support tool internally for Google |
| 14:55 | technomancy | well, not so much "outside an IDE" as a backend that's easy to support across environments |
| 14:55 | stuartsierra | Really??? |
| 14:55 | cemerick | stuartsierra: It's an interesting question, but a non sequitur for me. I don't know that I'd have much to add or usefully suggest. |
| 14:56 | stuartsierra | technomancy: yeah, that's what I mean |
| 14:56 | technomancy | stuartsierra: yeah, I was surprised he got away with it. apparently when you've been at Google for six years you get some leverage. |
| 14:56 | stuartsierra | Classloader wrangling, thread management, reloading, introspection, … |
| 14:57 | cemerick | oh, I thought you were talking about UX stuff. |
| 14:57 | livingston | the really nice thing about mvn is if you are working in a mixed clojure and java environment you can, for the most part, make things work. I get my repl, they don't have to figure out my goofy dependencies etc. |
| 14:58 | stuartsierra | cemerick: No, like technomancy said, I'm thinking of a backend that's accessible to anything, including a command-line UI. |
| 14:58 | stuartsierra | I played with Nailgun last year: https://github.com/stuartsierra/classpath-manager |
| 14:58 | livingston | what do you mean outside of an ide? oh you mean just the back end? |
| 14:58 | stuartsierra | yeah |
| 14:59 | stuartsierra | So I can interact with it from the command line, Emacs, a web browser, etc. |
| 14:59 | livingston | I'm pretty happy with swank and slime... |
| 14:59 | stuartsierra | me too, but I dream of more… :) |
| 14:59 | technomancy | doesn't seem to be any public data on Google Grok, but if you could be a fly on that wall... |
| 14:59 | livingston | web browser etc. - why would you want that pain? |
| 15:00 | stuartsierra | well, I'm not volunteering to write the web front-end, but app servers sometimes have admin interfaces, like Glassfish. |
| 15:01 | livingston | the only thing I miss about swank+slime and clojure is some of the debugging isn't quite at the same level as I had it with lisps (also I was able to use swank/slime with AllegroCL and still use their dialog for trace output - it was a comfortable setup) |
| 15:01 | stuartsierra | I'd love if I could get the same kind of Java class/method lookup in Emacs that Java IDEs have. |
| 15:02 | technomancy | that's like the one thing I still have to go to javadoc for |
| 15:02 | livingston | re glassfish: that seems like something with different goals than development. but maybe there are commonalities. |
| 15:02 | stuartsierra | Yeah, this is all just random thoughts, not a coherent plan. |
| 15:03 | livingston | I would be surprised if there isn't an emacs hook to get you to the javadocs? |
| 15:03 | stuartsierra | yes, there is. In Clojure, in fact. |
| 15:03 | cemerick | surely there's something like http://eclim.org/ for emacs? |
| 15:03 | livingston | the other bummer about slime and clj and maven is when you look up a function or something it will always whisk you away into the jar, instead of your local files - that sucks. |
| 15:04 | stuartsierra | Yeah, Maven's lifecycle model wasn't designed for interactive development in a dynamic language. |
| 15:05 | livingston | if there was a way to get it to load local some in dev mode that would be good. (I think there may be a way to do that with a system dependency and a profile, but I haven't hacked that yet) |
| 15:05 | cemerick | stuartsierra: maven shell / aether to the rescue? |
| 15:06 | livingston | well then if you can hook the java doc you can get the data you need for autocomplete (there are java modes for emacs too right?) or is the javadoc rendered as a webpage and not parsed. |
| 15:06 | stuartsierra | Maven shell. Interesting. Don't know that. |
| 15:06 | livingston | I don't know those projects either? |
| 15:10 | livingston | maybe those would help. really all I want it to be able to have maven be willing to provide a local (system?) location for a select set of libraries that I'm developing and not have to jar them and put them in the repository first and then get them from there. |
| 15:10 | cemerick | stuartsierra: it's just a persistent jvm that you can load/reload poms into and invoke goals / lifecycles with. |
| 15:10 | cemerick | Its presence gives me the same vibe as polyglot maven though (i.e. going nowhere), so I'm not betting anything on it. |
| 15:11 | stuartsierra | intriguing. Does it reload dependent JARs each time. |
| 15:11 | stuartsierra | ? |
| 15:11 | technomancy | sounds like sbt |
| 15:11 | cemerick | technomancy: yeah, same shtick. |
| 15:15 | markoman | would someone like to review and comment my first clojure study project on git? |
| 15:16 | mids | just share the url |
| 15:16 | markoman | code, principles, best practices, anything, id appreciate that before continuing on other project |
| 15:16 | markoman | https://github.com/mmstud/websesstudy |
| 15:18 | amalloy | markoman: holy cow, sudo lein deps? i'm not sure i can imagine a reason to recommend that ever |
| 15:19 | kephale00 | lol |
| 15:19 | _fogus_ | cemerick: Are you still thinking of putting together an authors' panel at Conj '11? |
| 15:19 | markoman | havent done harm on my machine yet ;) but good point, i constantly get problems to use lein because of directory or file permissions |
| 15:20 | livingston_ | anyone want to check my code, just sudo ... , yeah you almost got me there internet ... just kidding ;) |
| 15:20 | markoman | adds some frustration to the high pile already |
| 15:20 | redinger | _fogus_, cemerick: I've already got it listed as a proposal with my initial list of names. :) I'll flesh it out if Chas sends more info |
| 15:21 | amalloy | markoman: i've never had a problem with permissions using lein. do you have both lein and your project inside of ~? |
| 15:22 | markoman | project is inside home dir on my mac, lein is on /bin |
| 15:22 | cemerick | _fogus_, redinger: It was an idle idea. I'm not really sure what a proposal would look like though. |
| 15:22 | amalloy | markoman: i use a copy of lein in ~/bin/lein |
| 15:22 | cemerick | I suppose we could collect questions ahead of time, or have someone run around Donahue-style to take questions from the audience. |
| 15:23 | amalloy | if you put it in /bin it seems like eg lein self-install would fail because you don't have write perms |
| 15:23 | markoman | i dont haven even ~/bin dir here |
| 15:23 | amalloy | markoman: it's a good idea to create one and add it to your PATH |
| 15:24 | mids | markoman: in your defrouters I'd suggest a more REST behaviour, like using POST for routes with side effects |
| 15:24 | markoman | yeah, thats true. i should add bin to my home and put it on path probably working then better? |
| 15:24 | amalloy | *blink* didn't follow that sentence as a whole, but all the bits in it sound good |
| 15:25 | markoman | sorry, clumsy finglish |
| 15:25 | amalloy | technomancy: do you recommend for/against installing lein in /(user/)bin? |
| 15:26 | mids | markoman: also, how does your session/flash stuff different from what sandbar offers? |
| 15:26 | mids | https://github.com/brentonashworth/sandbar |
| 15:27 | markoman | mids, I looked sandbar but I couldnt follow its code by every part, it looked complicated to me, lol |
| 15:27 | mids | markoman: fair enough, it probably is :) |
| 15:27 | markoman | but yes, it overlaps with my other project too, forms, but its not same anyway |
| 15:32 | technomancy | amalloy: it's fine. keeping self-installs somewhere other than ~/.lein is something that might need some thought, but so far I've left that to the packagers. |
| 15:32 | markoman | mids: do you mean I should use POST for setting session value and adding a task? or maybe PUT or what do you mean with "more REST" ? |
| 15:33 | ataggart | Anyone here have the power to alter fields on Jira tickets? |
| 15:34 | stuartsierra | such as? |
| 15:34 | amalloy | markoman: GET requests shouldn't have side effects |
| 15:34 | steven | (it was pretty much just a s/clojure/lava/g, yeah) |
| 15:35 | ataggart | stuartsierra: For some reason the only thing I can do on tickets is manage comments and attachments. There are a few tickets that need to be marked ready for test, but alas I don't seem to be able to do that. |
| 15:35 | cemerick | steven: why, but why is the only real question… |
| 15:36 | stuartsierra | ataggart: Ask on the dev list for your account to be upgraded. |
| 15:36 | steven | cuz its a cooler name |
| 15:36 | markoman | amalloy: they still need to output something, but I think I got you. but to keep example simple, is there other way to do it than POST forms? it makes thing unnecessary complicated on this case, but real app, yes I agree |
| 15:36 | steven | closure is something your girlfriend wants after you break up |
| 15:36 | cemerick | Well, I'm convinced. |
| 15:36 | devn | Will the reader puke on ##(symbol "$foo.bar")? I know it's ill-advised, but *how* ill-advised is it? |
| 15:36 | sexpbot | ⟹ $foo.bar |
| 15:36 | steven | lava levels cities and gets immediate results |
| 15:36 | stuartsierra | If only it weren't for the darned Los Angeles Venture Association home page... |
| 15:37 | ataggart | stuartsierra: I wrote to Aaron, he said I should be able to modify tickets. |
| 15:38 | ataggart | oh well |
| 15:38 | stuartsierra | sorry, I don't know much about JIRA |
| 15:38 | ataggart | yeah, I was hoping someone here was able to do what I can't, and would be kind enough to modify them for me. |
| 15:39 | amalloy | session-bind is going out of its way to make its use of this atom not threadsafe |
| 15:40 | amalloy | you could write it as "(swap! *STORE* assoc sid session) session", or "(:session (swap! *STORE* assoc sid session))" |
| 15:41 | amalloy | but (swap! foo...) @foo is rarely right |
| 15:44 | markoman | hmh.. im not sure if I understand |
| 15:44 | amalloy | markoman: do you intend for session-bind to always return the session the user passes in? |
| 15:46 | markoman | yes, sid is mandatory there so it will be empty map or map having session data for user. thats what its meant for |
| 15:47 | amalloy | i think you answered a question different from what i asked. you have session-bind doing a swap, and then returning (get m the-key-you-just-set). do you want that to always return the value the user supplied? |
| 15:50 | technomancy | ,(reduce (partial merge-with concat) (for [i (range 1878) ] {:a []})) |
| 15:50 | clojurebot | #<ExecutionException java.util.concurrent.ExecutionException: java.lang.StackOverflowError> |
| 15:52 | amalloy | technomancy: (concat (concat (concat (concat....)))) all gets realized at once |
| 15:53 | markoman | hmh... I just want *STORE* to keep all users session data. session-bind is used by session-set and get primarily. |
| 15:54 | amalloy | you're missing the point. imagine two threads both want to change the session data at once, to two different values: it's possible they both swap before either returns, and then they both return the newest value; the guy who set it first gets silently overwritten |
| 15:54 | markoman | i think i choose doing swap every time to simplify process so that i dont need to have set, get, save, update, delete functionaility for the session-bind |
| 15:55 | markoman | ouh |
| 15:55 | technomancy | yeah, something is lazy even coming out of reduce. interesting. |
| 15:56 | raek | ,(reduce (partial merge-with (comp doall concat)) (for [i (range 1878) ] {:a []})) |
| 15:56 | clojurebot | {:a ()} |
| 15:57 | raek | this avoids a cascade of forcings |
| 15:58 | markoman | amalloy: i think I got some of what you meant. Im about to use code on google app engine at the end, I guess there is no thread problem or am I wrong? |
| 15:58 | amalloy | markoman: in practice there's unlikely to be |
| 15:59 | amalloy | but it's crazy to introduce this sort of race condition when the code would be *simpler* if you didn't introduce it |
| 15:59 | markoman | but you suggested some change, could it work on threaded environment better then? |
| 16:00 | amalloy | &(let [a (atom {}] (:name (swap! a assoc :name "test"))) |
| 16:00 | sexpbot | java.lang.IllegalArgumentException: let requires an even number of forms in binding vector |
| 16:00 | markoman | yeah, Im not used to think threads from PHP side |
| 16:00 | amalloy | &(let [a (atom {})] (:name (swap! a assoc :name "test"))) |
| 16:00 | sexpbot | ⟹ "test" |
| 16:00 | amalloy | here, instead of deref-ing the atom again once you're done swapping, you take advantage of the fact that swap! returns the new value |
| 16:01 | amalloy | or since you *know* what the key will be, you could just ##(let [name "test" a (atom {})] (swap! a assoc :name name) name) |
| 16:01 | sexpbot | ⟹ "test" |
| 16:04 | markoman | amalloy: sounds interesting and certainly I need to test these things more. can you advice how could I test session behaviour if its working with threads at the end? |
| 16:05 | amalloy | not really. i don't do any webdev in clojure, really |
| 16:07 | markoman | so could we say, my session-bind is not thread safe at the moment? :) |
| 16:13 | amalloy | it's hard to say for sure because you refuse to clarify what you expect it to return :P |
| 16:16 | markoman | user session data |
| 16:17 | ssideris | hello |
| 16:17 | ssideris | ,(str (drop 1 [5 6 7])) |
| 16:17 | clojurebot | "clojure.lang.LazySeq@482" |
| 16:18 | ssideris | how could I get "[6 7]" instead? |
| 16:18 | raek | ssideris: use pr-str |
| 16:18 | ssideris | ah, thanks |
| 16:18 | raek | ,(pr-str (drop 1 [5 6 7])) |
| 16:18 | clojurebot | "(6 7)" |
| 16:18 | amalloy | apply str |
| 16:18 | amalloy | oh nm |
| 16:19 | markoman | i cant say it simpler way. it should return only the user related session data. not all sessions or not only some particular data on user session, but all for user |
| 16:22 | markoman | and it should return it on form of map, not atom. and of course, it should work on all possible situation without deleting or missing data, when several users are getting their session data from same store |
| 16:22 | clojurebot | http://groups.google.com/group/clojure/msg/fd0371eb7238e933 |
| 16:23 | markoman | I think I recall now my problem on this case, I didnt really know, how to update certain part of the atom |
| 16:24 | amalloy | lol thanks for the years-old discussion about atoms, clojurebot |
| 16:25 | markoman | if atom has a map {sid1 {} sid2 {}} how can i update only sid2 {} maybe link tells it :) |
| 16:26 | amalloy | &(let [a (atom {:a {} :b {}})] (swap! a update-in [:b] assoc :data 10)) |
| 16:26 | sexpbot | ⟹ {:a {}, :b {:data 10}} |
| 16:26 | trptcolin | the fn that atom! takes as an arg can look at the current atom and do whatever it wants with it |
| 16:27 | raek | markoman: (swap! a update-in [sid2] <your update function here>) |
| 16:27 | trptcolin | s/current atom/current value of the atom/ |
| 16:27 | sexpbot | <trptcolin> the fn that atom! takes as an arg can look at the current value of the atom and do whatever it wants with it |
| 16:28 | markoman | amalloy, so I think that would be much better way on session-bind and it should cut out the race condition |
| 16:40 | markoman | :b should be updated with any kind of data, not just one key value pair but :b {:data 10 :tasks [1 2 3]} |
| 16:41 | markoman | what kind of update function can do that? |
| 16:41 | markoman | i guess not assoc? |
| 16:43 | raek | markoman: you want to update something for a certain session and something common to all sessions? |
| 16:43 | markoman | something for certain session |
| 16:44 | raek | can you give an example of how the map should look like before and after? |
| 16:47 | ataggart | markoman: you probably want update-in |
| 16:47 | markoman | sure: before {:sid "35bcf8b4"} after {:sid "35bcf8b4" :flash "message" :count 2 :tasks ["task 1" "task 2"]} |
| 16:48 | ataggart | ,(assoc {:sid "35bcf8b4"} :flash "message" :count 2 :tasks ["task 1" "task 2"]) |
| 16:48 | clojurebot | {:tasks ["task 1" "task 2"], :count 2, :flash "message", :sid "35bcf8b4"} |
| 16:48 | markoman | even flash count and tasks are updated one by one, on each request they are retrieved all by one |
| 16:50 | markoman | ah ok , you can just put them all in row |
| 16:52 | ataggart | ,(doc assoc) |
| 16:52 | clojurebot | "([map key val] [map key val & kvs]); assoc[iate]. When applied to a map, returns a new map of the same (hashed/sorted) type, that contains the mapping of key(s) to val(s). When applied to a vector, returns a new vector that contains val at index. Note - index must be <= (count vector)." |
| 17:01 | markoman | i see, now i realize what & kvs means |
| 17:05 | currentB | is there a somewhat clean way to produce an original, quoted form which defines a function from that function object itself? |
| 17:06 | currentB | in otherwords, I have a function object defined with (fn [x] (+ x 1)), is there a way I can get access to that form in a program? |
| 17:07 | amalloy | no |
| 17:07 | currentB | k, thanks |
| 17:07 | amalloy | you could ask technomancy about his print-dup-able fn, though, if it excites you |
| 17:09 | technomancy | clojurebot: google serializable-fn |
| 17:09 | clojurebot | First, out of 6370 results is: |
| 17:09 | clojurebot | technomancy/serializable-fn - GitHub |
| 17:09 | clojurebot | https://github.com/technomancy/serializable-fn |
| 17:09 | technomancy | ~botsnack |
| 17:09 | clojurebot | thanks; that was delicious. (nom nom nom) |
| 17:11 | amalloy | technomancy: i can never remember what the dang thing is called, so it's hard to google for. last time i searched for technomancy (or maybe hagelberg?) on the mailing list and filtered manually :P |
| 17:11 | technomancy | it's on Seajure's github too |
| 17:15 | fliebel | technomancy: What is that save-env doing? |
| 17:17 | amalloy | fliebel: capturing closed-around values |
| 17:19 | devn | Hey all -- I'm trying to add metadata on a def generated by a defmacro |
| 17:19 | devn | here's a code sample... |
| 17:20 | devn | (defmacro deftemplate [name & forms] `(def (with-meta ~name {:soy true} ) ~(deftemplate-helper forms))) |
| 17:20 | amalloy | devn: move the ~ outside of with-meta |
| 17:21 | fliebel | amalloy: Are these &env and &form some special values? |
| 17:21 | amalloy | fliebel: macros all get them |
| 17:21 | markoman | hillarious bots you have here |
| 17:21 | amalloy | as of, what, 1.2 i think? |
| 17:22 | Raynes | We have the most awesome bots ever. |
| 17:23 | amalloy | clojurebot: show markoman how well you speak languages nobody else does |
| 17:23 | clojurebot | please show us that ugt is not broken |
| 17:23 | amalloy | aw |
| 17:23 | amalloy | ~maybe like this? |
| 17:23 | clojurebot | Gabh mo leithscéal? |
| 17:24 | markoman | :D |
| 17:25 | markoman | maybe one day she can interpret my english to you |
| 17:26 | fliebel | amalloy: Where is v defined? I see val, but not v. |
| 17:27 | amalloy | fliebel: what? plz context, what code are you talking about |
| 17:27 | fliebel | the printable function |
| 17:28 | amalloy | it looks like it's .v, a member function. i haven't looked into how &env actually works |
| 17:29 | markoman | i was planning new app with lein yesterday, formjure but jury told *jure ends are not available anymore. so i figured it went really bad at some point, lol |
| 17:31 | livingston | due to an oddity of the rdf spec strings can have a language tag associated with them, for example @en for English. I would really like to just stash that in meta data but no meta data on strings... |
| 17:31 | Raynes | Didn't leiningen remove that restriction a while back? |
| 17:32 | livingston | any good suggestions? a structure that has a string and a tag seems annoying because I'd like it to generally behave like a String |
| 17:35 | raek | what does the spec say about strings with different languages and equality? |
| 17:36 | livingston | they are explicitly non-equal (although there is an operator to just get their string guts, which you could compare) |
| 17:37 | markoman | Raynes, version 5 i have still have it |
| 17:37 | livingston | also the absence of a tag is not wild card so "foo" != "foo"@en |
| 17:37 | raek | metadata does not affect equality, so that could be an argument against coding it as metadata of some sort |
| 17:38 | raek | one obvious way could be to represent them as ["foo" :en] or [:en "foo"] (with nil as no language) |
| 17:39 | raek | since the language tag is really a part of the string data, I'm inclined to be explicit about it |
| 17:40 | raek | another way could be to skip the vector if there is no language tag. that would force the functions that use them to have cases for both, though |
| 17:40 | livingston | raek: that's not awful, but I'd kinda like them to behave like strings out of the box as much as possible. I guess I could accommodate "foo" and ["foo" :en] |
| 17:42 | raek | this does not inhibit you from "massaging" input to the program, e.g. by normalizing "foo" to ["foo" nil] |
| 17:42 | livingston | right |
| 17:42 | raek | but I feel that allowing both as the internal representation only complicates matters |
| 17:43 | raek | ...and vice versa for prettyprinting output |
| 17:44 | livingston | my use case (and what I assume is the most average use case) is that people have data in their language and data with no language tag and that's all they use, so for the most part it's a flag that sometimes caused inequality for no good reason (because there's no way to say just treat the default and mine (e.g., @en) as the same) |
| 17:46 | raek | heh, this reminds me of the name of the country Monaco and Munich, a German city |
| 17:46 | raek | in italian, the name of Munich is "Monaco" |
| 17:46 | markoman | how do you overline word(s) on .markdown language? |
| 17:48 | jweiss_ | i'm figuring out destructuring. but i also want to do some structuring :) as in, i have 5 keyword arguments, i want to return a nested map structure with only the keys that were passed in, in place in the structure. using literals doesn't work because i end up with all the keys, not just the ones passed in. |
| 17:48 | raek | ...so, "Monaco"@en and "Monaco"@it are quite different |
| 17:49 | jweiss_ | as in, given keys [a b c d e] return {:a a :b :b :c {:d d :e e:} } but leave out keys not provided |
| 17:50 | livingston | raek: yeah. that's I think what they are getting at. but really I think they should have probably just used different properties so instead of lable and the predicate it could be label-en or label-it that are subs of label etc. |
| 17:51 | raek | jweiss_: the thing you are describing sounds a bit like select-keys |
| 17:51 | ataggart | ,(select-keys {:a a :b :b {:d d :e e:} } [:a :b]) |
| 17:51 | clojurebot | Invalid token: e: |
| 17:51 | ataggart | bah, whatever |
| 17:51 | jweiss_ | yeah i gotcha, that is simple for a flat map, but gets ugly when it's nested |
| 17:52 | ataggart | back to trying to learn scala |
| 17:54 | raek | destructuring only helps you with extracting the pieces |
| 17:54 | jweiss_ | raek: yeah, i said i want to do structuring :) |
| 17:54 | jweiss_ | taking pieces and putting them into a structure |
| 17:54 | raek | oh, misread that... |
| 17:55 | martin_mcgovern | \msg nickserv help |
| 17:55 | livingston | jweiss_: so just use backquote and ~ |
| 17:55 | raek | is there a fixed number of nestings? |
| 17:55 | jweiss_ | raek, yes |
| 17:56 | jweiss_ | the structure is known, the real issue is how to leave out items not provided |
| 17:56 | raek | I would start with the inner one |
| 17:56 | raek | that should be a simple select-keys |
| 17:56 | jweiss_ | actually livingston 's idea makes sense |
| 17:57 | jweiss_ | sorta... can't figure out how i'd do it without a bunch of ifs everywhere |
| 17:57 | jweiss_ | but that's a start |
| 17:57 | livingston | I mean assuming it's a fixed transformation or is this for any old list? |
| 17:57 | raek | what would syntax-quote add? |
| 17:57 | raek | you can just have a map literal in your code |
| 17:57 | jweiss_ | raek but how to remove keys that weren't provided to my fn? |
| 17:58 | livingston | actually I think I got confused about the problem. |
| 17:58 | livingston | how does it know to make that nested hash? |
| 17:58 | raek | jweiss_: what key does the {:d d :e e:} value belong to? |
| 17:58 | jweiss_ | raek: c |
| 17:59 | raek | oh, right. it's right there... |
| 17:59 | jweiss_ | so if i call (myfn :a 1 :b 2 :d 3), i want {a: 1 :b 2 :c {:d 3}} |
| 18:00 | livingston | so you have a hash of hashes ... and a list of keys and you only want the stuff that matches the keys wherever they are? |
| 18:00 | jweiss_ | yeah |
| 18:00 | raek | (fn [{:keys [a b c], :as outer-map}] (-> outer-map (select-keys [:a :b]) (assoc :c (select-keys c [:d :e])))) |
| 18:00 | livingston | in your example how does it get the :c ? and know to nest the :d ?? |
| 18:01 | jweiss_ | livingston that is what i'm trying to solve |
| 18:02 | raek | jweiss_: ^ that should work, assuming that the involved keys are fixed |
| 18:03 | jweiss_ | raek: ok thanks. do ou think there's a way to specify the literal, and transform it in a generic way to get what i want? |
| 18:03 | jweiss_ | i mean i know there is |
| 18:03 | jweiss_ | simple way :) |
| 18:04 | livingston | i still don't follow. if the input is just what's given, then I have to assume you want the first tow out and the rest in a nested hash... then yeah go with something like raek said or just cons it together yourself if you know what the structure is. I either missed something or this is too abstract |
| 18:05 | jweiss_ | livingston: i have multiple functions that do similar things, different structures |
| 18:05 | jweiss_ | so i'm looking for something more generic |
| 18:05 | jweiss_ | sorry one of you asked me that earlier and i gave a misleading answer |
| 18:06 | raek | it is possible with a macro |
| 18:07 | jweiss_ | ah well, i was hoping i was missing a straightforward solution. i'll take your suggestions and see what i can do - thanks! |
| 18:07 | raek | so you want something that takes something like {:a _, :b _, :c {:d _, :e _}} and turns it into the code above? |
| 18:08 | jweiss_ | raek: yeah, something like that |
| 18:08 | raek | hrm, wait. you only need a macro if you need it to expand into a destructuring form |
| 18:08 | jweiss_ | i mean, destructuring already does what i want in that sense |
| 18:08 | jweiss_ | except it exposes that structure to my callers, which i don't want to do |
| 18:08 | raek | but you should still be able to solve the problem with a function |
| 18:08 | livingston | if it's only 2 or 3 specific keys going to something: `(:a ~(get input :a) ... or create your list with the things your wanted substitued a template and recursively substitue in use your input hash keys/vals as the things to replace |
| 18:09 | raek | (although, in that case, you'd use a bunch of gets instead of destructuring) |
| 18:09 | jweiss_ | ok |
| 18:09 | livingston | ok what raek said is now something else... you need to make up your mind ;) |
| 18:10 | jweiss_ | sorry i am not sure what raek meant by "the code above" |
| 18:10 | raek | oh, the (fn ...) I wrote... |
| 18:11 | jweiss_ | i want a fn that takes the template {:a _, :b _, :c {:d _, |
| 18:11 | jweiss_ | :e _}} and a flat map with possible keys :a :b :d :e and builds the map |
| 18:11 | jweiss_ | by replacing _ with the value and leaving out what was not provided |
| 18:12 | jweiss_ | oh sorry raek then that isn't what i wanted |
| 18:12 | raek | in addition, destructuring is syntactic sugar for humans. if you need to automate stuff at runtime, it might not be that useful |
| 18:13 | jweiss_ | it seems like what i want is pretty common |
| 18:13 | jweiss_ | maybe not |
| 18:13 | jweiss_ | just a list of optional fn args, and i want to stick them in a datastructure |
| 18:13 | jweiss_ | the only thing is i don't want nils where keys were left out |
| 18:14 | jweiss_ | i could traverse and remove nils, but that makes nil the "magic" value |
| 18:14 | jweiss_ | and won't distinguish if a real nil was passed in. |
| 18:15 | livingston | make a macro (key-and-val input :a) then have that macro look up :a in the input if it's there return (:a (get input :a)) if it's not return nil |
| 18:16 | livingston | then syntax quote your structure and call that macro where you need it with the stitch in command ~@ |
| 18:17 | markoman | amalloy: so i changed session-bind to return session argument without using get. tests didnt fail so it should be ok. thanks for your input |
| 18:17 | livingston | jweiss_: that's the simplest thing that could possibly work that's quick to code |
| 18:18 | jweiss_ | livingston: not seeing how my syntax quoted structure won't have nils in it. |
| 18:19 | livingston | jweiss_: that's why you splice it in with ~@ |
| 18:19 | livingston | actually if it's not there you need to return '() from the macro probably (not nil, sorry, I still think in lisp) |
| 18:25 | amalloy | livingston: there's nothing wrong with quoting it for clarity, but i'd like to make sure you know that you don't need to quote the empty list: ##() |
| 18:25 | sexpbot | ⟹ () |
| 18:25 | clizzin | are there any clojure libs for bundling AMIs on EC2? |
| 18:26 | livingston | jweiss_: so you would do `{~@(kv i :a) ~@(kv i :b) :c {~@(kv i :d) ...} where kv takes a hash and a key either returns '() or (list key (get input key)) |
| 18:26 | livingston | amalloy: ah thanks. (like I said, *still thinks in lisp*) |
| 18:26 | amalloy | indeed |
| 18:26 | livingston | CL that is |
| 18:27 | amalloy | livingston: i showed up last night after you were asking about inspecting clojure .class files. have you used javap? |
| 18:27 | livingston | no |
| 18:27 | jweiss_ | cool, thanks |
| 18:28 | TimMc | amalloy: I should try running a Java disassembler on a clojure class file. :-) |
| 18:28 | livingston | last time I seriously programmed java my second edition java in a nutshell was current (enough) |
| 18:28 | amalloy | https://gist.github.com/295631 |
| 18:28 | livingston | does it ship with the jdk |
| 18:28 | amalloy | yes |
| 18:29 | livingston | super cool that would have been useful and exactly what I needed |
| 18:29 | amalloy | heh |
| 18:29 | amalloy | but too late? |
| 18:30 | livingston | I wanted to look at exactly what clj was compiling as an interface definition |
| 18:31 | livingston | I was able to see enough with less, then I just called import on the .class file in my repl then show, that did the trick too |
| 18:31 | amalloy | livingston: yeah, show is handy |
| 18:31 | livingston | I call it constantly |
| 18:31 | amalloy | javap has options to show you the debugger symbols, like locals and line numbers |
| 18:32 | amalloy | well. maybe not line numbers. but assembly code, anyway |
| 18:32 | TimMc | Does the JVM have an assembler? |
| 18:33 | TimMc | Is that how JVM compilers work? |
| 18:33 | TimMc | I think I'll write my next program in bytecode. :-P |
| 18:33 | amalloy | TimMc: there's not an assembler that's easy to get access to |
| 18:33 | amalloy | but the clojure.asm package outputs jvm bytecode and then runs it through some library to generate classes from it |
| 18:34 | livingston | TimMc: byte code. the jvm takes it from there. (as far as I understand) |
| 18:34 | raek | clojure uses the ASM (yes, that's its name) library http://asm.ow2.org/ |
| 18:35 | raek | there's some assemblers out there. I have tried Jasmin a little |
| 18:35 | raek | though, there doesn't seem be any standardized assembly syntax for the jvm |
| 18:36 | TimMc | Curious. |
| 18:36 | raek | so in clojure's case, the code goes directly from AST to .class-file |
| 18:39 | raek | I really recommend to try to write a class with a JVM assembler and call the code from clojure... |
| 18:39 | raek | it's an interesting experience |
| 18:47 | TimMc | You recommend this? |
| 18:51 | livingston | that's like when someone says, "this tastes awful. see, you try." |
| 19:06 | livingston | so deftype/record examples show the function definitions being "in-lined" right into the deftype macro, is there any advantage / disadvantage to pointing at some other function? |
| 19:07 | livingston | if it's a big protocol it seems like this could be a bit messy? |
| 19:08 | amalloy | livingston: reuse existing functions that are useful for multiple protocols. define protocol functions as (comp inc +) instead of explicit (fn) forms |
| 19:09 | livingston | I'm not quite following the (comp int +) bit? |
| 19:16 | amalloy | livingston: you could implement a protocol function by composing together existing functions |
| 19:17 | amalloy | (extend String Splittable {:split (juxt first rest)}) |
| 19:19 | livingston | I was just wondering about (defrecord Foo [bar] Splittable (split [x] (my-split x))) seems a little redundant. |
| 19:49 | hiredman | ~search for reduce |
| 19:49 | clojurebot | <#clojure:raek> ,(reduce (partial merge-with (comp doall concat)) (for [i (range 1878) ] {:a []})) |
| 19:49 | clojurebot | <#clojure:technomancy> yeah, something is lazy even coming out of reduce. interesting. |
| 19:49 | clojurebot | <#clojure:technomancy> ,(reduce (partial merge-with concat) (for [i (range 1878) ] {:a []})) |
| 19:49 | clojurebot | <#clojure:fliebel> mec: Very nice. Now say I want to *update* and not assoc. If it's more than one line, I wrote something that does this already using reduce. |
| 21:34 | livingston | so I have a root set of functionality and an extension (or two), I have them as two separate protocols, but if I pass objects of these types out to java users they are going to have to constantly cast between the types if they want to use functions in the core with functions in the extension, right? |
| 21:38 | danbell | Does anyone know of a clojure/tomcat tutorial? |
| 21:46 | ignacio | @danbell: http://stackoverflow.com/questions/1464071/clojure-web-application-where-do-i-start? |
| 21:54 | danbell | ignacio---thanks |
| 21:55 | danbell | eventually found a link chain |
| 22:12 | dnolen | livingston: hmm I'm beginning to think exposing deftype and defrecord to Java users might not be such a hot idea. They aren't meant to be higher-level then what Java can provide. |
| 22:12 | dnolen | s/aren't/are |
| 22:12 | sexpbot | <dnolen> livingston: hmm I'm beginning to think exposing deftype and defrecord to Java users might not be such a hot idea. They are meant to be higher-level then what Java can provide. |
| 22:13 | livingston | dnolen: ? higher level |
| 22:13 | livingston | oh |
| 22:13 | dnolen | livingston: defrecord specifically has a bunch of magic so that Clojure code doesn't need type hints. Java user don't have any such luck. |
| 22:13 | dnolen | er, I mean protocols. |
| 22:13 | livingston | it can't be that unintended defprotocol automatically generated a java interface to go with it. |
| 22:14 | dnolen | livingston: I think that's a hosty implementation detail. |
| 22:14 | livingston | what else should I do, create POJOs instead |
| 22:15 | dnolen | livingston: pre deftype/record/protocols, to expose Clojure goodness to Java people used genclass. |
| 22:19 | livingston | from clojure.org/datatypes "While datatypes and protocols have well-defined relationships with host constructs, and make for a great way to expose Clojure functionality to Java programs, they are not primarily interop constructs" |
| 22:20 | livingston | also: "If you use datatypes and protocols you will have a clean, interface-based API to offer your Java consumers. If you are dealing with a clean, interface-based Java API, datatypes and protocols can be used to interoperate with and extend it. If you have a 'bad' Java API, you will have to use gen-class. " |
| 22:21 | livingston | none of the documentation says how java users are supposed to deal with typecasting though |
| 22:21 | dnolen | livingston: hmm, I guess I fail to see how that's true. Since protocols have untyped arguments (except for the first arg). |
| 22:22 | livingston | the args aren't the problem. java users can shove anything in and it'll just pass as Object. it's really the return values that are going to be the most trouble |
| 22:25 | livingston | at least I would think ... I'm not the biggest java programmer. |
| 22:25 | dnolen | livingston: well if you're record implements two protocols I don't think users will need to do any casting. Not sure about return values. |
| 22:27 | livingston | dnolen: they will if they code to the interface(s) and not the concrete type right? |
| 22:28 | livingston | consider iA iB sets of functions, and implementations X and Y that do iA and iB differently. if they just care about A/B functionality and want to abstract themselves from X and Y |
| 22:30 | dnolen | livingston: yeah but that's true of Java too right? |
| 22:31 | livingston | presumably, I supposed. I just wanted to make sure I wasn't missing something to make it easier or whatever. |
| 22:50 | livingston | if I have a standard let type vector [a 3 b 4] what's the best way to pull the variables out? |
| 22:52 | pdk | what do you mean by pull them out |
| 22:53 | pdk | pass them to code outside the let block? |
| 22:53 | livingston | just get them in a list or something I just want'ed '(a b) |
| 22:53 | pdk | [a b] then? |
| 22:53 | pdk | remember let returns the value of the last thing in its body |
| 22:53 | livingston | any sequence is fine |
| 22:54 | livingston | no sorry that was misleading to say let, I just ment a vector like that (pairs of things) and I want the "keys" |
| 22:56 | pdk | can you clarify on keys here |
| 22:56 | sattvik | ,(keys (apply assoc {} [:a 1 :b 2])) |
| 22:56 | clojurebot | (:b :a) |
| 22:56 | pdk | you want to grab items 0 2 4 etc out of a list? |
| 22:56 | amalloy | livingston: ##(take-nth 2 '[a 1 b 2]) |
| 22:56 | sexpbot | ⟹ (a b) |
| 22:56 | livingston | that's what I was looking for, thanks amalloy |
| 22:57 | livingston | sorry for the confusion everyone. |
| 22:57 | livingston | there's always an easy way to do that but I can never remember |
| 22:57 | clojurebot | Pardon? |
| 23:04 | livingston | is this the best way to combine two vectors and get one out? (vec (concat '[a b] '[3 4])) |
| 23:06 | amalloy | livingston: ##(into '[a b] [3 4]) is better if you're sure that (at least) the first one is a vector, but these are all linear-time; concatenating vectors is difficult to do at the source level because it's not performant |
| 23:06 | sexpbot | ⟹ [a b 3 4] |
| 23:07 | livingston | cool. they are short and they are in macros ... so they can be slow (er) |
| 23:29 | livingston | can anyone tell me why this isn't working: https://gist.github.com/911074 |
| 23:33 | amalloy | livingston: i can't really look in detail, but (~args ~@special-args) looks suspicious |
| 23:34 | amalloy | as does (~(vec ...)) |
| 23:35 | livingston | argh I'm an idiot... there's an extra paren in (concat (special-vars args)) .. should be (concat special-var args) and I'm good |
| 23:36 | livingston | basically I want to make a function that if you call with out the special args it just gives you defaults, but if you call with new values for the special args, it needs to bind them too, so that downstream calls will get them too |
| 23:38 | amalloy | livingston: would it do any harm to bind the specials when you use the default? |
| 23:38 | livingston | no |
| 23:39 | amalloy | you might be able to use ##(doc fnil) then |
| 23:39 | sexpbot | ⟹ "([f x] [f x y] [f x y z]); Takes a function f, and returns a function that calls f, replacing a nil first argument to f with the supplied value x. Higher arity versions can replace arguments in the second and third positions (y, z). Note that the function f can take... http://gist.github.com/911078 |
| 23:39 | livingston | but if they are getting called with any frequency or depth it seems like a lot of bindings to stack up. |
| 23:42 | livingston | oh that's a little weird, no I want something more like partial I think |
| 23:43 | amalloy | mkay |
| 23:43 | livingston | it's the first arg that I'm binding with a special (global) var. so if the user doesn't care (or know the first arg) they get the default (and they call it with one less arg) |
| 23:48 | joshua__ | Hmm. I'm doing a commit in my local git repository and it isn't making it origin/master etc. When I try to push the changes it says everything is up to date. I don't get it. |
| 23:52 | amalloy | joshua__: you probably haven't done a git add. what's git status show? |
| 23:52 | joshua__ | amalloy, It says nothing to commit. |
| 23:53 | amalloy | joshua__: and git log shows the commit you want to push? in that case git push origin master should work |
| 23:56 | joshua__ | amalloy, Says "Everything is up to date." Doesn't push my commit. |
| 23:56 | joshua__ | amalloy, Thus, the confusion. |
| 23:57 | amalloy | joshua__: you can ask in #git. if the branch you're on locally is master, and your log shows the commits you want to push, then i don't know the right questions to ask :P |