2010-01-05
| 01:13 | ndimiduk | from within (ns foo (:gen-class)), how do I access foo.class? |
| 01:13 | ndimiduk | i'd like to pass the .class of the generated class as a parameter. saying (. instance method foo) doesn't work. |
| 01:13 | ndimiduk | compiling throws an exception saying Unable to resolve symbol foo |
| 01:21 | scottj_ | is there a function in clojure or contrib to turn [{:a "x" :b 1} {:a "y" :b 1} {:a "x" :b 1}] into {"x" 2 "y" 1}? |
| 01:22 | scottj_ | I wrote my own with reduce and but I'm wondering if there's a higher level idiom I'm missing |
| 01:26 | somnium | ,(frequencies [{:a "x" :b 1} {:a "y" :b 1} {:a "x" :b 1}]) |
| 01:26 | clojurebot | {{:a "y", :b 1} 1, {:a "x", :b 1} 2} |
| 01:26 | somnium | ^^ gets pretty close, one transformation or so away |
| 01:27 | danlarkin | What will the syntax be for defining a print-dup for a byte array |
| 01:28 | danlarkin | defmethod print-dup bytes isn't it, defmethod print-dup [B throws an EOFException |
| 01:28 | danlarkin | those were my two ideas |
| 01:29 | somnium | (->> [{:a "x", :b 1} {:a "y", :b 1} {:a "x", :b 1}] frequencies (map (fn [[{a :a} b]] [a b])) (reduce merge {})) |
| 01:30 | somnium | ,(->> [{:a "x", :b 1} {:a "y", :b 1} {:a "x", :b 1}] frequencies (map (fn [[{a :a} b]] [a b])) (reduce merge {})) |
| 01:30 | clojurebot | {"x" 2, "y" 1} |
| 01:31 | somnium | hmm, into {} better than reduce merge |
| 01:33 | scottj_ | somnium: interesting. my example wasn't clear but I actually wanted to add up the :b's, that's how "x" gets 2 |
| 01:34 | somnium | scottj_: well, as long as :b is always 1 it will work for any value of :a |
| 01:35 | somnium | scottj_: but to your orginal question frequencies is the only that I know of |
| 01:38 | scottj_ | this is the best I came up w/, curious if there's something better |
| 01:38 | scottj_ | (reduce (fn [result item] (assoc result (:a item) (+ (get result (:a item) 0) (:b item)))) {} [{:a "x", :b 1} {:a "y", :b 1} {:a "x", :b 1}]) |
| 01:43 | somnium | ,(reduce (fn [m {x :a y :b}] (update-in m [x] + y)) { "x" 0 "y" 0 } [{:a "x", :b 1} {:a "y", :b 1} {:a "x", :b 1}]) |
| 01:43 | clojurebot | {"x" 2, "y" 1} |
| 01:44 | somnium | scottj_: + blows up on nil keys so a custom + fn would make it a bit more robust |
| 01:51 | somnium | ,(reduce (fn [m {x :a y :b}] (update-in m [x] #(-> %1 (or 0) (+ %2)) y)) {} |
| 01:51 | somnium | [{:a "x", :b 1} {:a "y", :b 1} {:a "x", :b 1}]) |
| 01:51 | clojurebot | EOF while reading |
| 01:52 | somnium | ,(reduce (fn [m {x :a y :b}] (update-in m [x] #(-> %1 (or 0) (+ %2)) y)) {} [{:a "x", :b 1} {:a "y", :b 1} {:a "x", :b 1}]) |
| 01:52 | clojurebot | {"y" 1, "x" 2} |
| 01:52 | somnium | last try before bed :) |
| 02:06 | somnium | scottj_: on reflection I think I like your original better, I would just add map destructuring |
| 02:11 | chouser | danlarkin: (Class/forName "[B") I think |
| 02:13 | chouser | or (type (byte-array nil)) |
| 02:13 | danlarkin | chouser: ah ha, trickery :) |
| 02:13 | danlarkin | thanks |
| 04:56 | adityo | ~max people |
| 04:56 | clojurebot | max people is 240 |
| 06:19 | defn | How does one use options with (clojure.contrib.shell-out/sh)? |
| 06:19 | defn | ,(use 'clojure.contrib.shell-out) |
| 06:19 | clojurebot | nil |
| 06:20 | defn | ,(doc sh) |
| 06:20 | clojurebot | "([& args]); Passes the given strings to Runtime.exec() to launch a sub-process. Options are :in may be given followed by a String specifying text to be fed to the sub-process's stdin. :out option may be given followed by :bytes or a String. If a String is given, it will be used as a character encoding name (for example \"UTF-8\" or \"ISO-8859-1\") to convert the sub-process's stdout to a String which is returned. If :byt |
| 06:23 | shafi | Are there any clojure examples based on GPU? |
| 06:26 | hoeck | defn: it parses its args, and whenever it finds a keyword, the next string is considered a value to this key |
| 06:27 | hoeck | defn: so this should work: (sh "ls" "-l" :in "-a"), or this (sh :in "abc" "ls" "-la") |
| 06:29 | hoeck | clojurebot: google clojure gpu |
| 06:29 | clojurebot | First, out of 6760 results is: |
| 06:29 | clojurebot | ideolalia - is it strange to dance so soon |
| 06:29 | clojurebot | http://ideolalia.com/ |
| 06:30 | hoeck | shafi: ^^ |
| 06:30 | slashus2 | http://github.com/ztellman/penumbra |
| 06:31 | shafi | Many thanks. I will have a look. |
| 06:53 | defn | hoeck: thanks buddy |
| 07:00 | praptak | Suggestions for Clojure docs changes. Where to raise them? |
| 07:01 | praptak | Is there an accepted way to suggest improvements to docs? |
| 07:02 | slashus2 | praptak: Raise the issue in the google group. |
| 07:02 | praptak | Ok, thanks. |
| 07:02 | Chousuke | though if it's just "add examples, please", then don't bother. that's a known issue :) |
| 07:03 | Chousuke | unless you have a solution for it, of course. |
| 07:03 | praptak | Nope, maybe it's even "remove examples" :) |
| 07:32 | cark | clojurebot: source reductions |
| 07:34 | cark | clojurebot: source rec-seq |
| 07:38 | bbommarito | Does Clojure have something like progn? |
| 07:38 | praptak | do |
| 07:38 | praptak | I believe that 'do' is the Clojure equivalent of progn |
| 07:39 | bbommarito | praptak: Thanks much. I'm sitting here trying to figure out why progn is bombing, until I think that maybe Clojure doesn't have that construct. |
| 07:40 | bbommarito | I may at some point have to add a progn into Clojure. |
| 07:44 | praptak | I am not sure if 'do' is 100% equivalent to 'progn', though. |
| 07:47 | bbommarito | praptak: Looks to be...I use progn usually for one use: ifs |
| 07:48 | bbommarito | Yep, do is progn. Takes a series of forms, evaluates them in order, returns the last one. |
| 07:49 | praptak | At this level they are equivalent - I mean the fine details of compilation (what is and what isn't a top-level form, etc.) |
| 07:50 | bbommarito | praptak: I don't tend to concern myself so much at the lower level of functions (I should, but sometimes there isn't time). |
| 07:50 | Chousuke | progn is a weird name :/ |
| 07:50 | Chousuke | I'm still not sure what it's supposed to mean |
| 07:51 | Chousuke | I guess it's something historical like car and cdr |
| 07:51 | praptak | I think it's "professional gnome" |
| 07:51 | bbommarito | Chousuke: progn is a program without arguments, prog is a program with arguments. prog is an older lisp form. |
| 07:52 | Chousuke | I see. |
| 07:52 | bbommarito | prog takes arguments in, sort of like a let, and progn doesn't. Needless to say, you will see mostly progn when you need to run multiple forms in a body (IE in an if) |
| 07:56 | praptak | for this, we have 'when' |
| 07:56 | bbommarito | You can do: (prog ((x 1)(y 2)(z 3)) (print x)(print y)(print z)) |
| 07:57 | bbommarito | praptak: I try to use whens and unless whenever possible, but sometimes you need both conditions. |
| 07:57 | praptak | True. |
| 07:58 | bbommarito | I really have to set slime up with clojure and allegro...make my life so simple. |
| 08:01 | hoeck | I always thought then n in progn stands for the nth-form which is returned |
| 08:03 | bbommarito | "progn is a special form that stands for “program with no arguments”." |
| 08:05 | bbommarito | That's the best meaning I could find for it. |
| 08:07 | bbommarito | progn is identical to prog, except prog can take arguments, progn cannot. |
| 08:09 | hoeck | but there is also prog1 and prog2, both taking any number of forms returning the result of the first or the second |
| 08:10 | hoeck | but anyway, sometimes I'm really in need of a do1, in clojure |
| 08:10 | Chousuke | do1? :/ |
| 08:10 | Chousuke | ah. |
| 08:10 | Chousuke | read only the latest line :P |
| 08:13 | bbommarito | Oooohhhh, prog could be useful. There is another macro to write in clojure. |
| 08:14 | bbommarito | I have never heard of dol. |
| 08:19 | bbommarito | Which means I have to figure out how to take a list of bindings... |
| 08:25 | Chousuke | prog just looks like a plain let though :/ |
| 10:02 | danlei | when I try to use contrib from the new branch I always get NoSuchMethodErrors (RestFn ...) I thought that a patch was applied to contrib to fix that? |
| 10:03 | the-kenny | danlei: Have you tried rebuilding a clean contrib? (ant clean && ant build) |
| 10:03 | danlei | the-kenny: ah, that might be it |
| 10:03 | the-kenny | clojurebot: clojure.lang.RestFN |
| 10:03 | clojurebot | ant clean and rebuild contrib |
| 10:03 | the-kenny | :) |
| 10:04 | danlei | ant stuff :D |
| 10:04 | danlei | I always mess it up :) |
| 10:06 | chouser | ooh |
| 10:09 | danlei | the-kenny: works, ty |
| 10:09 | the-kenny | danlei: You're welcome |
| 10:27 | danlei | are there plans to get clojure-dev on gmane, too? |
| 10:27 | danlei | would be nice |
| 10:43 | CalJunior | Have a question about am auto-proxy macro for implementing a Java interface. See the macro here: http://paste.lisp.org/+1ZRY |
| 10:46 | CalJunior | This is a macro I found on a blog by Tim (don't know his surname) on his blog at brool.com |
| 10:47 | CalJunior | The macro works very well and saves a lot of overriding code when implementing a Java interface with a lot of things that need to be overriden. |
| 10:48 | CalJunior | The problem I have is that it seems to override only the first call I define. |
| 10:49 | CalJunior | This is his example implementation of auto-proxy: http://paste.lisp.org/+1ZS0 |
| 10:51 | defn | Is there a limit to the depth a namespace can be? |
| 10:51 | defn | www.xyz.server.foo.bar.baz |
| 10:54 | CalJunior | OK, posted too soon. I solved the problem. I had a bug in the second defined method. |
| 10:54 | CalJunior | the macro is perfectly fine. |
| 10:54 | Chousuke | defn: probably not any limit that you're going to hit :P |
| 10:55 | Chousuke | unless you like REALLY long names. |
| 10:56 | CalJunior | by the way: would be nice to have this in clojure contrib. very handy for java interop. |
| 10:56 | CalJunior | I have asked Tim to submit it. |
| 12:23 | rbe | whats your favourite solutions for distribution, clustering? |
| 12:27 | esj | from what I've read Terracotta seems to be in favour |
| 12:28 | esj | is there a way to upack the arguments that get bundled as an array seq in & parameters ? |
| 12:29 | arohner_ | esj: yes, destructuring in the fn args, and let |
| 12:30 | esj | oooh that's sneaky |
| 12:30 | arohner_ | http://clojure.org/special_forms |
| 12:30 | esj | thanks |
| 12:31 | esj | perhaps that's what I need... can you look at my mock-up example at http://paste.lisp.org/display/93032 see ? |
| 12:32 | esj | or perhaps my hiding of the composition is stupid ? |
| 12:33 | arohner_ | if you want ((seq-add-x 2) 10) and ((seq-add-x 2) 10 20) to work, you'll need to dispatch on the type |
| 12:33 | Chousuke | what exactly do you want those to do? :/ |
| 12:33 | arohner_ | (cond (number? y) ... (seq? y) ...) |
| 12:34 | churib | perhaps apply would help :) |
| 12:34 | arohner_ | oh, yes |
| 12:34 | arohner_ | that's a better solution |
| 12:35 | esj | sorry, as usual I'm not clear. The composed function is for a DSL, so I want to able to do (s-a-x 4 3) or (s-a-x 4 3 10) rather than ((s-a-x 4) 3) and ((s-a-x 4) 3 10), to make the interface clean. |
| 12:35 | esj | but can't figure out how to write the wrapping function |
| 12:35 | arohner_ | so you want s-a-x to return [3+4 10+4]? |
| 12:35 | Chousuke | but what are those supposed to do? |
| 12:36 | Chousuke | remember, you can also overload on arity. |
| 12:36 | JonSmith | you could always make it ((s-a-x 4) 3 10) and then write a macro |
| 12:36 | esj | yeah, I could explicitly overload by arity |
| 12:37 | esj | but it seems like there should be a way to avoid that ? |
| 12:37 | arohner_ | (defn s-a-x [x & y] (map #(+ x %) y)) |
| 12:37 | arohner_ | assuming you want to add the first argument to each of the second |
| 12:37 | Chousuke | esj: there might be if I understood what you want the functions to do. |
| 12:37 | arohner_ | (s-a-x 4 3 10) => (7 14) |
| 12:37 | JonSmith | idk i like macros :-P |
| 12:38 | Chousuke | aha. |
| 12:39 | churib | overloaded arity in already built in + |
| 12:39 | churib | ,(+ 1 2 3) |
| 12:39 | clojurebot | 6 |
| 12:40 | esj | the example itself is totally made up to have something simple to talk about. What I've got is a composed function which (like range) has several possible arities. So if I accept the double parens ((s-a-x 3) ...) then I'm 100% fine. But I'd like to get rid of the internal parens and have calls like (s-a-x 3 ...). Perhaps I'm just being greedy ? |
| 12:40 | Chousuke | and is the two-argument form of s-a-x supposed to use a range of ten elements as the seq? |
| 12:40 | Chousuke | I still don't quite get what they're supposed to do. |
| 12:41 | JonSmith | well you can just wrap the double parens in another function |
| 12:41 | esj | Chousuke: the two argument form of s-a-x calls the two argument form of range. |
| 12:42 | esj | JonSmith - yes, but then I have arity trouble in writing this wrapping function. |
| 12:42 | Chousuke | ,((partial apply (comp #(map + 1 %) range)) 1 5) |
| 12:42 | clojurebot | java.lang.IllegalArgumentException: Don't know how to create ISeq from: java.lang.Integer |
| 12:42 | Chousuke | hm |
| 12:43 | Chousuke | whoops |
| 12:43 | Chousuke | ,((partial apply (comp #(map (partial + 1) %) range)) 1 5) |
| 12:43 | clojurebot | java.lang.IllegalArgumentException: Don't know how to create ISeq from: java.lang.Integer |
| 12:43 | esj | the partial ? |
| 12:43 | JonSmith | (defn s-a-x [& args] (let [function (fn [] ...composed... function)] (apply function args))) |
| 12:43 | Chousuke | ghsghj |
| 12:43 | JonSmith | or something like that |
| 12:44 | JonSmith | can do arg & argsif you want to have one seperated out |
| 12:44 | esj | JonSmith... interesting, let me wrap my mind around that . |
| 12:44 | JonSmith | arg and args if* |
| 12:44 | Chousuke | ,((partial apply (comp #(map (partial + 1) %) range))) 1) |
| 12:44 | clojurebot | java.lang.IllegalArgumentException: Wrong number of args passed to: core$apply |
| 12:45 | Chousuke | ,((partial apply (comp #(map (partial + 1) %) range))) 1 2) |
| 12:45 | clojurebot | java.lang.IllegalArgumentException: Wrong number of args passed to: core$apply |
| 12:45 | Chousuke | ardsgf |
| 12:45 | Chousuke | also, point-free :( |
| 12:45 | JonSmith | point free makes my head hurt :-( |
| 12:46 | JonSmith | ((partial apply (comp #(map (partial + 1) %) range))) (list 1 2)) |
| 12:46 | Chousuke | ah, right. |
| 12:46 | JonSmith | ,((partial apply (comp #(map (partial + 1) %) range))) (list 1 2)) |
| 12:46 | clojurebot | java.lang.IllegalArgumentException: Wrong number of args passed to: core$apply |
| 12:46 | JonSmith | lol |
| 12:46 | JonSmith | maybe not |
| 12:46 | Chousuke | ,((partial apply (comp #(map (partial + 1) %) range)) [1 5]) |
| 12:46 | clojurebot | (2 3 4 5) |
| 12:46 | JonSmith | ah |
| 12:46 | JonSmith | there we go |
| 12:46 | Chousuke | ,((partial apply (comp #(map (partial + 1) %) range)) [5]) |
| 12:46 | clojurebot | (1 2 3 4 5) |
| 12:47 | Chousuke | ,(let [s-a-x (fn [& args] ((partial apply (comp #(map (partial + 1) %) range)) args))] (s-a-x 1 3)) |
| 12:47 | clojurebot | (2 3) |
| 12:47 | esj | smoooth |
| 12:48 | Chousuke | completely unreadable :P |
| 12:48 | Chousuke | actually. |
| 12:48 | Chousuke | the partial apply is unnecessary |
| 12:49 | Chousuke | ,(let [s-a-x (fn [& args] (apply (comp #(map (partial + 1) %) range)) args)] (s-a-x 1 3)) |
| 12:49 | clojurebot | java.lang.IllegalArgumentException: Wrong number of args passed to: core$apply |
| 12:49 | Chousuke | or wait. |
| 12:49 | Chousuke | ,(let [s-a-x (fn [& args] (apply (comp #(map (partial + 1) %) range) args))] (s-a-x 1 3)) |
| 12:49 | clojurebot | (2 3) |
| 12:50 | esj | I know nothing about macros, so forgive me if its a stupid, but is there not a way just to pass in ((s-a-x a) ...) and get out (s-a-x a ...) ? |
| 12:50 | esj | sorry, the other way around. |
| 12:50 | Chousuke | no. |
| 12:50 | Chousuke | or yes, but s-a-x would then be infinitely recursive |
| 12:51 | Chousuke | hmm. |
| 12:51 | Chousuke | or actually, not. |
| 12:51 | Chousuke | depends on what the one-argument form of s-a-x expands to. |
| 12:52 | Chousuke | it's actually pretty easy: (defmacro sax ([x & xs] `((sax ~x) ~@xs))) ([x] one-arg-form-here)) |
| 12:53 | esj | :) |
| 12:53 | konr | Are there documentation functions (something like describe-symbol) available in clojure--mode on emacs? Strangely I couldn't find anything on the docs |
| 12:54 | Chousuke | konr: C-c C-d or something prints docstrings |
| 12:54 | Chousuke | Might be C-c C-d d or C-c C-d C-d. I'm not sure. |
| 12:54 | Chousuke | all I know is that it works :P |
| 12:55 | Chousuke | my fingers do it so I'm not sure of the command :D |
| 12:55 | konr | Chousuke: Hahaha, I guess I'm using an old version, then |
| 12:55 | esj | thanks for your help everybody. |
| 12:55 | Chousuke | konr: I think it might be a SLIME thing actually. |
| 12:57 | esj | konr: I saw an slime "inspect" thing working in Lau Jensen's screencast, never got it working myself. |
| 12:57 | esj | that brought up the javadocs |
| 12:59 | konr | esj: thanks for the reference! I was precisely looking for a compojure screencast |
| 12:59 | technomancy | esj: it requires Emacs 23 unfortunately, are you on an older version? |
| 13:00 | arj_ | seq-utils/flatten seems to be failing for me. I have a lazyseq of arraylists and if I flatten it, it just gives me back the lazyseq again |
| 13:01 | the-kenny | slime-inspect is working fine here, without a special setup |
| 13:02 | patrkris | what is the easiest way of creating a map m2 from m1, where all values of m2 are the values from m1 except that str has been applied to them? |
| 13:03 | esj | technomancy: shouldn't be, its the latest aquamacs. |
| 13:03 | esj | maybe I should try harder.... hold on. |
| 13:04 | the-kenny | patrkris: A mix of zipmap, keys and values |
| 13:04 | patrkris | the-kenny: of course! thanks! |
| 13:07 | technomancy | oh, with aquamacs all bets are off |
| 13:08 | the-kenny | ,(let [map {:foo 42 :bar 23} ] (zipmap (keys map) (map str (vals map)))) |
| 13:08 | clojurebot | {:bar 23, :foo 42} |
| 13:08 | the-kenny | ,(let [m {:foo 42 :bar 23} ] (zipmap (keys m) (map str (vals m)))) |
| 13:08 | clojurebot | {:bar "23", :foo "42"} |
| 13:08 | the-kenny | :) |
| 13:08 | the-kenny | patrkris: there you are |
| 13:09 | patrkris | the-kenny: i did exactly that, except that I keep forgetting that I can just pass standard functions to map (instead of str I passed #(str %) as the map function) |
| 13:10 | patrkris | the-kenny: thanks in any case |
| 13:10 | the-kenny | You're welcome :) |
| 13:44 | jlongster | Hey guys, I'm new to Clojure. What's the best practice for splitting up a project into several files? I want each file to have its own namespace, and import them into each other. But I can't find a way to do relative imports. |
| 13:49 | the-kenny | jlongster: (ns foo.bar) in src/foo/bar.clj, (ns foo.baz) in src/foo/baz.clj |
| 13:49 | the-kenny | jlongster: importing is done with the correct classpath (for examplw provided by swank-clojure-project) and (require 'foo.bar) or (require 'foo.baz) |
| 13:50 | jlongster | the-kenny: ok, so I need add my project's path onto the list of classpaths? |
| 13:50 | phaer | I have been trying to install vimclojure for hours, without success. ng-server runs, syntax highlighting, rainbow parens,.. works. But there are now keymappings in, according to :nmap and if i want to :call vimclojure#EvalFile() - for example - it throws errors: http://dpaste.com/141401/ |
| 13:50 | jlongster | Can I do that with Clojure code? |
| 13:55 | technomancy | jlongster: no; the JVM doesn't allow that =( |
| 13:55 | technomancy | jlongster: setting up your classpath is something that should be handled by your editor |
| 13:57 | jlongster | technomancy: ok. I can write some Emacs functions. thanks. |
| 13:58 | technomancy | jlongster: they're written for you. =) check out M-x swank-clojure-project from the swank-clojure readme |
| 14:00 | jlongster | technomancy: I've already got that set up and using SLIME. It's great. I don't want to hardcode project paths in my .emacs though, so I think I'll write a "slime-at-project" function which takes a path, sets the cwd to it and adds it to the classpath, and fires up SLIME. Or does it do something like that already? |
| 14:02 | technomancy | you've basically just described swank-clojure-project, yeah |
| 14:03 | jlongster | Oh, I must not have that code then, it sits on top of swank-clojure? |
| 14:03 | aking | jlongster: no need to hardcode paths in .emacs - M-x swank-clojure-project asks for the correct path and automatically uses any jars in the dep dir |
| 14:04 | technomancy | jlongster: it's defined in swank-clojure.el. if you've got an old version remove your config and install via package.el: http://tromey.com/elpa/install.html |
| 14:04 | aking | jlongster: if you're using lein that is.. |
| 14:06 | aking | jlongster: see technomancy's leiningen here: http://github.com/technomancy/leiningen/ |
| 14:07 | jlongster | technomancy: aking: thanks, I'll install it through elpa |
| 14:13 | jlongster | technomancy: If I may ask this here, I just installed swank-clojure through elpa. I don't see a swank-clojure.jar though, doesn't it need one? And what should be in my .emacs now? Just my call to "swank-clojure-config"? |
| 14:14 | LauJensen | jlongster: http://www.bestinclass.dk/index.php/2009/12/clojure-101-getting-clojure-slime-installed/ |
| 14:16 | technomancy | jlongster: swank-clojure-config is deprecated |
| 14:17 | technomancy | swank-clojure.jar should be handled by leiningen or whatever you're using for deps |
| 14:18 | jlongster | technomancy: ok |
| 14:32 | knuckolls | LauJensen: since we're on the topic. that screencast you posted was just what i needed to finally get everything set up with emacs last week. thanks. |
| 14:33 | LauJensen | knuckolls: Great, I'm glad to hear it :) |
| 14:41 | joshua-choi | Is there a version of clojure.template/do-template that encloses its expansions in a list rather than a do block? |
| 14:41 | joshua-choi | Or some kind of sequence |
| 14:43 | jlongster | technomancy: So I've downloaded all of the necessary Emacs packages, and now I need the swank-clojure.jar file. Were you saying that I need to build it myself? |
| 14:46 | technomancy | jlongster: no, it should be handled like any other JVM dependencies. (using leiningen, maven, etc.) |
| 14:47 | jlongster | I'm completely new to the JVM/Clojure world, and that's the first time I've heard of leiningen, which looks like a tool which would help me build swank-clojure.jar. If you have time, do you mind elaborating? |
| 14:49 | technomancy | jlongster: this is a pretty good introduction: http://zef.me/2470/building-clojure-projects-with-leiningen |
| 14:52 | the-kenny | hm.. the post doesn't use "lein new" for bootstrapping project directories |
| 14:53 | aking | jlongster: once you have lein installed and a project setup, just add " :dev-dependencies [[org.clojure/swank-clojure "1.0"]]) |
| 14:53 | the-kenny | aking: there's already [swank-clojure "1.1.0"] :) |
| 14:54 | jlongster | But surely my project doesn't depend on swank-clojure, it's just my development environment that does? |
| 14:54 | aking | to the project.clj file and do M-x swank-clojure-project |
| 14:55 | the-kenny | jlongster: That's what :dev-dependencies is for |
| 14:55 | the-kenny | aking: you forgot "lein deps" |
| 14:55 | aking | jlongster: you're right - that's why it's tagged as :dev-dependenciers |
| 14:55 | jlongster | ok, I see. It's still a little strange that my project should mention it at all though. |
| 14:58 | aking | So - to setup a new project called 'jlo', it's simple: lein new jlo; cd jlo; "add the swanl-clojure dependency to project.clj";lein deps - and that's it |
| 14:59 | the-kenny | aking: Yes |
| 14:59 | the-kenny | :) |
| 14:59 | aking | the-kenny: yup - I'm already using that for 3 different projects - love the uberjar option :) |
| 15:00 | the-kenny | aking: uberjar is really cool - especially for deploying :) |
| 15:10 | defn | im having trouble with shell-out |
| 15:11 | defn | (sh *command* :in "abc123" "-x" "-f" "etc") |
| 15:11 | defn | the command expects a file where abc123 is |
| 15:12 | chouser_ | :in supplies the given string as the command's stdin |
| 15:13 | cburroughs | I am trying to use clojure.contrib.http.agent to open a large number of urls. One of those requests has a problem with "Agent has errors". I can't figure out how to either 1. figure out which url caused the error 2. keep the error from blocking the rest of the requests. |
| 15:13 | defn | chouser: is there a way to fake it being a file? |
| 15:13 | chouser | defn: many commands take a dash "-" to mean "read from stdin instead of a file" |
| 15:14 | cburroughs | (A better way to open a large number of urls would also be welcome.) |
| 15:14 | chouser | cburroughs: agent error handling is up for an overhaul |
| 15:15 | the-kenny | cburroughs: Can you define "open"? |
| 15:15 | jlongster | Hey guys, thanks for the help so far. I've got everything installed now and unfortunately I'm getting an obscure error when I run SLIME. I can look into it more, but is this a common error? |
| 15:15 | jlongster | http://paste.lisp.org/display/93041 |
| 15:15 | jlongster | Emacs 23.1 on OS X |
| 15:15 | chouser | cburroughs: until then, you can try 'agent-errors' to get a look at the details of the stack trace |
| 15:15 | the-kenny | If you just want the text behind the url, you could use slurp* together with a ThreadPool |
| 15:15 | cburroughs | the-kenny, GET the url |
| 15:16 | chouser | cburroughs: or be careful to wrap try/catch around every action you send to the agent, printing what ever details you need in the 'catch' |
| 15:16 | the-kenny | cburroughs: Try slurp* with a threadPool :) slurp* is a member of duck-streams and can pull text from urls of different types |
| 15:17 | the-kenny | jlongster: Huh? the ~/tmp/bla.something looks wrong |
| 15:17 | aking | jlongster: M-x swank-clojure-project doesn't work? |
| 15:17 | the-kenny | It's /var/folders/something here. |
| 15:18 | cburroughs | the-kenny, Is there a standard threadpool to use? |
| 15:18 | jlongster | aking: no, in the end that still calls slime |
| 15:19 | jlongster | the-kenny: I don't know why it's that way, but ~/tmp exists so it should be able to create it |
| 15:19 | the-kenny | cburroughs: hm.. not one that I'm aware of. But it's easy of you use java.concurrent.Executor |
| 15:19 | the-kenny | jlongster: hm yes, right. |
| 15:19 | aking | jlongster: I used to do M-x slime to start slime - but no need to now with the lein stuff. |
| 15:20 | the-kenny | jlongster: Are the permission of the directory correct? |
| 15:20 | jlongster | I create stuff in ~/tmp all the time, so yeah |
| 15:20 | the-kenny | and what if you do "lein repl" and paste the code there? You can also try to modify the file-url when you paste it |
| 15:21 | ctdean | It's the shell that expands ~/tmp Try using the fully qualified pathname |
| 15:22 | jlongster | ctdean: good point, that's what it is |
| 15:22 | jlongster | Why is it trying to create it there then? |
| 15:25 | jlongster | finally. |
| 15:25 | jlongster | I had to: |
| 15:25 | jlongster | (setq temporary-file-directory "/var/tmp") |
| 15:25 | the-kenny | In your .emacs? |
| 15:25 | jlongster | I freaking hate setting up development enviroments. |
| 15:26 | jlongster | yeah |
| 15:26 | the-kenny | try (expand-file-name "~/tmp/") |
| 15:26 | the-kenny | The command will expand the ~ |
| 15:26 | jlongster | The default one in my slime.el was set to ~/tmp |
| 15:26 | jlongster | I could do that too |
| 15:26 | ctdean | There is probably a EXPAND-FILE-NAME missing somewhere in your emacs startup, or a misconfigure env variable |
| 15:27 | ctdean | yep, like he said :) |
| 15:27 | aking | looks like slime will use one of: TMPDIR TMP or TEMP, if found |
| 15:27 | technomancy | jlongster: you aren't using aquamacs by any chance, are you? |
| 15:28 | jlongster | No, just the normal gnu emacs which recently incorporated the Cocoa-specific Emacs extensions for OS X |
| 15:29 | jlongster | ctdean: Yeah, it looks like "~/tmp" was set in my custom-set-variables |
| 15:30 | jlongster | Thanks guys, gotta restart Emacs |
| 15:30 | ordnungswidrig | re |
| 15:32 | ordnungswidrig | does anybody know of a clojure lib to produce css? |
| 15:35 | ctdean | How do folks setup a repl when deploying a production app? |
| 15:42 | poet | any idea what could cause this error in leiningen? https://pastee.org/dk3mf |
| 15:57 | Licenser | good evening my lispy friends! |
| 15:57 | konr | hi there! |
| 15:57 | Licenser | I have a question regarding security today. Is it possible to wrap a single function call into something like a 'secure' manner? that it can only accees some functions not overload memory or eat unlimited time? |
| 15:58 | Licenser | somewhat like the clojurebot is doing but I'm not sure of his security isn't JVM based |
| 15:58 | ordnungswidrig | I like the jvm for that |
| 15:58 | ordnungswidrig | +chroot, selinux and ulimit |
| 15:58 | chouser | preventing consumption of memory and time are both rather tricky, I think. |
| 15:59 | hiredman | yes |
| 15:59 | Licenser | well time can be done with a thread and a timeout - that should not be so hard me thinks |
| 15:59 | chouser | yeah, chroot, ulimit, etc. are probably more bullet-proof. |
| 15:59 | Licenser | chouser: yap but I don't want to fire up a own JVM for every function call - not really feasable for my scenario :P |
| 16:00 | hiredman | Licenser: but what if your function starts other threads? |
| 16:00 | chouser | Licenser: but what do you do when the timeout expires? The only way to guarantee a shutdown of some other thread is using a deprecated method call. |
| 16:00 | hiredman | that too |
| 16:00 | Chousuke | Clojurebot's security measures are rather fragile :/ |
| 16:00 | hiredman | of course, deprecated things are never *removed* from java |
| 16:00 | Licenser | hiredman: that (and other things) fall under 'can only access some functions' |
| 16:00 | Chousuke | it's pretty easy to DOS |
| 16:00 | chouser | Licenser: you could keep a process running and toss functions to it to eval. nailgun-like. |
| 16:01 | ordnungswidrig | you could use a bunch of jvm to eval a request and then kill the jvm is a request takes to much time. |
| 16:02 | ordnungswidrig | jkill to the rescue |
| 16:02 | Licenser | Heh |
| 16:02 | pjackson | How do people generally host a Compojure app? Via Apache? |
| 16:02 | ordnungswidrig | or ulimit with cpu-bounding. Don't know if you can limit the max user/sys time |
| 16:02 | Licenser | Well I had the same problem with ruby, I solved it by writing a own VM to run the code on (not an ideal but pretty interesting solution) |
| 16:02 | ordnungswidrig | pjackson: you mean apache http server or apache tomcat :-) or apache geronimo. |
| 16:03 | pjackson | I don't know, how do you do it? :) |
| 16:03 | ordnungswidrig | pjackson: I'd use jetty + ngnix |
| 16:03 | ordnungswidrig | pjackson: or pure jetty if a single instance is enough |
| 16:03 | pjackson | Really? Cool, thanks. |
| 16:03 | Licenser | What I generally want to do is having a Server that can run user submitted functions without them wreaking havoc on the server itself or being able to do more then they should do ( |
| 16:04 | arohner_ | that's very hard in the general case |
| 16:04 | arohner_ | how much do you care about maliciousness? |
| 16:04 | the-kenny | Licenser: Why not do it like clojurebot? |
| 16:04 | Chousuke | the-kenny: Clojurebot is not very safe. |
| 16:04 | Licenser | the-kenny: because that would also limit the server itself to run certein functions when I'm not mistaken |
| 16:05 | Licenser | arohner_: It sould be not like a open door :P |
| 16:05 | ordnungswidrig | Licenser: i would surely pool some jvms with strict java policy and jail them in chroots. |
| 16:05 | Chousuke | the-kenny: you can't take over the system it runs on, but you can make the JVM it runs on pretty much use its maximum allotted resources. |
| 16:05 | knuckolls | pjackson: there was an article on hn about deploying compojure websites earlier today. http://briancarper.net/blog/deploying-clojure-websites |
| 16:05 | ordnungswidrig | Licenser: you can distribute the requests using some mq like rabbitmq |
| 16:05 | Licenser | ordnungswidrig: sounds like a good start |
| 16:06 | hiredman | the other option is writing an interpreter |
| 16:06 | Chousuke | Licenser: write a clojure interpreter and disable the . special form except for core functions! |
| 16:06 | Chousuke | Licenser: then you can easily interrupt any rogue clojure code. |
| 16:06 | Licenser | Chousuke: I run a solaris under it, so I can limit exessive use of system resources |
| 16:06 | Licenser | Chousuke: and we'd have clojure in clojure :P |
| 16:06 | ordnungswidrig | are there distributed agents for clojure? |
| 16:07 | Chousuke | Licenser: yeah, but you need to restart the JVM still :/ |
| 16:07 | ordnungswidrig | Licenser: …the wholy grail: cinc |
| 16:07 | Chousuke | a clojure interpreter would not be cinc :) |
| 16:07 | pjackson | A repl to live seems like a bad idea... doesn't it? |
| 16:07 | ordnungswidrig | chouser: i know. |
| 16:07 | Chousuke | well, it would be, but I want a compiler ;/ |
| 16:07 | Licenser | heh I'll go with a mission specific interpreter - sory |
| 16:08 | ordnungswidrig | will jvms of recent java versions share memory? I remember some vm options. So that if multiple jvms run the same libs they don't all have a copy of the code in mem? |
| 16:08 | jlongster | Is eval in clojure limited to the clojure.core namespace, or can I eval inside a different namespace? |
| 16:09 | ordnungswidrig | that was java -Xshare:on |
| 16:09 | Chousuke | jlongster: eval happens in whatever namespace you're in |
| 16:10 | Chousuke | jlongster: and in whatever environment :P |
| 16:10 | Chousuke | can't access locals though. |
| 16:11 | jlongster | Hm, for some reason *ns* was clojure.core when I tried, but that must have been something else |
| 16:11 | Licenser | then a interpreter it shall be! |
| 16:13 | Licenser | but first some other things |
| 16:44 | lpetit | Chousuke: but preventing user code to use the . special form, thus limiting the access of any method/static field of any java class for all users is ... rather restrictive ! How do you make your String uppercase ? |
| 16:45 | lpetit | Chousuke: and also, you'll have to prevent the user from jumping into the clojure.core ns and defining all his functions in there ... :-p |
| 17:41 | xster | test 1 2 3 |
| 17:41 | the-kenny | xster: Test passed |
| 17:41 | xster | kewl! |
| 17:42 | xster | whendo people get together to talk about clojure? |
| 17:42 | JonSmith | right now |
| 17:42 | JonSmith | here |
| 17:42 | xster | Well, I'm a newbie. But I really like what I've read about clojure |
| 17:43 | xster | I come from a C, Java, Smalltalk background |
| 17:43 | xster | I've over the years tried to learn Lisp and Scheme, but did not get very far, I'm afarid. |
| 17:43 | xster | I'd like to become proficient in clojure though |
| 17:44 | xster | Any tips for someone like me? |
| 17:44 | JonSmith | i feel the same way |
| 17:44 | JonSmith | except i come from lisp and am bad at c and java |
| 17:44 | hiredman | you could do some analysis of the logs to discover peak #clojure times |
| 17:45 | xster | Well, as a Lisper, i think you're certainly one up on me |
| 17:45 | JonSmith | well remember that java libraries are like clojure libraries |
| 17:45 | JonSmith | so you can just plug them in pretty much |
| 17:45 | xster | @hiredman: interesting. I'm new to IRC as well. how do I read the logs of previous IRC chats? |
| 17:46 | ohpauleez | xster: http://clojure-log.n01se.net/ |
| 17:46 | arj_ | any good tips for easy profiling in clojure? |
| 17:47 | xster | @ohpauleez: Thanks! |
| 17:47 | ohpauleez | xster: totally welcome |
| 17:47 | xster | @JonSmith: have you had experience with Genera or Symolics Lisp? |
| 17:48 | JonSmith | nope! |
| 17:48 | arj_ | I'm looking for something like (profile *something) |
| 17:48 | JonSmith | just writing application code in old(e) versions of common lisp |
| 17:48 | JonSmith | like gold hill lisp 4! |
| 17:49 | gravity | arj_: I've heard that using the jvm's profiling flags is good, but I've not done it myself |
| 17:49 | arj_ | gravity: thanks |
| 17:49 | ohpauleez | xster: to answer your question, read these: http://java.ociweb.com/mark/clojure/article.html http://en.wikibooks.org/wiki/Clojure_Programming/By_Example |
| 17:50 | ohpauleez | and hang out in here for a week or so |
| 17:50 | ohpauleez | and you'll be up to speed in no time |
| 17:50 | JonSmith | and write code |
| 17:50 | JonSmith | write lots of code |
| 17:51 | ohpauleez | Also it helps to watch the screencasts on clojure.org |
| 17:51 | JonSmith | writing > reading |
| 17:51 | ohpauleez | agreed |
| 17:52 | xster | Thanks guys!. Those are great tips. |
| 17:53 | xster | Since I'm used to Smalltalk, I've come to appreciate the value of a good development environment, and the usefulness of using an image. How good are Common Lisp IDEs such as LispWorks or Genera? I'm sure clojure is still too new to have as good a development environment. |
| 17:53 | arj_ | xster: Emacs |
| 17:53 | the-kenny | xster: Clojure has an excellent development environment: Emacs together with Slime :) |
| 17:54 | JonSmith | i didn't know you could get genera beyond emulation |
| 17:54 | the-kenny | (Slime has it's roots in Common Lisp, but it's expandable) |
| 17:55 | xster | emacs? *cough* I was hoping for more Smalltalk tools such as the browser, inspector, and debugger. One can code in the debugger. |
| 17:55 | ohpauleez | xster: I think both emacs and vim are great for clojure. Clojure is the first lisp I use vim with |
| 17:55 | mebaran151 | what's the best way to get the arity of a function object? |
| 17:55 | the-kenny | xster: You have a browser, a repl and an inspector in emacs :) |
| 17:55 | gravity | O |
| 17:56 | ohpauleez | xster: there is a plugin for netbeans, and I think someone may have an eclipse plugin |
| 17:56 | gravity | I've not seen the coding inside the debugger thing anywhere but smalltalk |
| 17:56 | the-kenny | gravity: You mean something like redefining functions while stepping in the debugger? |
| 17:57 | gravity | xster: There is an inspector in the clojure.inspector namespace |
| 17:57 | the-kenny | That's possible with Slime in Common Lisp, but sadly not in Clojure |
| 17:57 | gravity | the-kenny: Yeah |
| 17:57 | gravity | Ah, neat |
| 17:57 | ohpauleez | mebaran151: no idea, but if you get reflection on it, you may find a field for that sort of thing |
| 17:57 | the-kenny | gravity: There's also a really cool inspector in slime :) C-c I |
| 17:58 | the-kenny | mebaran151: It's possible if you can get the metadata of the var, like #'+. I don't think there is a way with function-objects |
| 17:58 | gravity | the-kenny: Cool! I'll play with that some more later |
| 17:58 | the-kenny | (functions don't have metadata in clojure) |
| 17:58 | gravity | I really need to dig in to slime. I know I'm barely using it |
| 17:58 | mebaran151 | seems like there should be a way to reflect that |
| 17:59 | mebaran151 | I'm trying to figure out a functional way to wrap Netty that doesn't make people cry |
| 17:59 | the-kenny | gravity: If you use a frequent version of swank-clojure (1.1.0), you can also do -x swank-list-threads and kill java-threds from there :) |
| 17:59 | technomancy | xster: if you're hoping for smalltalk-like support, every language is going to disappoint you. |
| 17:59 | the-kenny | Uhm.. M-x ... |
| 17:59 | JonSmith | m-x smalltalk-mode? |
| 18:00 | gravity | oooooh.... I could use some thread control. |
| 18:00 | gravity | Too much stuff! |
| 18:00 | mebaran151 | I wonder if ti was possible to somehow integrate metadata and annotations |
| 18:01 | mebaran151 | modern Java has moved toward using annotations, which make interoperability with clojure a little bit more problematic |
| 18:01 | xster | @technomancy: You may be right. |
| 18:02 | technomancy | the-kenny: list-threads is really slick; thanks! |
| 18:02 | the-kenny | technomancy: I'm glad I can help :) |
| 18:02 | xster | I've head thoughthat genera from Symbolics was the most productive Common Lisp environment around. Don't know if it's true or how well it stacks up against Smalltalk. |
| 18:03 | the-kenny | technomancy: I would like to implement more things like the thread-list, but it's kind of hard to find missing features. Any suggestions? |
| 18:04 | technomancy | the-kenny: there's a TODO in swank-clojure. =) |
| 18:04 | JonSmith | hum, can't find any symbolics machines on ebay |
| 18:04 | technomancy | prompting for insertion of :import lines when you try to refer to an unqualified Java class would be a great feature. |
| 18:04 | technomancy | also making M-. work for namespaces |
| 18:05 | the-kenny | technomancy: Ah :) Cool, and even in org-mode. I'll take a look. |
| 18:05 | xster | @JonSmith: yeah, they're like moon rocks. however genera can be run in an emulated Dec Alpha environment |
| 18:06 | arj_ | how does a dosync inside another dosync work? |
| 18:06 | JonSmith | i think i just found a moon meteorite on ebay though :-P |
| 18:06 | arohner_ | arj_: the transaction happens at the end of the outermost dosync |
| 18:07 | arj_ | arohner_: ah, cool. That is perfect for composability |
| 18:07 | arohner_ | arj_: that's the plan :-) |
| 18:07 | arj_ | sweet! |
| 18:07 | arj_ | thanks arohner_ |
| 18:07 | arohner_ | np |
| 18:08 | the-kenny | technomancy: hm.. looks like slime-list-threads is broken in Emacs 22 too :( |
| 18:21 | Licenser | hmm I know there is an easy way to write a function that returns an unique id in clojure but I'm just too stupid to think of it :( |
| 18:22 | rhickey | ,(gensym) |
| 18:22 | clojurebot | G__5824 |
| 18:22 | rhickey | ,(gensym) |
| 18:22 | clojurebot | G__5828 |
| 18:22 | rhickey | or use UUIDs |
| 18:22 | ohpauleez | rhickey: Update the copyright on the bottom of clojure.org |
| 18:22 | Licenser | I |
| 18:22 | Licenser | I |
| 18:22 | Licenser | argh sorry |
| 18:23 | rhickey | ohpauleez: done - thanks |
| 18:23 | Licenser | I'd mean something like a function that returns 1, 2, 3 ... for every call - I saw an example somewhere |
| 18:23 | Licenser | on the other hand uuid's are just fine too |
| 18:24 | rhickey | ,(gensym "") |
| 18:24 | clojurebot | 5832 |
| 18:24 | rhickey | ,(gensym "") |
| 18:24 | clojurebot | 5836 |
| 18:24 | Licenser | rhickey: that is briliant |
| 18:25 | ohpauleez | rhickey: np, noticed it today |
| 18:25 | the-kenny | A |
| 18:25 | the-kenny | Oops |
| 18:26 | Licenser | I really enjoy clojure more and more as I use it |
| 18:35 | mebaran151 | anybody know any good libraries for something akin to binary json to efficiently send some clojure data structures between processes? |
| 18:35 | bradford | anyone had class not found issues in emacs/slime with genclassing? |
| 18:36 | Knekk | mebaran151: something like Thrift? |
| 18:36 | mebaran151 | something like Thrift without the whole fixed schema precompiling |
| 18:36 | hiredman | someone did a clojure implementation of bert |
| 18:36 | mebaran151 | I'd like to take a hash map and send it down river |
| 18:36 | patrkris | question concerning clojure.contrib.http.agent: how do I specify headers to (http-agent ...) without having to calculate the request length manually? |
| 18:36 | hiredman | ~google clojure bert |
| 18:36 | clojurebot | First, out of 465 results is: |
| 18:36 | mebaran151 | bert? |
| 18:36 | clojurebot | trotter's bert-clj at master - GitHub |
| 18:36 | bradford | I've found that I have to stick requires for all the ns'es that i use before i import the gen'd classes |
| 18:36 | clojurebot | http://github.com/trotter/bert-clj |
| 18:37 | Knekk | with Thrift you can just send a hashmap, simple schema |
| 18:37 | mebaran151 | do I have to run a precompilation stage though? |
| 18:37 | mebaran151 | I'd be happy to use thrift, but I'd prefer not to go through all the code genning |
| 18:38 | mebaran151 | especially 'cause I have to write an actionscript adapter too, and last I looked thrift and as3 weren't best buddies |
| 18:38 | Knekk | dunno then |
| 19:16 | konr | Guys, what do I need to do to make swank find swank.clj? I'm getting the 'java.io.FileNotFoundException: Could not locate swank/swank__init.class or swank/swank.clj on classpath: (NO_SOURCE_FILE:0)' despite having its directory on the swank-clojure-extra-classpath |
| 19:17 | the-kenny | konr: I would suggest using leiningen in combination with swank-clojure-project. It's dead-easy and very cool |
| 19:19 | konr | the-kenny: hmm, what do I need to set in order to use it? I tried it here and slime was loading sbcl, haha |
| 19:20 | the-kenny | konr: Here is the readme for leiningen: http://github.com/technomancy/leiningen/blob/master/README.md After you ran "lein deps", you can just fire a repl in emacs with M-x swank-clojure-project |
| 19:20 | the-kenny | All classpaths etc. are set correctly according to the project. |
| 19:22 | ieure | +1. I use it, and it rocks. |
| 19:24 | Licenser | out of curiosity is a vector faster at sorting then a list? |
| 19:25 | konr | even that doesn't work. I guess that I'm having some problem with the versions |
| 19:26 | the-kenny | konr: What's the error if you use leiningen? |
| 19:27 | the-kenny | Have you added [swank-clojure "1.1.0"] to the list of dev-dependencies? :dev-dependencies [[swank-clojure "1.1.0"]] |
| 19:29 | konr | the-kenny: yes, and it was working in another box. The error is the same, and happens after I use swank-clojure-project - 'java.io.FileNotFoundException: Could not locate swank/swank__init.class or swank/swank.clj on classpath: (NO_SOURCE_FILE:0)' |
| 19:31 | konr | the-kenny: the swank-clojure jar in lib/ also seems to be valid |
| 19:31 | the-kenny | konr: That's strange |
| 19:45 | konr | the-kenny: do you set any variable or configure emacs in some way, besides requiring swank-clojure and clojure, to use swank-clojure-project? I've noticed that I don't get an error without the (clojure-slime-config) line (although in this case it loads the wrong lisp). |
| 19:46 | the-kenny | konr: In fact, I don't even require swank-clojure explicitly, as it's managed by elpa. |
| 19:46 | the-kenny | konr: And no, I don't set any additional vars. |
| 19:47 | the-kenny | konr: I use swank-clojure only in combination with leiningen. I've never bothered with setting additional variables. |
| 19:57 | rdsr | Hi all, is there a good way to convert between a java map (e.g. Hashtable) to clojure persistent arraymap |
| 19:58 | rdsr | I ask this because I cannot read values from hashtable the way I can from clojure maps |
| 19:59 | rdsr | like (map key) |
| 19:59 | technomancy | (into {} my-hash-table) maybe |
| 19:59 | rdsr | oh ok thk technomancy |
| 20:12 | poet | what should be used instead of (gen-and-load-class)? |
| 20:12 | poet | as that macro was removed |
| 20:13 | Chousuke | :gen-class in the ns form |
| 20:14 | Chousuke | (doc gen-class) |
| 20:14 | clojurebot | "([& options]); When compiling, generates compiled bytecode for a class with the given package-qualified :name (which, as all names in these parameters, can be a string or symbol), and writes the .class file to the *compile-path* directory. When not compiling, does nothing. The gen-class construct contains no implementation, as the implementation will be dynamically sought by the generated class in functions in an impleme |
| 20:14 | Chousuke | see that, and also see (doc ns) |
| 20:31 | mebaran151 | why don't function objects support metadata? |
| 20:33 | ctdean_ | What's the difference between the elpa version of slime and the one from common-lisp.net ? |
| 20:37 | the-kenny | ctdean_: The one from elpa is just slime on the emacs-side. The other side (swank) needs to be installed seperatedly by the dependency-manager of your backend. |
| 20:37 | the-kenny | ctdean_: The one from common lisp should bring a bunch of .lisp-files for different common lisp implementations and some contrib modules with it |
| 20:38 | ctdean_ | the-kenny: it looks like all the slime/contrib stuff is missing too |
| 20:39 | the-kenny | Yes, the contrib stuff is missing. But most people only use one or two modules from there (usually repl and fancy) and it's no problem to install them by hand |
| 20:39 | the-kenny | (slime-repl is also in elpa) |
| 20:40 | the-kenny | Maybe someday more and more of these contrib-stuff will be in elpa when it's integrated in emacs |
| 20:41 | ctdean_ | I see (I use 6 from contrib myself) |
| 20:41 | hiredman | mebaran151: (with-meta a m) evaluates to a new thing, a-prime with the metadate m, doing this with functions is slightly more complicated and some choices have to be made (regarding function identity and equality, closed over values, etc) and rather than make those choices, fn's just don't support metadata for now |
| 20:42 | mebaran151 | but technically, there could be a with-meta! that just added a hash-map to the field |
| 20:42 | ctdean_ | There also seems to be enough of a version skew that the latest cvs slime doesn't work with the lein swank server |
| 20:42 | technomancy | ctdean_: that's correct, you can't use cvs slime with clojure at all |
| 20:43 | ctdean_ | This is going to wreak havoc with my CL development |
| 20:43 | technomancy | I'd love help bringing the clojure side up to date, but I don't have time to do it myself |
| 20:44 | hiredman | mebaran151: fortunately this is not a technical decision, but a design decision |
| 20:44 | ctdean | <--- irc client keeps crashing :( |
| 20:44 | technomancy | ctdean: I'd love help bringing the clojure side up to date, but I don't have time to do it myself |
| 20:45 | mebaran151 | it would be nice to have it for Strings to, but I understand why their implementation might be problematic |
| 21:32 | poet | is there a way to force a member of a structure to be a certain type? |
| 21:40 | chouser | nope |
| 21:44 | chouser | but that's the kind of thing that deftype can do for you ("new" branch) |
| 21:58 | konr | Is there a clojure.contrib cheatsheet? |
| 22:02 | djork | How would you like to edit Clojure on your iPhone :) |
| 22:02 | djork | without typing much |
| 22:05 | aking | djork: I got clojure running on the iphone with jamvm - but it took about 20s to show the repl |
| 22:05 | djork | I'd want to run the code remotely |
| 22:05 | djork | over HTTP/S |
| 22:05 | djork | or whatever transport |
| 22:05 | aking | ohh.. that's different then |
| 22:06 | djork | but I am interested in building an S-expression editor |
| 22:06 | mebaran151 | djork, I'm also considering building a clojure editor in clojure |
| 22:07 | djork | that would be fun |
| 22:07 | mebaran151 | I'm thinking of layering it on top of neo4j actually |
| 22:07 | djork | a Dr Scheme for Clojure |
| 22:07 | aking | I saw someone writing an emacs like editor in javascript - you could probably use that as a base |
| 22:07 | mebaran151 | and connecting depending fn's as nodes |
| 22:07 | mebaran151 | at the end I'd just output all the files in whatever configuration you wanted |
| 22:08 | mebaran151 | so ns reorganization would be fast |
| 22:09 | djork | neo4j... not familiar |
| 22:09 | djork | ah, graph database |
| 22:09 | mebaran151 | i've always thought it would be cool if one could cherrypick fn's from projects, if we weren't bound to libraries as they existed but only as they relied on other fn's |
| 22:09 | djork | cool |
| 22:09 | mebaran151 | yeah it's a graph db |
| 22:09 | chouser | djork: I want |
| 22:10 | mebaran151 | yeah I think it would be cool too |
| 22:10 | djork | working on it as we speak |
| 22:10 | mebaran151 | you might be able to use some of the code I'm writing now, connecting netty to evaluate s expressions |
| 22:11 | mebaran151 | I wish I had an iPhone :( |
| 22:11 | djork | no you don't |
| 22:11 | djork | AT&T sucks and it's expensive :) |
| 22:11 | mebaran151 | I have ATT |
| 22:11 | djork | If I wasn't working for an iPhone shop I wouldn't have one |
| 22:11 | mebaran151 | but no iPhone |
| 22:11 | chouser | so expensive. I wouldn't have one if I had to pay for it. |
| 22:11 | djork | I DO have to pay for it |
| 22:11 | mebaran151 | I got a Blackberry Bold, which is actually a neat little device |
| 22:11 | djork | that's the shitty part |
| 22:11 | mebaran151 | I haven't gotten a chance to whack clojure on it |
| 22:11 | djork | yeah those aren't bad at all |
| 22:12 | mebaran151 | I like it for typing |
| 22:12 | mebaran151 | I'd actually love to have a dev environment for it |
| 22:12 | somnium | djork: have you seen ymacs? |
| 22:12 | chouser | I don't like typing on the iphone, though I guess it's slight better than graffiti |
| 22:12 | mebaran151 | I didn't mind graffiti |
| 22:13 | mebaran151 | could Clojure run on an BlackBerry Bold |
| 22:13 | mebaran151 | it's got a beefy little processor, and I think everything RIM does is Java Tastic |
| 22:13 | chouser | no, not terrible. typing on the iphone is better though |
| 22:13 | djork | chouser: as little typing as possible would be the goal |
| 22:13 | djork | lists of fns |
| 22:13 | mebaran151 | djork, that would be generally useful for all mobile phones |
| 22:13 | chouser | right. auto-completing keywords. oh, sure, lists |
| 22:13 | djork | yes |
| 22:14 | djork | writing code and other things like SSH clients suck horrendously on mobile devies |
| 22:14 | djork | devices |
| 22:14 | hiredman | mebaran151: bb's still only have j2me |
| 22:14 | mebaran151 | j2me can't run Clojure? |
| 22:14 | hiredman | j2me is a complete waste |
| 22:14 | hiredman | nope |
| 22:14 | mebaran151 | I thought j2me was j2se without swing and stuff |
| 22:14 | hiredman | nope |
| 22:14 | mebaran151 | oh |
| 22:14 | mebaran151 | I know nothing of phone dev land |
| 22:14 | hiredman | j2me is like java 1.3 or 1.4 |
| 22:15 | mebaran151 | I just thought it would be cool to hack clojure on my blackberry |
| 22:15 | mebaran151 | and clojure probably needs 1.5 for generic support |
| 22:15 | hiredman | it would, if someone would release a phone that actually ran java |
| 22:15 | hiredman | mebaran151: nope |
| 22:15 | mebaran151 | nope? |
| 22:15 | hiredman | it needs 1.5 for the Collections api mostly |
| 22:15 | hiredman | clojure doesn't care about generics |
| 22:15 | mebaran151 | I thought the collections api was from way back when |
| 22:16 | mebaran151 | which is why it was so badly designed |
| 22:16 | hiredman | thats possible |
| 22:18 | mebaran151 | I thought Dalvik was basically j2me but with different bytecode and reinvented by google |
| 22:18 | hiredman | it's more like standard java with a different bytecode |
| 22:19 | djork | dalvik, yech |
| 22:19 | hiredman | (the developement environments for j2me are hellish as well) |
| 22:19 | djork | the dalvik compilation step can get nasty if you have bad 3rd-party jars |
| 22:20 | hiredman | palm's phones apparently come with apache's jre |
| 22:20 | hiredman | harmony |
| 22:22 | djork | that's pretty good |
| 22:22 | djork | better than most |
| 22:22 | djork | but basically, whenever I see the Java logo come up on a phone I know I am going to be waiting a while |
| 22:22 | djork | and not just at startup |
| 22:22 | djork | every button press, and even shutdown, is painful |
| 22:33 | mebaran151 | sigh |
| 22:33 | mebaran151 | I wonder if Clojure in Clojure could actually help the mobile phone scene |
| 22:34 | mebaran151 | though concurrency isn't a huge issue for phones yet |
| 22:35 | KirinDave2 | mebaran151: Distribution is, tho. |
| 22:35 | mebaran151 | oh yeah, I couldn't even tell you how to load a program on my blackberry |
| 22:36 | mebaran151 | I think Adobe AIR actually might help this a great deal if they get the whole Open Mobile thing to work out |
| 22:36 | mebaran151 | Adobe products always make deployment trivially easy |
| 22:52 | alexyk | chouser: ping |
| 22:53 | chouser | hiredman: |
| 22:53 | chouser | er |
| 22:53 | chouser | hi |
| 22:53 | chouser | :-) |
| 22:54 | alexyk | so I'm using your sorted-seq-merge from yesterday, which was toy-tested for int seqs and uses (< x y). But the real data is java.util.Date, which is compared with: (< (.compareTo (first a) (first b)) 0) |
| 22:54 | alexyk | unless there's a prettier way equivalent to < |
| 22:54 | alexyk | how do we parameterize sorted-seq-merge with the sorting predicate, defaulting to < ? |
| 22:55 | chouser | hmmm |
| 22:57 | alexyk | kind of tests the whole dynamic typing :) |
| 22:57 | alexyk | i.e., the literal (< x y) -- works only for numbers? |
| 22:59 | chouser | yes, apparently for performance reasons |
| 23:00 | chouser | all fns implement .compare -- I'm trying to think if that would be useful. |
| 23:00 | alexyk | the question is, do I really have to specialize per type, e.g. sorted-date-seq-merge, or there's an efficient way to parameterize |
| 23:00 | alexyk | simplest case is numbers and strings |
| 23:02 | chouser | I guess it'd be reasonable to accept 2 or 3 args, [comparator a b] |
| 23:05 | chouser | use (.compare comparator (first a) (first b)), comparator can default to < |
| 23:05 | alexyk | chouser: would it be as efficient as hard-coded < for numbers? And how do I syntactically write the default to < ? |
| 23:07 | chouser | < is faster for unboxed numbers, but these will all be boxed. |
| 23:07 | chouser | ...so I dunno. It seems plausible to me that hotspot could make it about as fast. I guess you'd have to test it. |
| 23:09 | alexyk | chouser: the minor question remains, how to do default. Check if comparator is given in an (if ...)? |
| 23:09 | alexyk | (if comparator (.compare ...) (< ...))? |
| 23:09 | chouser | no, < implements .compre |
| 23:10 | chouser | as do all two-arg clojure fns :-) |
| 23:10 | alexyk | ok; so how'd I give < as a parameter? |
| 23:17 | lisppaste8 | Chouser annotated #93006 "three-arg sorted-seq-merge" at http://paste.lisp.org/display/93006#1 |
| 23:29 | chouser | ha! don't use that version |
| 23:30 | chouser | my recursive calls weren't including the new arg |
| 23:35 | GeekyCoder | :) |
| 23:38 | lisppaste8 | Chouser annotated #93006 "fixed it" at http://paste.lisp.org/display/93006#2 |
| 23:39 | chouser | alexyk: there you go. Could use a type hint on 'c' if you care about performance |
| 23:40 | chouser | could also try to build a chunked seq instead of one-at-a-time. Dunno how well that would go. |
| 23:40 | chouser | off to bed. |
| 23:43 | alexyk | thanks much! |
| 23:44 | alexyk | gonna try |