2011-05-03
| 02:53 | matthias__ | there's a java method that expects "Trigger..." and i want to pass it two new instances of classes that implement trigger. (keytrigger and mousebuttontrigger). how do i do that? |
| 02:54 | matthias__ | i had to use (into-array (...stuff that makes a new keytrigger...)) before |
| 02:56 | clgv | matthias__: do you ask for the implementing part? |
| 02:56 | clgv | matthias__: if so, you can do it via proxy, see http://clojure.org/java_interop#Java%20Interop-Implementing%20Interfaces%20and%20Extending%20Classes |
| 02:57 | clgv | matthias_: you might also implement it via defrecord, deftype or reify |
| 02:57 | matthias__ | no, they are already implemented |
| 02:57 | matthias__ | im just making new instances of keytrigger and mousebuttontrigger |
| 02:58 | clgv | for example? |
| 02:59 | matthias__ | hmm, here's some of my code |
| 02:59 | matthias__ | (.addMapping "Pause" (into-array [(KeyTrigger. KeyInput/KEY_P)])) |
| 02:59 | matthias__ | (.addMapping "Left" (into-array [(KeyTrigger. KeyInput/KEY_J)])) |
| 02:59 | matthias__ | (.addMapping "Right" (into-array [(KeyTrigger. KeyInput/KEY_K)])) |
| 02:59 | matthias__ | (.addMapping "Rotate" (into-array ^Trigger [(cast ^Trigger (KeyTrigger. KeyInput/KEY_SPACE)) |
| 02:59 | matthias__ | (cast ^Trigger (MouseButtonTrigger. MouseInput/BUTTON_LEFT))])) |
| 02:59 | matthias__ | (im just trying to get it to work, so its probably nonsense) |
| 03:00 | matthias__ | the first three work |
| 03:00 | amalloy | matthias__: the type hint on the fourth is nonsense |
| 03:00 | amalloy | drop the ^ and you'll be fine |
| 03:00 | amalloy | &(into-array Object ["string" 'symbol]) |
| 03:00 | sexpbot | ⟹ #<Object[] [Ljava.lang.Object;@1b15d6a> |
| 03:01 | amalloy | &(into-array ^Object ["string" 'symbol]) |
| 03:01 | sexpbot | java.lang.IllegalArgumentException: array element type mismatch |
| 03:01 | matthias__ | oh |
| 03:01 | matthias__ | i thought that's how you used types in clojure :S |
| 03:01 | matthias__ | thanks |
| 03:02 | clgv | amalloy: is cast really necessary or just to get a fail-fast behavior? |
| 03:02 | amalloy | matthias__: Object is a symbol which maps to java's Object.class |
| 03:02 | amalloy | clgv: not the latter, i hope, since i don't think it does that |
| 03:02 | amalloy | ~source cast |
| 03:03 | clgv | amalloy: it throw an exception if the type does not match - that was what I meant with "fail-fast" ;) |
| 03:03 | amalloy | oh, i had it backwards |
| 03:03 | amalloy | tbh the cast expression always confuses me |
| 03:03 | matthias__ | cast wasnt necessary. just something i tried randomly which didnt help |
| 03:04 | amalloy | anyway it's not necessary for him, for functionality or for fail-fast-ness. if you put something that's not a Trigger into a Trigger[] it bombs out |
| 03:04 | clgv | lol the code does indeed. java has a method called "cast"? or is it a special symbol from clojure? |
| 03:04 | clgv | amalloy: ok thats what I thought as well ;) |
| 03:05 | amalloy | clgv: java has one |
| 03:05 | clgv | amalloy: I only knew the operator |
| 03:05 | amalloy | clgv: java has a whole raft of reflection stuff |
| 03:06 | amalloy | &(let [the-class String the-obj 'a-symbol] (.cast the-Class the-obj)) |
| 03:06 | sexpbot | java.lang.Exception: Unable to resolve symbol: the-Class in this context |
| 03:06 | clgv | ah. you are right. it's called on the class and not the object. now it does make sense |
| 03:06 | amalloy | &(let [the-class String the-obj 'a-symbol] (.cast the-class the-obj)) |
| 03:06 | sexpbot | java.lang.ClassCastException: Cannot cast clojure.lang.Symbol to java.lang.String |
| 03:17 | matthias__ | soo... how do i access the fields of a java class? i'm within one if its methods. there's a field called speed in that class. there is no getSpeed method |
| 03:18 | amalloy | it's a long shot, but have you tried (.speed the-object)? also, i don't understand what you mean by "i'm within one of its methods" |
| 03:23 | matthias__ | well, turns out im actually not ;) |
| 03:24 | matthias__ | i'm trying to translate thise java code http://jmonkeyengine.org/wiki/doku.php/jme3:beginner:hello_input_system to clojure. and there are two anonymous classes made, one of them uses speed in onAnalog which is a field of simpleapplication |
| 03:24 | matthias__ | i just used (def bla (proxy.....)) to make those listeners |
| 03:25 | matthias__ | now i dont know how to access speed |
| 03:31 | amalloy | augh |
| 03:32 | amalloy | do not attempt a literal translation from java. you'll only bring pain to yourself and everyone around you |
| 03:35 | amalloy | anyway, judging from the quality of HelloInput, i imagine SimpleApplication.speed is protected, in which case you can't access them from a proxy |
| 03:35 | amalloy | but it should be possible from a reify? i'm not sure, i don't deal with this nonsense |
| 03:38 | raek | ,(doc proxy) |
| 03:38 | clojurebot | "([class-and-interfaces args & fs]); class-and-interfaces - a vector of class names args - a (possibly empty) vector of arguments to the superclass constructor. f => (name [params*] body) or (name ([params*] body) ([params+] body) ...) Expands to code which creates a instance of a proxy class that implements the named class/interface(s) by calling the supplied fns. A single class, if provided, mus... |
| 03:38 | amalloy | raek: http://gist.github.com/952956 |
| 03:39 | raek | matthias__: I found this thread and it seems that it is not possible from clojure using proxy: http://groups.google.com/group/clojure/browse_thread/thread/41f52d8eec812b04 |
| 03:40 | raek | "As it says in the docs for proxy, you can't access protected members |
| 03:40 | raek | from a proxy. " |
| 03:40 | raek | "You best bet is to create a stub class in Java that derives from SimpleGame and exposes any protected members you want to access via public methods. Then in Clojure proxy that stub." |
| 03:41 | raek | seems to be a limitation of the proxy feature in java |
| 03:43 | raek | matthias__: with leiningen, it's quite simple to have java source code in the project. just add :java-source-path "src" to the project.clj and do a lein javac to compile the java sources before you start |
| 04:14 | solar_sea | Hi. Can the reader be made to cache & reuse functions with equal definitions ? |
| 04:18 | solar_sea | From the repl executing (fn [_] nil) twice gives me two separate function objects, is there a ready-made functionality to cache them, to put my question otherwise :) |
| 04:23 | ejackson | solar_sea: (defn my-function [_] nil) will store that function in my-function |
| 04:23 | ejackson | its shorthand for (def my-function (fn [_] nil)) |
| 04:29 | solar_sea | ejackson: I know that, I was just thinking of dynamicaly defining functions on the fly and to reuse the ones already defined. |
| 04:30 | ejackson | ok |
| 04:30 | solar_sea | From what I understand with my limited clojure exposure, a macro can work here, comparing the form with some previously defined, returning the already defined one if it exists, or passing it to the compiler and caching it if it doesn't ? |
| 05:10 | julian37 | hi, I'm trying to find instructions on how to setup clojure in emacs. the ones I found are a few years old and I'm not sure they're applicable anymore. any pointers? |
| 05:10 | julian37 | fwiw I'm a clojure newbie but I know my way around emacs pretty well |
| 05:11 | julian37 | I'm after slime/swank setup specifically |
| 05:12 | raek | julian37: It's more simple nowadays. these instructions are up to date: http://dev.clojure.org/display/doc/Getting+Started+with+Emacs |
| 05:12 | julian37 | perfect, thanks raek! |
| 05:13 | raek | basically, the steps are 1) make sure you have package.el 2) make sure you use the Marmalade repo 3) install clojure-mode, slime and slime-repl using M-x package-list-packages |
| 05:13 | raek | and then you use swank-clojure in your leiningen or cake project |
| 05:15 | raek | julian37: I have recently updated these instructions, so I'm happy for any feedback (e.g. if something is not clear or does not work) |
| 05:17 | julian37 | raek: I'll let you know if I notice anything missing, thanks again |
| 05:22 | julian37 | raek: maybe the most important thing would be to get this page on the first page of google results for queries like "clojure emacs" or "clojure slime" |
| 05:23 | julian37 | I'm not much of an SEO guy so no idea really why it doesn't turn up. maybe putting the words "clojure" and "emacs" closer together in the title would help? |
| 05:23 | Fossi | waiting and getting linked helps |
| 05:24 | julian37 | right now the first result for "clojure emacs" is http://clojure.org/getting_started , maybe a link could be added to that page? |
| 05:35 | solar_sea | How can I call def with a dynamic name ? For example (defn mydef [name args] (def (symbol name) args)) says java.lang.Exception: First argument to def must be a Symbol (NO_SOURCE_FILE:0) |
| 05:38 | raek | solar_sea: can you explain what problem you are trying to solve with this? |
| 05:38 | raek | (def is a special form, that's why the first argument does not follow usual evaluation rules) |
| 05:40 | solar_sea | I'm trying to implemented something to cache function definitions-objects pairs, so (my-def f1 (fn [] nil) and (my-def f2 (fn [] nil)) - f1 an f2 will point to the same function object |
| 05:41 | solar_sea | so far I've come up with this: http://pastebin.com/dMQggELk but it's not exactly working yet |
| 05:42 | raek | so you're trying to extend the Clojure language with some caching functionality? |
| 05:43 | solar_sea | precisesly ;) |
| 05:43 | raek | if you are in control of the code, you could always do (let [f (fn [] nil)] ...) |
| 05:44 | raek | so how will this be used? |
| 05:44 | solar_sea | the code is going to be dynamically generated, from some written conditions/rules. I know I can cache the values there, but doing it on the clojure side seemed more interesting and more general :) |
| 05:45 | raek | solar_sea: my-def needs to be a macro if you want to override normal evaluation rules |
| 05:45 | solar_sea | just as it is in my code, a closure closing over a defmacro |
| 05:46 | raek | solar_sea: you need to deref the atom before you send it to contains? |
| 05:47 | raek | solar_sea: and I think you're confusing macro expand time and runtime |
| 05:48 | solar_sea | raek: thanks, the atom deref was the problem, it's working as intended now :D |
| 05:49 | solar_sea | hell, I didn't know that contains? is implemented over atoms .. |
| 05:55 | raek | fwiw, I would probably solve the problem something like this: |
| 05:55 | raek | analyze the rules and collect those that are unique |
| 05:55 | raek | give each unique rule a name using gensym and construct a map from rules to names of the unique rules |
| 05:56 | raek | and generate a defn for each unique rule |
| 05:56 | raek | generate the code that uses the rules and where a rule is referenced use the name of the unique rule instead |
| 05:56 | raek | as you probably can tell, I'm not much for "magic"... :-) |
| 05:58 | no_mind | how do I calculate the current timestamp in clojure ? |
| 05:59 | solar_sea | no_mind: (System/currentTimeMillis) |
| 05:59 | solar_sea | raek: yes, but I'm still euphoric about clojure's flexibility and I'm going to probably abuse it for some time :) |
| 06:13 | no_mind | how do I get today's date in dd/mm/yyyy format ? |
| 06:14 | ejackson | no_mind: check out the clj_time library in the getwoven repo on GitHub |
| 06:15 | ejackson | i think it has a (today) or (now) |
| 06:15 | fliebel | ejackson: Is that the Yoda wrapper? |
| 06:15 | ejackson | yeah |
| 06:25 | no_mind | ejackson: clj-time has formatters for date tiem but ot generators |
| 06:25 | ejackson | no_mind: 1 sec... |
| 06:26 | ejackson | line 77 of core.clj defines the now function |
| 06:26 | ejackson | https://github.com/getwoven/clj-time/blob/master/src/clj_time/core.clj#L77 |
| 06:27 | ejackson | if you pass that through a formatter for your desired format you'll get what you want |
| 06:28 | ejackson | so (unparse my-formatter (now)) |
| 06:53 | fortxun | $seen rhickey |
| 06:53 | sexpbot | rhickey was last seen quitting 3 days and 15 hours ago. |
| 08:46 | clgv | I want to render a big matrix in a swing window with each entry represented as a square with a truncated number and a color from the "interval" white to red. is there anything in clojure or java that might help me with that or do I have to do it completely from scratch? |
| 08:50 | clgv | from scratch means using JTable and implementing custom renderers... |
| 08:51 | fliebel | clgv: Seesaw maybe? Or Incanter? |
| 08:53 | clgv | incanter can display it's own matrices as far as I saw. have to lookup seesaw |
| 08:54 | fliebel | clgv: How are its own matrices any greener than yours? |
| 08:54 | clgv | I didn't check ;) but I dont think it is able to do the color thing ;) |
| 08:55 | fliebel | I think it is. |
| 08:56 | ejackson | clgv: there's a java matrix lib that does this.... |
| 08:56 | clgv | ejackson: interesting. which? |
| 08:56 | ejackson | Bradford Cross referenced it when he compared the various java mtarix libraries in he blog |
| 08:56 | ejackson | trying to remember... |
| 08:57 | ejackson | http://measuringmeasures.com/blog/2010/3/28/matrix-benchmarks-fast-linear-algebra-on-the-jvm.html |
| 08:58 | ejackson | there: http://www.ujmp.org/ |
| 08:59 | fliebel | AH, colt is the one used by incanter. |
| 08:59 | clgv | yep. colt it is |
| 09:00 | fliebel | So according to their home page, you could use ujmp to visualize a Incanter matrix |
| 09:00 | fliebel | … maybe |
| 09:01 | solar_sea | What's the proper meaning of "Can't eval locals" in clojure ? :) |
| 09:01 | fliebel | solar_sea: Where are you seeing that? |
| 09:02 | fliebel | &(let [x 1] (eval '(+ x 1))) |
| 09:02 | sexpbot | java.lang.SecurityException: You tripped the alarm! eval is bad! |
| 09:02 | solar_sea | In a rather weird macro scenario, I've sent a mail to the ML about it |
| 09:03 | solar_sea | when I call a defmacro from the body of another defmacro |
| 09:03 | fliebel | solar_sea: Probably something about quoting then. |
| 09:03 | fliebel | oh... |
| 09:04 | solar_sea | I can see that those errors are thrown from LocalBindingExpr java class in the compiler.java, but I haven't made a deep inspection about it yet |
| 09:16 | clgv | ejackson: ok, I am working on a UJMP solution. looks promising. thx! |
| 09:17 | ejackson | np, just remembered the 'predator view' matrices from that blog post ;) |
| 09:17 | clgv | just their documentation is a bit like some of the matrices they support - sparse ;( |
| 09:18 | ejackson | ;) |
| 09:18 | clgv | maybe I find something in the forum |
| 09:18 | clgv | to get started faster |
| 09:37 | clgv | ok. It's easier to get to see something that I thought: (doto (DefaultDenseDoubleMatrix2D. 120, 120) (.showGUI)) |
| 09:37 | ejackson | that's cute |
| 09:38 | clgv | now I only need to set the data and try to findout how to influence the displayed colors |
| 09:52 | dpritchett | every time i update coffeescript it shadows my "cake" executable and then i have to go rename the new one to coffee-cake to fix it. anyone else deal with this regularly? |
| 10:26 | clgv | ejackson: hmm standard colors seem to be black to green... |
| 10:26 | ejackson | old skool |
| 10:36 | clgv | lol yeah |
| 11:14 | semperos | trying out congomongo, using 0.1.3-SNAPSHOT off Clojars; I see functions in the source "make-connection", "with-mongo" and several others in the congomongo namespace that I don't have access to |
| 11:14 | semperos | while working in slime/swank at the REPL |
| 11:14 | semperos | anyone else experience these issues? |
| 12:06 | semperos | figured it out; incanter was pulling in old versions of congomongo and the database driver for mongodb... |
| 12:10 | ejackson | naughty Incanter ! |
| 12:10 | semperos | :) |
| 12:10 | semperos | nah, naughty me for not paying attention to the granular jar files David provides for the different parts of incanter |
| 12:12 | semperos | actually forced me to start using the latest version of congomongo and the db driver, and it performs a lot better (getting the count for 800,000 records is instanteous, instead of taking up to a minute) |
| 12:41 | ejackson | that is fast |
| 12:49 | dnolen | wow this is hilarious, http://bugs.sun.com/view_bug.do?bug_id=4262078 |
| 12:49 | dnolen | 10 years of people complaining. |
| 12:51 | amalloy | dnolen: if i were getting complaints with such atrocious grammar and spelling, i'd wait ten years too |
| 12:51 | clgv | can't incanter.core/dataset handle lazyseqs? |
| 12:53 | ejackson_ | Check it out: Chas's ClojureAtlas just got released: http://cemerick.com/2011/05/03/clojure-atlas-now-available/ |
| 13:09 | choffstein | If I have two lists, one representing keys and one representing vals, is there an function to create a hash-map from them? I could theoretically do a reduce after doing something like (map vector list-one list-two) -- but I was wondering if there was already something built in that I am missing |
| 13:09 | amalloy | zipmap |
| 13:09 | KirinDave | choffstein: zipmap |
| 13:09 | KirinDave | shit |
| 13:10 | dakrone | ,(zipmap [:a :b :c] [1 2 3]) |
| 13:10 | clojurebot | {:c 3, :b 2, :a 1} |
| 13:10 | KirinDave | come on amalloy you can't go cutting corners. ;) |
| 13:10 | amalloy | KirinDave: where do i go for my ninja badge? |
| 13:10 | choffstein | vunderful! |
| 13:10 | choffstein | Thanks ever so much |
| 13:12 | ejackson | redis is freaking amazing |
| 13:13 | semperos | ejackson: what are you using it for specifically? |
| 13:14 | ejackson | semperos: as a silly fast store of data. |
| 13:14 | choffstein | what is a sorted-map? |
| 13:15 | ejackson | i'm using its native datastructures |
| 13:15 | ejackson | choffstein: a map which is sorted by its keys |
| 13:15 | semperos | choffstein: maps by default are not sorted, i.e. the keys aren't in order |
| 13:15 | choffstein | so when you pull the keys, they are sorted? |
| 13:15 | choffstein | By the order you insert them in? Or can you provide a sort method? |
| 13:15 | semperos | what do you mean by "pull"? |
| 13:16 | choffstein | e.g. (keys map) |
| 13:16 | semperos | ,(hash-map :a "foo" :b "woops" :c "bar") |
| 13:16 | clojurebot | {:a "foo", :c "bar", :b "woops"} |
| 13:16 | ejackson | choffstein: when you assoc new key-vals, the datastructure retains its order |
| 13:16 | semperos | ,(keys (hash-map :a "foo" :b "woops" :c "bar")) |
| 13:16 | clojurebot | (:a :c :b) |
| 13:17 | semperos | ,(sorted-map :a "foo" :b "woops" :c "bar") |
| 13:17 | clojurebot | {:a "foo", :b "woops", :c "bar"} |
| 13:17 | semperos | ,(keys (sorted-map :a "foo" :b "woops" :c "bar")) |
| 13:17 | clojurebot | (:a :b :c) |
| 13:18 | choffstein | ,(assoc (sorted-map :a "foo" :b "whoops" :d "bar") :c "test") |
| 13:18 | clojurebot | {:a "foo", :b "whoops", :c "test", :d "bar"} |
| 13:18 | choffstein | ,(keys (assoc (sorted-map :a "foo" :b "whoops" :d "bar") "test")) |
| 13:18 | clojurebot | java.lang.IllegalArgumentException: Wrong number of args (2) passed to: core$assoc |
| 13:18 | choffstein | ,(keys (assoc (sorted-map :a "foo" :b "whoops" :d "bar") :c "test")) |
| 13:18 | clojurebot | (:a :b :c :d) |
| 13:18 | choffstein | hmm, interesting. |
| 13:18 | Tristam | Oooh...that bot is neat |
| 13:19 | semperos | sexpbot is very nice as well |
| 13:19 | semperos | with lots o' features |
| 13:19 | semperos | my favorite is find-fn |
| 13:19 | miner49r | use array-map if you want the insertion order; sorted-map maintains the sorted order (not necessarily the insertion (time) order) |
| 13:19 | Tristam | I'm brand new to clojure, so I dunno what you're talking about...haha |
| 13:21 | Tristam | So far all I've done in clojure is hello world. Hehe |
| 13:22 | semperos | then everyone envies you your first dive into Clojure :) |
| 13:22 | choffstein | miner49r: but by what definition of 'order' ? |
| 13:22 | Tristam | Haha |
| 13:22 | Tristam | I did a bit of Common Lisp in several AI classes in college. Never could find an outlet for my fondness for lisp. Clojure might just be that outlet. |
| 13:24 | miner49r | choffstein: the insertion order is the order defined by the call to array-map. assoc will add the key as first in order. |
| 13:24 | miner49r | ,(array-map :a 1 :b 2) |
| 13:24 | clojurebot | {:a 1, :b 2} |
| 13:24 | jarpiain | ,(sorted-map [2 2] :a, [1 2] :b, [2 1] :c) |
| 13:24 | clojurebot | {[1 2] :b, [2 1] :c, [2 2] :a} |
| 13:24 | choffstein | miner49r: I mean for sorted-map |
| 13:24 | ataggart | miner49r: not true once the map size > 8 |
| 13:24 | ataggart | miner49r: assoc an array-map with 8 entries and you'll get back a hash-map |
| 13:25 | semperos | Tristam: you can message sexpbot privately and play around |
| 13:25 | jarpiain | ,(sorted-map-by > 1 :a, 2 :b, 3 :c) |
| 13:25 | clojurebot | {3 :c, 2 :b, 1 :a} |
| 13:25 | miner49r | attagart: I think array-map itself will keep the order, but assoc will give you the hash-map when things get too big to be efficient (not sure it's 8 or 10 elements) |
| 13:25 | semperos | but the findfn lets you say "given an input and an output, show me which function(s) can perform this change" |
| 13:25 | ataggart | miner49r: correct |
| 13:25 | semperos | $findfn "foo" "FOO" |
| 13:26 | sexpbot | [clojure.string/upper-case clojure.contrib.string/swap-case clojure.contrib.string/upper-case] |
| 13:26 | Tristam | semperos, that almost sounds dirty...haha |
| 13:26 | semperos | it's pretty useful if both the name of a function or even a related word escape you, so you need smth beyond docs |
| 13:27 | Tristam | That's sweet |
| 13:27 | miner49r | By the way, array-map is only a good idea for small maps since the search is linear. That's why assoc doesn't return an array-map when it gets too big. |
| 13:27 | Tristam | I need a bot like that for everyday conversation when I forget stuff! |
| 13:27 | semperos | heh |
| 13:27 | semperos | the code is hosted on github: https://github.com/Raynes/sexpbot |
| 13:28 | Tristam | What's it written in? |
| 13:28 | semperos | oops |
| 13:28 | semperos | wrong repo |
| 13:28 | semperos | Tristam: I'll give you two guesses |
| 13:28 | semperos | :) |
| 13:28 | Tristam | Haha |
| 13:28 | semperos | http://github.com/cognitivedissonance/sexpbot is the right repo |
| 13:28 | Tristam | clojure? |
| 13:28 | clojurebot | "[Clojure ...] feels like a general-purpose language beamed back from the near future." |
| 13:28 | semperos | yes |
| 13:28 | semperos | look at the repo, the *.clj files are all Clojure source files |
| 13:28 | Tristam | Woo! I only needed one guess! |
| 13:28 | semperos | :) |
| 13:29 | semperos | Tristam: where are you coming from, in terms of current programming language(s)? |
| 13:29 | semperos | (always curious how/why folks come to Clojure) |
| 13:30 | Tristam | I've got a ridiculous mixture of languages gleaned from two CS degrees worth of education, c++, Java, and Common Lisp are the ones I know best. |
| 13:30 | Tristam | Someone mentioned clojure to me when we were jabbering about lisp |
| 13:31 | Tristam | So I checked it out |
| 13:31 | semperos | gotcha |
| 13:31 | Tristam | I've got a potential job opportunity that involves some amount of java...so maybe I can lispify it and make it work better. |
| 13:32 | semperos | "it's just a jar, boss" |
| 13:33 | Tristam | Beyond that, I like programming languages, so I look into them just for kicks when one interests me. |
| 13:33 | semperos | :) |
| 13:35 | amalloy | semperos: findfn has a newish feature, btw |
| 13:35 | semperos | amalloy: oui? |
| 13:35 | amalloy | $findarg map % [1 2 3] [2 3 4] |
| 13:35 | sexpbot | [clojure.core/unchecked-inc clojure.core/inc] |
| 13:36 | semperos | I like it! |
| 13:36 | semperos | $findfn [1 2 3] [2 4 6] |
| 13:36 | sexpbot | [] |
| 13:36 | semperos | what am I missing there, amalloy? |
| 13:36 | semperos | oh, nm |
| 13:36 | amalloy | um, there's no "double this" function in the core libs |
| 13:37 | Tristam | You'd need apply or mapcar or something that that wouldn't you? |
| 13:37 | amalloy | $findfn #(* 2 %) [1 2 3] [2 4 6] |
| 13:37 | sexpbot | [clojure.core/map clojure.core/keep] |
| 13:37 | semperos | ,(map #(* 2 %) [1 2 3]) |
| 13:37 | clojurebot | (2 4 6) |
| 13:37 | Tristam | There ya go |
| 13:38 | semperos | I have a habit of asking obviously stupid quesitons |
| 13:38 | amalloy | like what? (har har, get it? what a stupid question) |
| 13:38 | semperos | :) |
| 13:38 | semperos | keeps me in my place |
| 13:38 | Tristam | We all have random brain shutdowns |
| 13:39 | Tristam | Some of us more often than others. |
| 13:39 | semperos | ,(let [times-2 (partial * 2)] (map times-2 [1 2 3])) |
| 13:39 | clojurebot | (2 4 6) |
| 13:39 | Tristam | What were we talking about again? |
| 13:39 | semperos | example of currying, if I'm not mixing up my terms |
| 13:39 | Tristam | Is [] shorthand for a lambda?> |
| 13:39 | amalloy | Tristam: anyway, clojure uses a more abstract notion of "sequences" rather than car/cdr cells, so we don't really have/need the million different mapcar/mapcan/mapcdr functions. just map |
| 13:40 | amalloy | Tristam: no, it's a literal vector |
| 13:40 | amalloy | #() is shorthand for a lambda |
| 13:40 | semperos | with % as the implicit param |
| 13:40 | Tristam | I remember going insane with the car/cdr stuff |
| 13:40 | ataggart | % == %1 |
| 13:41 | amalloy | to be fair, we do have mapcat, which is basically just (apply concat (map ...)) |
| 13:42 | semperos | Tristam: when I started, I got a couple of the books and went from books to Rich Hickey's videos on Blip.tv as my brain fried in different ways |
| 13:43 | Tristam | I'm used to fried brains |
| 13:43 | semperos | :) |
| 13:43 | semperos | the videos for Clojure on blip are really good, if you haven't checked them out, you should |
| 13:43 | Tristam | Though I really like Head First books for new programming languages...that minimizes brain frying a lot of times. |
| 13:44 | amalloy | Tristam: if you learn a new language and your brain still works, you're doing it wrong |
| 13:44 | Tristam | amalloy, Quite true |
| 13:45 | semperos | Tristam: but if you already have the JVM ecosystem experience and CL, perhaps it'll just be a mild simmering... |
| 13:47 | Tristam | Flash fry |
| 13:51 | fcek | there's a core/contrib function that does this? ((fn [m] (zipmap (map keyword (keys m)) (vals m))) {"a" "b" "c" "d"}) |
| 13:51 | fcek | ,((fn [m] (zipmap (map keyword (keys m)) (vals m))) {"a" "b" "c" "d"}) |
| 13:51 | clojurebot | {:c "d", :a "b"} |
| 13:52 | fcek | ops, it's wrong |
| 13:52 | fcek | it should be {:a "b" :c "d"} |
| 13:53 | ataggart | hash-map isn't sorted |
| 13:54 | ataggart | ,(reduce (fn [m [k v]] (assoc m (keyword k) v)) {"a" "b" "c" "d"}) |
| 13:54 | clojurebot | java.lang.IllegalArgumentException: Key must be integer |
| 13:55 | dpritchett | Neat, jeresig left Mozilla and now works for Khan Academy. |
| 13:55 | ataggart | ,(reduce (fn [m [k v]] (assoc m (keyword k) v)) {} {"a" "b" "c" "d"}) |
| 13:55 | clojurebot | {:c "d", :a "b"} |
| 13:56 | fcek | i did read {:a "d" :c "d"}, i want to convert string keys to keywords and i thought there was a core or contrib function |
| 13:56 | semperos | ataggart's reduce does the trick nicely |
| 13:58 | fcek | i'll use it as a starting point to handle nested maps, thanks |
| 14:03 | MayDaniel | fcek: There's clojure.walk/keywordize-keys. |
| 14:06 | fcek | MayDaniel: perfect, thanks! |
| 14:47 | ordnungswidrig | ,(dotimes [i (range 3)] (inc i)) |
| 14:47 | clojurebot | java.lang.ClassCastException: clojure.lang.LazySeq cannot be cast to java.lang.Character |
| 14:47 | ordnungswidrig | ? |
| 14:48 | miner49r | ,(dotimes [i 3] (inc i)) |
| 14:48 | clojurebot | nil |
| 14:48 | ordnungswidrig | argl |
| 14:48 | ordnungswidrig | however the exception is somewhat misleading :-) |
| 14:49 | miner49r | yes, there's a bug somewhere collecting misleading error messages so that they can be improved |
| 15:03 | edw | Hmm, is there a way to kill the motion-sickness inducement feature of Clojure Atlas? |
| 15:05 | cemerick | edw: I'm working on it :-) |
| 15:05 | ataggart | ,(doc dotimes) |
| 15:05 | clojurebot | "([bindings & body]); bindings => name n Repeatedly executes body (presumably for side-effects) with name bound to integers from 0 through n-1." |
| 15:06 | ataggart | ,(dotimes [i 3] (println i)) |
| 15:06 | clojurebot | 0 |
| 15:06 | clojurebot | 1 |
| 15:06 | clojurebot | 2 |
| 15:06 | amalloy | &(doseq [i (range 3)] (prn i)) |
| 15:06 | sexpbot | ⟹ 0 1 2 nil |
| 15:07 | ataggart | skinning cats is fun |
| 15:09 | Tristam | Everytime I look into this channel, the Chevelle song "Closure" pops into my head. |
| 15:10 | edw | cemerick: Thanks. I think there's some interesting potential for having the atlas keep track of what you're looking at, so it can incorporate usage frequency into the way it presents modules and symbols. (Hell, it could even be collaborative. Or could look through public repos on Github and see which symbols are used in the same procedure as a given procedure. |
| 15:10 | cemerick | edw: actually, my quick solution will probably to make it so you can halt the visualization when you're satisfied with its arrangement. A generalized solution will probably take a couple days' work. |
| 15:11 | edw | s/procedure./procedure.\)/ |
| 15:11 | sexpbot | <edw> cemerick: Thanks. I think there's some interesting potential for having the atlas keep track of what you're looking at, so it can incorporate usage frequency into the way it presents modules and symbols. (Hell, it could even be collaborative. Or could look through public repos on Github and see which symbols are used in the same procedure.)as a given procedure.) |
| 15:11 | edw | D'oh. |
| 15:12 | cemerick | edw: where would the "usage frequency" come from, if not github? |
| 15:12 | amalloy | cemerick: he suggests highlighting which ones the user looks at most often, i think |
| 15:12 | edw | Clickstream data from your users. Most grequently-consulted... |
| 15:12 | cemerick | ah |
| 15:14 | cemerick | edw: Certainly possible. As it stands right now, the atlas is entirely static (i.e. there's no server IO), but it needn't stay that way. |
| 15:14 | cemerick | edw: If you could drop that idea into a UserVoice thread, that'd be great. It'd be good to hear other people's perspective on that one. |
| 15:15 | edw | Also, another brain fart: many procedures have resemblances e.g. ones that are suited to being used with -> vs ->> and it would be nice to know what idioms lead to most effective use of this procedure. Or usage notes a la "fewer vs. less" in a dictionary. |
| 15:17 | edw | This is the sort of stuff that'll produce reams of armchair philosophizing and ui designing. I think you just need to try this stuff out and see which ideas have legs. |
| 15:17 | ataggart | -> is for working with a single value/object, ->> is for working with sequences of values/objects |
| 15:18 | ataggart | so sayeth rhickey |
| 15:18 | ataggart | likewise fns that work on a single value/object take their subject as the first arg, whereas fns that work on sequences take the subject last |
| 15:18 | cemerick | edw: The ontology is *far* from complete. -> - suitable vs. ->> - suitable will be two distinct concept nodes that get linked up appropriately. |
| 15:18 | ejackson | which I think is due to the convention of putting arguments to functions which are seqs at the last position |
| 15:19 | cemerick | Yeah, those are just idioms. |
| 15:19 | cemerick | I've switched -> to ->> when some java method needed my single object as the last arg plenty of times. |
| 15:20 | hsuh | i've been getting errors like http://paste.factorcode.org/paste?id=2264 from time to time, any idea what could that be? |
| 15:20 | edw | Crazy idea here, but imagine this: someone can annotate the documentation and people can enable/load/whatever sets of annotations. |
| 15:23 | amalloy | cemerick: (-> foo (.thing1 x) (.thing2 y z) (->> (.method otherObject)))? |
| 15:23 | edw | Oh, and let people "write in the margin" and add their own notes. (But don't let it become some karma-whoring clusterfuck like Hacker News or Stackoverflow.com.) |
| 15:24 | amalloy | hsuh: stop making so many keywords :P |
| 15:24 | ataggart | cemerick: yes sometimes expediency takes backseat to semantic clarity |
| 15:24 | Plertrood | How can I join two lists together? |
| 15:24 | cemerick | amalloy: You can do that, but just (->> foo .blah .bar (.baz arg1 arg2)) too, assuming .baz takes .bar's result last. |
| 15:25 | ataggart | ,(doc concat) |
| 15:25 | clojurebot | "([] [x] [x y] [x y & zs]); Returns a lazy seq representing the concatenation of the elements in the supplied colls." |
| 15:25 | dnolen | ,(concat [1 2] [3 4]) |
| 15:25 | clojurebot | (1 2 3 4) |
| 15:25 | amalloy | &(into [1 2] [3 4]) |
| 15:25 | sexpbot | ⟹ [1 2 3 4] |
| 15:25 | Plertrood | Ah lovely! Thanks been looking throguh the docs all afternoon! |
| 15:25 | cemerick | edw: Something like that using localStorage for personal use would be fine. I'm not at all equipped to handle what would almost surely become a clusterfuck tho. :-) |
| 15:26 | amalloy | cemerick: sure. but there's no easy way to go from ->> to -> (anonymous function fiddling is gross), whereas going from -> to ->> is easy on a form-by-form basis |
| 15:27 | dnolen | Plertrood: as the documentation says, concat is lazy. amalloy suggestion is better if you want the operation to be strict and to preserve the vector type. |
| 15:27 | edw | cemerick: I'm done with the irritating suggestions. For now. |
| 15:27 | amalloy | that said, it's remarkable how rarely you actually need to concatenate lists at all |
| 15:28 | cemerick | edw: Please keep 'em coming. Definitely focus your fire on UserVoice though -- I'll never be able to keep track of ideas proposed in irc. ;-) |
| 15:28 | Plertrood | Ah ok yes I think I looked at concat and saw it was lazy and it didn't do what I wanted. |
| 15:36 | ordnungswidrig | to improve concurrence is a datastructure like (ref {:foo-1 (ref {:a 1 :b 2}), :foo-2 (ref {:a 22 :c 5})}) better than (ref {:foo-1 {:a 1 :b2} :foo-2 {:a 22 :c 5}}) ? |
| 15:36 | ordnungswidrig | when data data at :foo-1 and :foo-2 is updated indepentently. |
| 15:38 | nickik | it works anyway, its kind of hard to say when what is better |
| 15:39 | ordnungswidrig | in the latter case the one ref will be a hotspot. I think having each value a ref itself improves on concurrency but I'm not sure. |
| 15:39 | nickik | it you offten update both then you would use one ref if you use them on there own most of the time you can split them |
| 15:39 | nickik | i think so. |
| 15:51 | Tristam | semperos, you're in NoVA? |
| 15:52 | semperos | Tristam: yes |
| 15:52 | Tristam | I miss Cox |
| 15:52 | semperos | it's the best I've ever had |
| 15:52 | Tristam | I used to live near Springfield Mall |
| 15:52 | semperos | gotcha |
| 15:52 | semperos | nice area |
| 15:52 | Tristam | Up until mid 2009 |
| 15:53 | Tristam | Yeah, we liked it...the commute into DC was crap of course. |
| 15:53 | semperos | of course |
| 15:53 | semperos | I don't work in the city |
| 15:53 | Tristam | My wife worked at the Navy Yard |
| 15:53 | Tristam | So it didn't matter if she took 395 or 495/295, it was utter crap |
| 15:53 | semperos | yep |
| 15:53 | semperos | understatement of the century |
| 15:53 | semperos | :) |
| 15:54 | Tristam | Super tech people work in Herndon/Reston...heh |
| 15:54 | semperos | seems that way |
| 15:54 | Tristam | Unfortunately, we'll be back there in 3-5 years/. |
| 15:55 | semperos | but you'll have one of hte best Clojure groups to look forward to |
| 15:55 | Tristam | Yay |
| 15:55 | pjstadig | i used to hate Northern Virginia...until i started working from home |
| 15:55 | semperos | yep |
| 15:56 | Tristam | We'll probably end up living in a shack somewhere when we move back...real estate is WAY lower here than down there. |
| 15:56 | pjstadig | my verizon dsl contract is expiring, and i'm thinking of switching back to cox for internet |
| 15:57 | pjstadig | Tristam: values are still a little depressed, i'd like to sell my house and move, but the prices are too low |
| 15:57 | pjstadig | but relatively speaking ... |
| 15:58 | Tristam | pjstadig, we sold our condo and bought a 4 bedroom house with 1000 more sq feet for $10k less than we sold |
| 15:58 | pjstadig | yeah...*sigh*...i know |
| 15:59 | Tristam | We bought the condo in 2001 though, so we still have some decent amount of equity. |
| 15:59 | raek | dnolen_: core.logic / Logos is really cool. I played around with it and used Definite Clause Grammars to parse natural language: https://gist.github.com/954080 |
| 16:02 | dnolen_ | raek: SWEEEEEEEEET |
| 16:02 | dnolen_ | raek: seriously that's really great, any feedback? |
| 16:02 | dnolen_ | raek: that's nice looking code. |
| 16:03 | raek | I'm still a newbie with this syntax for logic programming |
| 16:04 | dnolen_ | raek: do you have a twitter handle? |
| 16:04 | raek | @raekmannen |
| 16:04 | semperos | raek: very cool indeed |
| 16:04 | semperos | dnolen_: worked through your brief logic-tutorial, my first experience with that type of programming |
| 16:05 | semperos | +1 for continuing to flesh it out as you have time :) |
| 16:05 | raek | I was really astonished when I learned how natural these things are in logic programming |
| 16:05 | dnolen_ | semperos: yes it needs a lot of work. |
| 16:05 | Tristam | logic programming gives me scary flashbacks to prolog... |
| 16:05 | semperos | dnolen_: that's ok, it got me going |
| 16:05 | semperos | dnolen_: you've done great work |
| 16:06 | dnolen_ | semeperos: thx! |
| 16:06 | raek | dnolen_: when I have gotten myself more familiar with core.logic, I was thinking about writing macros for the more compact DCG syntax |
| 16:07 | raek | dnolen_: do you know any syntax guide for miniKanren for those who are used to prolog? |
| 16:07 | raek | but I guess the books you mentioned contains it all... |
| 16:07 | dnolen_ | raek: yes, The Reasoned Schemer and Byrd's thesis are really the two main references. |
| 16:08 | dnolen_ | raek: the defne syntax is my own design, based on their more Scheme-ish syntax for that, glad you ran w/ that. |
| 16:09 | raek | it would be nice to have a small reference that explains what kinds of expressions there are and "what can be put where" |
| 16:09 | dnolen_ | raek: like a quick reference or something? might make sense for a wiki. |
| 16:09 | raek | the first form of each defne clause should unify with the arguments, right? |
| 16:09 | raek | yeah |
| 16:10 | raek | definitely |
| 16:10 | dnolen_ | raek: yes. |
| 16:10 | dnolen_ | raek: there are something that I didn't consider with defne, i.e. it's idiomatic clojure to be able to take different arities. |
| 16:11 | dnolen_ | been heads down with predicate dispatch, so I haven't looked into that much, however would gladly take simple fixes like that (the matching code needs some love anyhow). |
| 16:11 | raek | is there another way of writing my ([_ ['the . ?x] ?x] (== d (make-d 'the))) clause? |
| 16:12 | Touqen | that kind of makes my head hurt |
| 16:12 | raek | obviosly, it didn't work to write ([(make-d 'the) ['the . ?x] ?x]) |
| 16:13 | dnolen_ | raek: yet another thing to think about. allowing functions in the match, that would make the matching stuff closer to the level of Prolog power. |
| 16:13 | dnolen_ | raek: please feel free to open issues. |
| 16:13 | raek | I'm still struggling with wrapping my head around this, you know :-) |
| 16:14 | dnolen_ | raek: still, that's a very inspiring gist, thanks for sharing that! |
| 16:15 | raek | dnolen_: is [foo . bar] and ?var only valid in pattern matching expressions? |
| 16:15 | dnolen_ | raek: yes, detecting vars in the bodies would be much more complicated. not saying I'm not interested in that tho. |
| 16:19 | dnolen_ | raek: there is also matche |
| 16:19 | dnolen_ | (matche [x y] ([ ... ] ...) ([ ... ] ...)) |
| 16:21 | raek | all this -e and -o makes it sounds like french and spanish... :-) |
| 16:22 | raek | dnolen_: so, defne is basically defn + matche ? |
| 16:23 | dnolen_ | raek: exactly. yeah I debated the convention,s but in the end I decided to stick to the miniKanren conventions. Makes it easier for now if somebody really wants to understand the core.logic implementation and help me improve things, I can refer them to good materials. |
| 16:29 | kaw_ | Newbie leiningen question; is it possible to get a slightly simpler directory structure (e.g. source in ./src/ and tests in ./test/ instead of ./src/projectname/ and ./test/projectname/test/) for a smaller project, by say setting some option in project.clj? |
| 16:30 | technomancy | kaw_: source is already in src/; it's a limitation of Clojure that you can't have single-segment namespaces (so src/myproject.clj is discouraged) |
| 16:33 | kaw_ | So no way to get around the need to have the namespace name in the directory structure? |
| 16:33 | amalloy | it also wouldn't be totally unfair to say that it's a limitation of java, which clojure has to live with |
| 16:34 | amalloy | kaw_: no, clojure depends on the namespace to match the directory structure |
| 16:34 | amalloy | so whatever your classpath is, namespace foo.bar.whatever needs to be in CLASSPATH/foo/bar/whatever.clj |
| 16:35 | Ramblurr | is there an irc channel for enlive? |
| 16:35 | kaw_ | Okay, thanks.. I guess I'll just choose a simple and short namespace name |
| 16:35 | pjstadig | remember when it used to be foo/bar/whatever/whatever.clj |
| 16:35 | semperos | Ramblurr: your best bet is probably here |
| 16:35 | pjstadig | those were the days... |
| 16:35 | semperos | or the enlive google group |
| 16:35 | Ramblurr | semperos: thanks |
| 16:36 | Ramblurr | semperos: i was wondering how to create new elements with enlive. e.g., if i've selected an :h2 element, how can I put a totally new <a> inside? |
| 16:37 | semperos | for simple things, you can write the enlive node directly as a map |
| 16:37 | semperos | you can insert a string as HTML |
| 16:37 | Ramblurr | semperos: what function do you pass the map too? |
| 16:37 | semperos | or if you have really complex HTML, you want to format it as Clojure datastrucures and re-re-doing work isn't an issue, you can actually combine hiccup and enlive |
| 16:38 | semperos | Ramblurr: do you have some code I can look at? you doing this with a page template, a snippet? |
| 16:38 | semperos | might be easier in context |
| 16:38 | Ramblurr | sure |
| 16:39 | Ramblurr | semperos: http://pastie.org/1861807 |
| 16:40 | Ramblurr | I could just edit the html file and insert an a, but in general I'd like to know how to make html on the fly, sort of like hiccup |
| 16:40 | semperos | you're not going to get as nice a way as hiccup for creating new HTML |
| 16:41 | semperos | enlive specializes in the selection process |
| 16:41 | semperos | let me pull up a repl with enlive so I don't mistake the fn's, two secs |
| 16:44 | semperos | Ramblurr: you can get the Enlive data structure by passing a string of HTML to the html-snippet fn |
| 16:44 | semperos | (html/html-snippet "<a href='http://example.com'>Example</a>") |
| 16:44 | semperos | will get you this |
| 16:44 | semperos | ({:tag :a, :attrs {:href "http://example.com"}, :content ("Example")}) |
| 16:45 | Ramblurr | ah interesting |
| 16:45 | Ramblurr | and then pass that to html/content ? |
| 16:45 | semperos | yep |
| 16:45 | semperos | see this blog post: http://www.bestinclass.dk/index.clj/2011/01/building-a-social-media-site.html |
| 16:45 | semperos | good examples |
| 16:46 | Ramblurr | semperos: ah fantastic |
| 16:47 | Ramblurr | semperos: look at this example here http://pastie.org/1861836 |
| 16:48 | Ramblurr | notice how i had to add the extra <div id=message> just to select the h2 and p? |
| 16:48 | Ramblurr | is there a beter way to do this without that extraneous <div> and maybe with less code? |
| 16:50 | dnolen_ | Ramblurr: enlive can match ranges. |
| 16:53 | @chouser | & '(a ~b ~@c) |
| 16:53 | sexpbot | ⟹ (a (clojure.core/unquote b) (clojure.core/unquote-splicing c)) |
| 16:53 | @chouser | did unquote go away in recent versions of Clojure |
| 16:53 | @chouser | ? |
| 16:54 | @chouser | in 1.3.0-alpha3 I'm getting just ~b instead of unquote |
| 16:55 | hiredman | you need syntax-quote to unquote? |
| 16:58 | raek | dnolen_: here's a bonus for you ;-) https://gist.github.com/954222 |
| 17:00 | dnolen_ | raek: heh, nice. |
| 17:02 | dnolen_ | chouser: works for me in alpha5 |
| 17:04 | @chouser | dnolen_: hm, ok. |
| 17:04 | dnolen_ | raek: yeah I see you could really benefit from being allowed to use fns in the match. the main issue is distinguishing them from matching lists I think ... perhaps only support brackets for that ? |
| 17:19 | dnolen_ | will probably do that since seq destructuring in Clojure is only done with [] as well. |
| 17:25 | raek | dnolen_: also, I got a "IllegalArgumentException No implementation of method: :occurs-check-term of protocol: #'clojure.core.logic.minikanren/IOccursCheckTerm found for class: nil" when I did this: (== s (list 'S aux np1 vp np2 nil)) |
| 17:25 | raek | my workaround was to remove that last nil |
| 17:26 | dnolen_ | raek: that's probably a legitimate bug, can you open a issue with link to your code and the snippet to reproduce? |
| 17:27 | raek | dnolen_: sure :) |
| 17:27 | dnolen_ | chouser: btw, your unquote bit worked for me on 1.3.0 master as well. |
| 17:28 | dnolen_ | raek: thx. |
| 17:28 | raek | dnolen_: on core.logic or logos? |
| 17:34 | raek | dnolen_: Issue with code example: https://github.com/swannodette/logos/issues/24 |
| 17:36 | dnolen_ | raek: oops sorry, please only on core.logic thx. |
| 17:36 | dnolen_ | raek: I don't push to Logos anymore. |
| 17:45 | dnolen_ | raek: actually now that I think about it, I suppose the clojure team probably wants me to use JIRA... |
| 17:49 | zrilak | amalloy gave me a template for a macro yesterday with this in it: ... (foo [argmap#] (let ... ; I looked at http://clojure.org/reader and couldn't find any special meaning for the "symbol#" syntax, so I just need to verify: is "symbol#" simply convention for naming maps? |
| 17:50 | zrilak | ( `symbol# of course not being relevant here) |
| 17:50 | amalloy | &`foo# |
| 17:50 | sexpbot | ⟹ foo__40772__auto__ |
| 17:50 | zrilak | ah, so it works *inside* quoted sexp too? |
| 17:50 | zrilak | gotcha |
| 17:50 | amalloy | it is ONLY useful inside syntax-quote forms |
| 17:50 | zrilak | I thought it had to be `symbol#, not `(... sym# ...) |
| 17:51 | zrilak | thanks :) |
| 17:51 | amalloy | &`(let [x 1] x) |
| 17:51 | sexpbot | ⟹ (clojure.core/let [clojure.core/x 1] clojure.core/x) |
| 17:51 | amalloy | this will fail because you can't let a qualified symbol |
| 17:51 | amalloy | &`(let [x# 1] x#) |
| 17:51 | sexpbot | ⟹ (clojure.core/let [x__40787__auto__ 1] x__40787__auto__) |
| 17:51 | zrilak | wasn't immediately obvious to me that it works at an arbitrary place inside a quote |
| 17:56 | zrilak | and this: (defmacro foo [... & body] ~@body) is an idiom for passing multiple forms as body, I take it |
| 17:57 | zrilak | (forgot `) |
| 17:59 | @chouser | zrilak: right |
| 17:59 | @chouser | & body accepts remaining args as a lazy seq, and ~@ splices a seqable into the syntex-quoted form |
| 17:59 | sexpbot | java.lang.Exception: Unable to resolve symbol: body in this context |
| 18:00 | zrilak | cool, good to see things finally starting to fall together in my head |
| 18:00 | zrilak | thanks :) |
| 18:32 | semperos | anyone used the alternative memoize fn on Meikel Brandmeyer's blog? http://kotka.de/blog/2010/03/memoize_done_right.html |
| 18:32 | semperos | trying out the ttl-cache-strategy and getting some errors I can't quite make sense of |
| 19:43 | Ramblurr | using lein, whats the best way to get /usr/share/java into my classpath? |
| 19:45 | hiredman | don't, put whatever it is you want in your project.clj and stop using whatever distros inevitably broken java library installations |
| 19:45 | Ramblurr | ah |
| 19:46 | Ramblurr | hiredman: so if i have somejavalib-1.1.3.jar in /usr/share/java i should copy it into lib/ and add [somejavalib "1.2.3" to me :dependencies? |
| 19:47 | technomancy | Ramblurr: what's the library? |
| 19:49 | hiredman | Ramblurr: no, you should read the lein readme |
| 19:49 | Ramblurr | hiredman: heh good idea, will do |
| 19:49 | hiredman | you never copy stuff manually, if you put the proper entry in project.clj the correct version will be downloaded for you and placed in the correct place |
| 19:50 | Ramblurr | oh herm, i just made this library, so i doubt it will be able to be downloaded :\ |
| 19:51 | Ramblurr | technomancy: the java bindings for kyoto cabinet |
| 19:52 | technomancy | Ramblurr: if the developers know what they're doing, they will make the jar available from a maven repository. |
| 19:52 | hiredman | http://clojars.org/org.clojars.lapax/kyotocabinet-java-native-deps |
| 19:53 | technomancy | ... and if the devs don't know what they're doing, sometimes someone else does ^ |
| 19:53 | Ramblurr | oh cool, everything on clojars.org lein can install? |
| 19:53 | technomancy | aye |
| 19:54 | technomancy | man... are there really people out there who think it's fine and dandy to write java libraries without publishing them? |
| 19:54 | technomancy | I am disappoint. ಠ_ಠ |
| 19:56 | technomancy | Ramblurr: anyway if you ever get the chance you should chastise them for their oversight; that would be super. |
| 19:56 | Ramblurr | hehe, will do, though I doubt they will.. mikio (the author) is an odd fellow |
| 19:57 | technomancy | it would be cool if clojars made you give a reason before agreeing to create org.clojars.foo group-ids |
| 19:58 | Ramblurr | technomancy: on linux, if you dont have the rlwrap tool installed, you get a long error everytime you start the repl with lein... maybe you could catch the error and nudge the user to install their distro package? |
| 19:58 | technomancy | Ramblurr: it's just a warning and should only happen on the first run. |
| 19:59 | technomancy | I mean, as far as I can tell, "install rlwrap for optimum experience." implies using your distro package. |
| 19:59 | Ramblurr | hmm, i didn't see that warning: http://pastie.org/1862411 |
| 20:00 | technomancy | whoa dang |
| 20:00 | technomancy | weird |
| 20:00 | technomancy | what lein version? |
| 20:00 | amalloy | Ramblurr: what command did you type to start the repl? |
| 20:00 | Ramblurr | amalloy: lein repl |
| 20:01 | Ramblurr | technomancy: Leiningen 1.5.2 |
| 20:01 | technomancy | Ramblurr: huh; must be a bug. thanks for the heads-up. |
| 20:01 | Ramblurr | technomancy: no problem, want me to submit a ticket (do you even use githubs issues?) |
| 20:02 | technomancy | hiredman: it's /bin/sh these days |
| 20:02 | technomancy | but that's dash on my system |
| 20:03 | technomancy | Ramblurr: that'd be great |
| 20:03 | hiredman | I retract then |
| 20:03 | technomancy | I have no idea if dash qualifies as sane? |
| 20:04 | technomancy | it's not That Original Flavour that your Mom used to Make at least. |
| 20:14 | Ramblurr | hiredman: technomancy: herm, that library on clojars isn't normal i think.. see the contents http://pastie.org/1862451 |
| 20:15 | Ramblurr | the actual java library is inside another jar |
| 20:16 | zrilak | dash is quite insane actually, don't use it |
| 20:17 | brehaut | serious question: is there a sane shell? |
| 20:17 | technomancy | brehaut: excellent point |
| 20:17 | zrilak | :) |
| 20:18 | technomancy | even eshell and scsh have their downsides |
| 20:18 | zrilak | well, some swore by scsh... but you asked for "sane" |
| 20:20 | technomancy | anything in particular to watch for with dash? |
| 20:20 | zrilak | I can't remember now, but it breaks bash compatibility in some quite non-obvious ways |
| 20:21 | zrilak | which can bite bad if writing shell scripts |
| 20:21 | technomancy | oh, I'm not aiming for bash compatibility, but presumably it breaks bourne compatibility too? |
| 20:21 | zrilak | I'd have to go through my old scripts to see exactly why |
| 20:21 | zrilak | I admit I don't know where the boundary between Bourne and Bourne Again lies |
| 20:22 | hiredman | zrilak: well, everyone should be targeting sh, regardless, if they are using /bin/sh |
| 20:22 | technomancy | well if anything breaks I'm sure I will heard from the solaris users; they are good at making themselves heard. =) |
| 20:22 | zrilak | yes, but then your distro slips a link to /bin/dash in place of /bin/sh |
| 20:23 | hiredman | zrilak: dash was written to be more like 'sh' than bash is, from what I understand |
| 20:23 | zrilak | technomancy: those are the cries for help coming from under the rubble :) |
| 20:23 | technomancy | zrilak: sounds about right |
| 20:24 | zrilak | hiredman: you could be right -- I might have been targeting bash all this time |
| 20:24 | hiredman | well, knock it off |
| 20:25 | zrilak | oh well |
| 20:27 | zrilak | <rant>why should we support 40-year old shells</rant> |
| 20:28 | hiredman | because bash is not good enough to replace them |
| 21:00 | miketee | hi guys, having trouble casting one class to another ... as a quick example how can i cast a java.lang.Double to a java.lang.Number ? |
| 21:01 | miketee | => (class (cast java.lang.Number dbl)) |
| 21:01 | miketee | java.lang.Double |
| 21:02 | hiredman | none of that has anything to do with casting |
| 21:02 | miketee | well, i'm actually trying to do this: (binding [bing-service-stub (cast com.microsoft.adcenter.v7.BasicHttpBinding_ICampaignManagementServiceStub bing-campaign-management)]) |
| 21:03 | miketee | here's my bing-campaign-management binding: bing-campaign-service-locator (new com.microsoft.adcenter.v7.CampaignManagementServiceLocator) |
| 21:03 | miketee | (binding [bing-campaign-management (.getBasicHttpBinding_ICampaignManagementService bing-campaign-service-locator)]) |
| 21:03 | hiredman | why are you casting it? |
| 21:03 | hiredman | and why are you using binding so much? |
| 21:03 | miketee | http://msdn.microsoft.com/en-us/library/cc728898.aspx |
| 21:04 | miketee | campaignServiceLocator = new |
| 21:04 | miketee | CampaignManagementServiceLocator(); |
| 21:04 | miketee | campaignServiceLocator.setBasicHttpBinding_ICampaignManagementServiceEndpointAddress(url); |
| 21:04 | miketee | campaignManagement = |
| 21:04 | miketee | campaignServiceLocator.getBasicHttpBinding_ICampaignManagementService(); |
| 21:04 | miketee | stub = (BasicHttpBinding_ICampaignManagementServiceStub) |
| 21:04 | miketee | campaignManagement; |
| 21:04 | hiredman | miketee: that is a url, not an answer |
| 21:04 | hiredman | and please don't paste that in here |
| 21:04 | hiredman | use a pastebin |
| 21:04 | miketee | sorry |
| 21:04 | miketee | ok |
| 21:05 | miketee | so i'm following the msdn docs on how to talk to their adcenter, and they are doing a cast of an object to another type |
| 21:05 | miketee | i just want to know how to replicate it |
| 21:06 | hiredman | ignore it, unless they do something weird, casting is an artifact of the java type system, this being a dynamic language you should be able to ignore it |
| 21:07 | miketee | so how do i refer to the methods of that class for the given object? |
| 21:07 | hiredman | and stop using binding so much |
| 21:07 | miketee | if it's not yet that object type? |
| 21:07 | miketee | i need some side effects... should i be using set! ? |
| 21:07 | hiredman | jsut ignore the type and do waht you want |
| 21:07 | hiredman | casting does not change the type of an object at all |
| 21:07 | miketee | ok, from my understanding it changes what you can do to the object |
| 21:08 | miketee | it exposes more methods possibly? |
| 21:08 | hiredman | no |
| 21:09 | miketee | what should i be doing if i want a global variable from the scope of a function? |
| 21:09 | miketee | set! bitches when i declare using def |
| 21:09 | amalloy | binding? |
| 21:09 | clojurebot | :| |
| 21:09 | hiredman | that is not what set! is for, please don't complain that nothing works if you don't know what you are doing |
| 21:10 | miketee | i'm not complaining |
| 21:10 | miketee | i'm asking you what i should be doing if you're telling me to stop using binding |
| 21:10 | miketee | i've tried using set! but it's incompatible with def |
| 21:11 | hiredman | you should read the docs and read some clojure code to get a sense of style |
| 21:11 | miketee | i've looked through mire and they use bindings and set! |
| 21:12 | miketee | to some extent i do need global state |
| 21:12 | miketee | er, global, mutable state |
| 21:12 | hiredman | binding and set! do not create global state |
| 21:12 | hiredman | ,(doc binding) |
| 21:12 | clojurebot | "([bindings & body]); binding => var-symbol init-expr Creates new bindings for the (already-existing) vars, with the supplied initial values, executes the exprs in an implicit do, then re-establishes the bindings that existed before. The new bindings are made in parallel (unlike let); all init-exprs are evaluated before the vars are bound to their new values." |
| 21:13 | hiredman | ugh, seriously? |
| 21:13 | miketee | me? |
| 21:13 | clojurebot | namespaces are (more or less, Chouser) java packages. they look like foo.bar; and corresponde to a directory foo/ containg a file bar.clj in your classpath. the namespace declaration in bar.clj would like like (ns foo.bar). Do not try to use single segment namespaces. a single segment namespace is a namespace without a period in it |
| 21:13 | miketee | hiredman: me? |
| 21:13 | hiredman | the docstring for binding is not very good |
| 21:14 | miketee | oh ok. well if i define a variable in a global context, how would you suggest re-set!ting it? |
| 21:14 | miketee | in scheme i could do this as define and set! |
| 21:15 | hiredman | miketee: http://clojure.org/vars |
| 21:15 | hiredman | "Per-thread bindings for one or more Vars can be established via the macro binding and within-thread they obey a stack discipline:" |
| 21:15 | hiredman | "Bindings created with binding cannot be seen by any other thread. Bindings created with binding can be assigned to, which provides a means for a nested context to communicate with code before it on the call stack. |
| 21:15 | hiredman | " |
| 21:16 | hiredman | if you really need global mutable state you want one of the reference types |
| 21:16 | miketee | so it would be something like (set! #x 1) ? |
| 21:18 | hiredman | miketee: if you are just going to guess over and over I am not going to sit here and say "no" until you guess correctly |
| 21:18 | hiredman | have you read the docs for set!? |
| 21:19 | miketee | yes |
| 21:19 | hiredman | and what makes you think that is correct? |
| 21:19 | hiredman | http://wiki.gungfu.de/Main/ClojureReferenceTypes |
| 21:20 | miketee | i don't think it is correct, that's why i'm here. |
| 21:21 | miketee | well, in the land of scheme it would be correct, but it's not in the land of clojure |
| 21:21 | hiredman | then based on reading the docs, and what I have said, what do you think is correct? |
| 21:24 | hiredman | if, as I pasted, binding creates thread-local mutable bindings for a global var, the mutations of which are only visible on a single thread, and set! can only mutate bindings create with binding, does using binding at all make sense? |
| 21:25 | miketee | def / ref-set |
| 21:25 | miketee | and deref |
| 21:25 | hiredman | ref-set with what? |
| 21:26 | miketee | (def r (ref nil)) \n (dosync (ref-set r 5)) \n (deref r) |
| 21:27 | miketee | imo there should be a scheme to clojure habit-breaking document floating around |
| 21:44 | amalloy | miketee: now's your chance to write that document |
| 21:45 | miketee | can anyone comment if clojure will add first class continuations if java supports closures? |
| 21:46 | hiredman | the two are orthogonal |
| 21:47 | hiredman | closures and continuations are not the samething andhave little to do with each other |
| 21:47 | miketee | so java just has to allow first class continuations for clojure to implement? |
| 21:47 | miketee | or is it a political thing? |
| 21:48 | hiredman | not java the jvm |
| 21:48 | hiredman | political? |
| 21:48 | miketee | you really like semantics. |
| 21:48 | Derander | miketee: java way way way ≠ jvm |
| 21:48 | miketee | why doesn't clojure have first class continuations? |
| 21:48 | miketee | is it a limitation of the JVM, or is it some other reason? |
| 21:48 | Derander | no idea |
| 21:49 | brehaut | because its not a continuations based language? |
| 21:49 | hiredman | because implementing continuations generally requires more control of the stack then the jvm provides |
| 21:50 | hiredman | I mean, you can implement continuations on the jvm, they just aren't going to be performant, and won't work with java interop |
| 21:50 | hiredman | two of clojure's main goals |
| 21:52 | hiredman | the other stumbling point with continuations is lack of tco on the jvm |
| 22:06 | clizzin | what's the equivalent of Class.class in clojure? |
| 22:09 | Ramblurr | when interoping with java, how do you pass enum flags like FOO | BAR ? (bit-or FOO BAR) works |
| 22:09 | Ramblurr | is that the idiomatic way? |
| 22:10 | alandipert | Ramblurr: that's how i've done it |
| 22:10 | amalloy | clizzin: Class |
| 22:10 | clizzin | amalloy: ahh yeah figured it out after mucking about a bit. thanks! |
| 22:11 | amalloy | &(nth (iterate class 1) 100) |
| 22:11 | sexpbot | ⟹ java.lang.Class |
| 22:11 | amalloy | also works :P |
| 22:12 | Ramblurr | alandipert: looks like (+ FOO BAR) works too |
| 22:13 | alandipert | Ramblurr: and it would also work in java |
| 22:13 | Ramblurr | yup |
| 22:13 | alandipert | i guess it depends if the enums are powers of 2 |
| 22:14 | amalloy | well, none none of this would |
| 22:15 | amalloy | ie, if bit-or works, it's because these ints (NOT enums) are powers of two, so + will work too |
| 22:15 | alandipert | right |
| 22:36 | semperos | I'm using this memoize function from Meikel Brandmeyer's blog: |
| 22:36 | semperos | https://gist.github.com/954663 |
| 22:36 | semperos | I'm calling it like this, on a function foo |
| 22:37 | semperos | (def memoized-foo (memoize foo (ttl-cache-strategy 500))) |
| 22:37 | semperos | I'm getting an arity exception, whereby it says the assoc-in on line 66 of the gist is being past 4 arguments |
| 22:37 | semperos | anyone care to look and see what I might be doing wrong? |
| 22:39 | amalloy | well, you are passing four arguments to assoc-in |
| 22:39 | semperos | :) |
| 22:39 | amalloy | no joke, it's true |
| 22:39 | semperos | I understand that |
| 22:39 | amalloy | &(macroexpand '(-> state (assoc-in [:x] args now))) |
| 22:39 | sexpbot | ⟹ (assoc-in state [:x] args now) |
| 22:40 | amalloy | where you probably want (assoc-in state [:x args] now) |
| 22:40 | semperos | yeah |
| 22:41 | semperos | I htought I was missing something else, bc it was on kotka's blog and folks had been using this code... |
| 22:41 | semperos | I don't get the use of args |
| 22:41 | semperos | in this context |
| 22:41 | semperos | well, nm, I'll fiddle |
| 22:42 | semperos | yep, that works |
| 22:42 | semperos | amalloy: thanks |
| 22:42 | semperos | I need to start trusting my reading of the code more |
| 22:42 | amalloy | args is the arguments passed to the function. i assume he's using it as the key in the memoization cache lookup |
| 22:43 | semperos | makes sense now that it's corrected |
| 22:52 | technomancy | anyway, you guys should all use http://clojars.org/org.clojars.technomancy/lein-search |
| 22:52 | technomancy | because it's awesome |
| 23:00 | amalloy | technomancy: a link to the github repo would be a bit more compelling. the clojars page just tells me that you can use lein to search for...something, somehow, and there's no stable 1.0 release yet |
| 23:01 | technomancy | hm; probably true |
| 23:02 | technomancy | lein plugin install org.clojars.technomancy/lein-search 1.0.0-SNAPSHOT && lein help search is the way to go |
| 23:03 | technomancy | for the record, weavejester's clucy lib is pretty handy |
| 23:08 | amalloy | technomancy: with lein 1.5.2 that command yields nothing more than a NoSuchMethodError |