#clojure log - Jul 09 2012

The Joy of Clojure
Main Clojure site
Google Group
List of all logged dates

0:01 ro_st: emezeske: looking at cljs-build's multiple build configurations. can i build two distinct code-trees in parallel with this feature?

0:02 say a base app and a module that may or may not be loaded at runtime?

0:02 if so, is there any support for generating externs in the one based on the exports of the other?

0:07 emezeske: ro_st: I... let me think about that

0:08 ro_st: You can definitely supply multiple trees, and they will both be on the classpath

0:08 ro_st: ok so it'll build both, but not do anything about allowing the two to run side-by-side in the same VM

0:09 emezeske: ro_st: I'm not sure what you mean by side by side

0:09 ro_st: as in the case with a base app (js 'binary') loading another module of code (also a js 'binary') into memory and calling into it

0:10 the base app would need to be compiled with a set of externs that correspond to the exports of the module

0:10 emezeske: ro_st: ah, no, AFAIK if you produced two output js files with lein-cljsbuild, from two separate trees, the output files would each include any code from the other that was called

0:11 ro_st: I think you'd have to supply your own externs file, and mark public things in the base library with ^:export

0:12 ro_st: In otherwords, no help from lein-cljsbuild :)

0:12 ro_st: and make sure that when compiling the module that it uses the externs instead of the actual base code

0:12 if it can find both an actual namespace and that namespace is in externs, which gets precedence?

0:12 emezeske: ro_st: yeah, you couldn't use the (ns ...) form to hook up to them

0:12 hah, you've got me stumped on that one.

0:12 ro_st: right, it'd have to be a call directly to js, using js/symbol?

0:13 emezeske: ro_st: yeah, AFAIK

0:13 ro_st: i can live with that

0:13 emezeske: I'm definitely not certain there's no other way

0:13 ro_st: forces me to think about that api super carefully

0:13 emezeske: But that is the only way I can think of :)

0:13 ro_st: i'm going to stub this out and see what happens

0:14 emezeske: cool, that's an interesting use case

0:14 wingy: is it recommended to always use loop/recur instead of calling the fn when recursing?

0:14 ro_st: in my case, the module is actually 95% static content and 5% logic, and you can only have one loaded at a time

0:14 wingy: due to TCO

0:14 ro_st: wingy: recur doesn't add a call to the stack

0:14 so you don't blow the stack on long recursions

0:14 wingy: ro_st: so it's recommended even on short recursions?

0:15 emezeske: wingy: I've found that often when I think I need a loop/recur, I can rewrite as a reduce

0:15 wingy: emezeske: nice

0:15 emezeske: I tend to find reduce more readable than loop/recur, but I guess that's personal taste?

0:16 ro_st: madsy: looks like lein-cljsbuild's crossover support gives me what i want

0:17 madsy: ro_st: Yeah, I've just started using it, so I don't know exactly how easy it is.

0:17 ro_st: looks fairly straightforward. i'm so totally nowhere near ready to write macros, so i'm not worried about that aspect of it

0:19 madsy: ro_st: If you want some crappy cljs code to play with: https://gist.github.com/3062242

0:20 ro_st: in the cljs repl, in dev mode, i can do everything i usually could in a repl? define new fns, overwrite existing vars, etc?

0:20 madsy: sure

0:20 wingy: i read a whole chapter in a book without quite getting why i would need atom .. the http://en.wikibooks.org/wiki/Clojure_Programming/Examples/Cookbook made me getting it with one line: "How to write x = x+ 1" :)

0:21 ro_st: it's when you go advanced that everything is statically compiled and you lose this capability

0:21 madsy: interesting. webgl. never played with it before

0:27 is there some sort of a cheatsheet for cljs, kinda like clojure.org/cheatsheet?

0:28 zerokarmaleft: ro_st: http://himera.herokuapp.com/index.html

0:28 ro_st: oh of course! thank you

0:34 emezeske: how do i teach cljsbuild how to find Firefox on osx?

0:35 i'm getting "Error in background process: #<IOException java.io.IOException: Cannot run program "firefox": error=2, No such file or directory>"

0:35 when running "lein trampoline cljsbuild repl-launch firefox http://localhost:3000/repl-demo"

0:35 on your advanced sample project

0:44 ToxicFrog: What is the best way to define an anonymous function returning its second argument?

0:44 #(%2) tries to call its second argument, which is not what I want

0:44 ro_st: #(-> %2) maybe?

0:44 amalloy: (fn [x y] y)

0:45 you can mess with #() syntax if you want, but it hardly saves you any characters and looks silly

0:45 dnolen: or (fn [_ x] x)

0:46 amalloy: wingy: as long as its tail recursion, recur is preferred to calling the function directly

0:46 dnolen: sure. depends whether you want to document/reinforce why you're ignoring the first one

0:47 emezeske: ro_st: I don't know much about OSX, does it have a $PATH variable in the shell?

0:47 ro_st: it does

0:48 so it's just trying to call 'firefox'?

0:48 emezeske: ro_st: Maybe "export PATH=/parent/dir/of/firefox:$PATH" ?

0:48 I believe so

0:48 You could always change it to an absolute path in the project.clj

0:50 ro_st: the first arg in the vector?

0:50 emezeske: yeah

0:50 ro_st: cool

0:50 wingy: amalloy: ok

0:54 ro_st: emezeske: fyi, for the next person: instead of "firefox", use "/Applications/Firefox.app/Contents/MacOS/firefox-bin"

0:54 i'm guessing there's no easy way to run this repl from within emacs?

0:58 evildaemon: Okay, what am I doing wrong in this code? (Besides the horrible abuse of function parameters.)

0:58 http://pastebin.com/Szg6zwBe

0:59 (I'm going to go ahead a preface this with "I kind of suck."

0:59 )

1:00 technomancy: ro_st: OS X has all kinds of issues with PATH on gui-launched emacs

1:00 the official fix involves mucking with an XML plist file =(

1:01 evildaemon: technomancy: If he's on OS X, why not just distribute a patch file?

1:02 technomancy: a patch for de-fubaring the PATH?

1:02 emezeske: ro_st: :)

1:03 ToxicFrog: ,(- 2 1)

1:03 clojurebot: 1

1:03 technomancy: evildaemon: (do) is just nil

1:04 evildaemon: technomancy: I know.

1:04 technomancy: It wouldn't take nil because it's not a function.

1:05 technomancy: do isn't a function either

1:06 ToxicFrog: asdfghl

1:06 evildaemon: technomancy: Special form.

1:06 ToxicFrog: There's the problem

1:06 (split-lines "\n") returns [] rather than ["" ""]

1:06 technomancy: evildaemon: I don't know what you're doing there, but I'm pretty sure there's no need for (do)

1:07 amalloy: i can't think of a reason tot est whether j is even in a fib impl

1:07 ToxicFrog: ,(split-lines "asdf\n\nfdsa")

1:07 clojurebot: #<CompilerException java.lang.RuntimeException: Unable to resolve symbol: split-lines in this context, compiling:(NO_SOURCE_PATH:0)>

1:08 ToxicFrog: ,(clojure.string.split-lines "asdf\n\nfdsa")

1:08 clojurebot: #<CompilerException java.lang.RuntimeException: java.lang.ClassNotFoundException: clojure.string.split-lines, compiling:(NO_SOURCE_PATH:0)>

1:08 ToxicFrog: ,(clojure.string/split-lines "asdf\n\nfdsa")

1:08 clojurebot: ["asdf" "" "fdsa"]

1:08 ToxicFrog: what

1:08 evildaemon: amalloy: It's not a test for j, it's to do the second euler problem.

1:08 ToxicFrog: ,(clojure.string/split-lines "asdf\n\n")

1:08 clojurebot: ["asdf"]

1:08 amalloy: oh, you're trying to get all the even fibs

1:08 ToxicFrog: WHAT

1:08 This is nonsense

1:09 evildaemon: technomancy: You're right. I just needed a way to return nil and got lazy.

1:09 amalloy: you don't need a way to return nil either. you just want to return k

1:10 technomancy: ,((partial constantly nil))

1:10 clojurebot: #<core$constantly$fn__2351 clojure.core$constantly$fn__2351@4a2cf11b>

1:10 ToxicFrog: ,(clojure.string/split-lines "\n\nasdf")

1:10 clojurebot: ["" "" "asdf"]

1:10 technomancy: ,(((partial constantly nil)))

1:10 clojurebot: nil

1:10 evildaemon: amalloy: *Stares* I'm an idiot.

1:10 ToxicFrog: AAAA WHAT IS THIS

1:10 evildaemon: amalloy: Thank you.

1:11 technomancy: ToxicFrog: Spartaaaaaa?

1:11 amalloy: ToxicFrog: if it doesn't do what you want, write a function that does?

1:11 (inc technomancy)

1:11 lazybot: what the hell. give the Dude his karma

1:11 lazybot: It's AWWWW RIGHT!

1:11 ToxicFrog: amalloy: I'm going to have to, yeah

1:11 Since split-lines completely ignores trailing newlines

1:12 This tastes like a bug

1:13 ,(clojure.string/split "\nasdf\n" #"\n")

1:13 clojurebot: ["" "asdf"]

1:15 ro_st: ToxicFrog: it's calling into java's Pattern class

1:19 ToxicFrog: Aha

1:19 re.split(s) calls re.split(s, 0)

1:19 Which brings this into play: "If n is non-positive then the pattern will be applied as many times as possible and the array can have any length. If n is zero then the pattern will be applied as many times as possible, the array can have any length, and trailing empty strings will be discarded."

1:21 ,(clojure.string/split "\nasdf\n" #"\n" -1)

1:21 clojurebot: ["" "asdf" ""]

1:24 ro_st: watching stuart sierra's evident code talk. datomic looks great

1:26 wingy: shouldn't this one return a lazy seq: (def integers (iterate inc 0)) . i can't figure out why my processor is overworking when i run that line

1:28 technomancy: works for me

1:30 ToxicFrog: Ok, so this is a Java bug, not a Clojure bug~

1:31 wingy: technomancy: get it now, it doesn't work on Light Table .. one reason could be that it's running clj 1.5, another that it's trying to realize the infinite lazy sequence

1:32 but that latter makes more sense

1:35 technomancy: weird, why would it try to realize the value of the var returned? that's kind of crazy =\

1:37 wingy: technomancy: light table has to print out something for us to see to the right

1:37 so that we know what values are in the sequence

1:37 technomancy: the whole point of def returning a var is so that this doesn't happen

1:38 so it's kinda going out of its way to defeat Clojure's built-in workaround for this problem

1:40 wingy: (def ll (range 3)) prints out in Light Table (def (0 1 2) (range 3))

1:42 it seems to handle (def ll (range)) fine and less fine with custom fns for constructing values in lazy seqs

2:21 noidi: I'm using CCW and "navigate to definition" (F3) only works on my project's dependencies, but not on my own code

2:22 any idea how to fix this?

3:02 fureddo: I have a constructor function called create-item. I would like to inialize a list with 10 items, 5 items of type a and 5 items of type b. How can I do that? I'm trying (list (dotimes [_ 5] (create-item 'a)) (dotimes [_ 5] (create-item 'b))) It doesn't work because dotimes always returns nil.

3:08 _ulises: fureddo: just return a vector/list/etc with something like (map (fn [] (create-item 'a)) (range 5))

3:08 pyrtsa: Something like (concat (take 5 (repeatedly create-item)) ...)

3:08 _ulises: pyrtsa: I suspect that the 'a and 'b are params that denote the type being created though

3:08 pyrtsa: otherwise, +1 on yours

3:08 pyrtsa: _ulises: Right.

3:09 Ha, you can give the count to repeatedly directly!

3:09 alexey: repeatedly takes number as parameter, like (repeatedly 5 create-item)

3:10 fureddo: I think that _ulises's answer is ok for my needs, I will try it in a moment.

3:10 pyrtsa: So what remains is: (concat (repeatedly 5 (partial create-item 'a)) ...)

3:10 "..." being, the same for 'b instead of 'a.

3:11 alexey: what concat does there, by the way?

3:11 oh, didn't notice ... :)

3:12 _ulises: a more contrived solution might be: (take 10 (map create-item (interleave (repeatedly (constantly 'a)) (repeatedly (constantly 'b)))))

3:13 and by contrived I mean ugly, complex and utterly pointless of course

3:13 fureddo: :-)

3:13 _ulises: if you know you need 5 and 5, stick to a something like [(map ...) (map )]

3:14 pyrtsa: _ulises: Or just (repeat 'a)

3:19 fureddo: After some tests, I think that (concat (repeatedly 5 (partial create-item 'a))) is the solution.

3:19 pyrtsa: Here's one more: (mapcat #(repeatedly 5 (partial create-item %)) ['a 'b])

3:22 ro_st: anyone using cljsbuild got an idea why i'm getting this crossover error? https://www.refheap.com/paste

3:22 erk

3:22 https://www.refheap.com/paste/3518

3:23 the namespaces all look right

3:24 alexyakushev: Could someone please explain this inconsistent behavior of type hints across different namespaces? https://www.refheap.com/paste/3519

3:26 Looks like if the hint is placed before the argument vector (rather than before the function symbol) and it is not package-qualified, then the namespace using this function should also have this class imported

3:26 amalloy: alexyakushev: the second form is only for primitive typehints

3:27 alexyakushev: amalloy: Could I read about it somewhere? I actually never saw anyone placing the hint there, though I discovered it works... most of the time

3:27 amalloy: *shrug*

3:28 alexyakushev: amalloy: So by primitive you mean the primitive types?

3:28 amalloy: yes, double and long

3:29 alexyakushev: But it still works for classes as well (if I qualify the hint class). Is it undocumented behavior then?

3:29 amalloy: as you can see, it doesn't actually work

3:29 alexyakushev: It doesn't because namespace 'bar doesn't have ArrayList imported

3:30 If I either import it, or the hint in 'foo would go like (defn make-list-2 ^java.util.ArrayList [] ....) then it works

3:30 amalloy: just...don't do it, it's not what hints there are for

3:31 alexyakushev: Yes, I know, I just have to use them a lot, Android reflection is very expensive

3:32 amalloy: that's not really relevant? just put the typehints in the right place instead of the wrong place

3:33 alexyakushev: Yes, you are right

3:33 Thank you

4:25 tozz: Any good resources on how to think about immutable data when building a web app? Coming from Ruby I wanna have a go a Clojure, but I can't wrap my head around how not changing things will work out / look in code, guess it's a mindset thing

4:26 kral: namaste

4:28 wingy: confusing that the REPL prints out a list structure when it's infact a sequence

4:28 adds confusion since it's not a list

4:29 eg. (list? (seq [1 2 3]))

4:29 ,(list? (seq [1 2 3]))

4:29 clojurebot: false

4:29 wingy: but the structure returned looks like a list .. (1 2 3)

4:30 why not have it printed out something like: 1 2 3 or whatever to tell it's a sequence, not a list

4:32 pyrtsa: wingy: I like that idea. But a lazy sequence of one element (or an empty one) might then be hard to understand.

4:32 Something like (lazy-seq [1 2 3 ...]), perhaps?

4:32 wingy: yeah that would do better

4:33 i feel that clj is a really simple and great lang, the last thing to do should be adding incidental complexities

4:33 then it would be simple for everyone to get it and thus making it even more popular

4:37 stain: anyone done EBNF parsing in Clojure? I have not found anything except fnparse - which just has 'EBNF like' rules in Clojure.

4:37 one would think that one of the first things to do with an EBNF-like parser is to write a parrser for EBNF..

4:51 augustl: does http://pastie.org/4224635 make sense?

4:52 wingy: no since there is no highlighting

4:52 use gist github next time :)

5:01 augustl: wingy: any other paste sites that highlight lisp?

5:05 wingy: augustl: why not github gist?

5:05 http://pastebin.com/

5:07 do you think that "Programming Clojure" is still a good read even though it's from 2009?

5:12 augustl: wingy: don't like the way they stick around forever

5:14 stain: wingy: why not Clojure in Action or perhaps the O'Reilly Clojure Programming?

5:14 wingy: stain: i have already read clojure programming

5:14 evildaemon: augustl: But yeah, pastebin does syntax highlighting for stuff I've never even heard of.

5:15 augustl: :D

5:15 wingy: programming clojure seems short and concise for a better coverage on basics

5:15 thought i could read joy of clojure after this one

5:16 augustl: http://pastebin.com/MnFQZUR8 !

5:16 now with colors

5:16 so, does it make sense? :)

5:16 wingy: perhaps clojure in action after that one. lets dig deep

5:20 stain: Joy of Clojure is good, but not as a first book!

5:33 arglist_und_wilk: Mist.

5:36 kral: some of the examples of The Joy of Clojure are misleading

5:36 yesterday I was reading it, trying some example

5:36 (def *test* \a) gives me a warning

5:37 then I discovered ^:dynamic

5:37 stain: yes, the book is pre 1.3 style :(

5:37 good the warning message gets you straight onto the right track

5:37 kral: it stills to be a great book, anyway

5:37 stain: sure

5:37 Raynes: The book was written pre-1.3.

5:38 wingy: they should update it for each clj version and release an updated ebook

5:38 Raynes: The examples, when written, were not at all misleading.

5:38 _nmmn: agree that its great book, maybe there are some editions planned for post 1.3 style hmm

5:38 wingy: things in programming world change so fast .. they need to iterate as well in docs

5:39 _nmmn: well depends, dont think cobol docs changed much in last decade =]]]

5:39 wingy: a waste if 90% of the things in a book is still valid but people choose the most up to date book to read since it will be 100% correct

5:40 kral: anyway, for a newbie, it can be quite discouraging when an example "fails"

5:40 wingy: yepp

5:40 reading programming clojure atm and they use defstruct

5:40 stain: yeah. But then this makes you learn the other side - reading the API docs (still horrible), etc.

5:40 _nmmn: if its easy example i think newbie gets even more info

5:40 wingy: a good thing i know its deprecated

5:41 _nmmn: and its not kind of book read-follow-forget, i prefer books that make you think learn and know =]

5:42 kral: defstruct is deprecated?

5:42 Raynes: Yes. Records are better.

5:42 kral: oh, sure

6:04 wingy: i guess that a function can be considered a value since it could be bound to a var. could one say that a function is data then?

6:06 or should one separate data (eg. numbers, strings etc) from functions

6:28 clgv: Raynes: hey Raynes. you are in the 4clojure "business" right?

6:38 Raynes: clgv: I guess.

6:38 What's up?

6:39 clgv: Raynes: I have a problem with my solutions for two problems timing out although one runs in less than 700ms for all tests and the other consumes only less than 30ms for all tests on my machine

6:40 Raynes: posted it here: http://groups.google.com/group/4clojure/browse_thread/thread/f43d0acbbc22a1bc

6:40 Raynes: All of the code given to 4Clojure runs through a sandbox. Some code takes significantly longer in the sandbox. We're not entirely sure why or how to fix it.

6:41 clgv: I guessed something like that.

6:41 Raynes: Usually you can just write the solution differently and fix it.

6:41 It's a pain in the ass.

6:42 clgv: thats difficult without feedback how long each test took and what the timeout for each test is

6:54 alexyakushev: Does anyone uses Org-mode for Github wiki pages/readmes?

6:54 *use

6:55 pyr: alexyakushev: i do

6:56 alexyakushev: pyr: I'd like to write some text in superscript but ^ is not working

6:57 pyr: Any ideas how those can be done?

6:57 pyr: ah nope, i only pushed very basic outlines

6:57 the more complicated stuff i generate with o-blog

6:58 alexyakushev: I see. Well, perhaps I would be better without them. Thanks for responding

7:26 pyr: schani: clojurec is very exciting

7:27 schani: pyr: thanks. that's why i started it ;-)

7:30 piotr_: hi

7:30 Do you know who is maintaining the clojure cheat sheet? There's a dead link in it...

7:32 The problem is with the dotdot operator. The problem is more on the ClojureDocs side in fact...

7:33 wingy: to answer my own question: fn is not data

7:33 but they are both values

7:38 clgv: wingy: LISP => Code is Data and Data is Code

7:40 ticking: clgv, in good old lisps yes, in clojure only with heavy restrictions

7:41 clgv: I didn't encounter that heavy restrictions yet

7:41 kmicu: ticking: can you give an example? :)

7:42 ticking: Code => mostly Data but Data =|=> Code

7:42 the problem is that java shines too to much for this to truly work

7:43 kmicu: ticking: but can you give an real example, wich part of clojure code is not a clojure data? :)

7:43 ticking: kmicu, seen picolisp?

7:43 clgv: I would say: Code => Data, Compiled Functions != Data

7:44 ticking: clgv, yeah but in good old lisps there is no such concept

7:45 clgv: if I remember correctly, you cant access the code of a compiled function in sbcl either...

7:46 unnali: nope, sbcl compiles to native

7:47 clisp too

7:47 most CLs, I guess.

7:49 ticking: unnali, i wouldnt call sbcl that classic either ^^ but the compilation process is rather transparent

7:49 but yeah the only lisp I know of where data is truly code and code is truly data is picolisp^^

7:56 wingy: how do i use clojure contrib namespaces in my lein project? eg http://clojuredocs.org/clojure_contrib/clojure.contrib.repl-utils/show

7:57 clgv: wingy: you must not - it is deprecated

7:57 wingy: clgv: all contrib libs are deprecated?

7:57 or have they been moved somewhere?

7:58 clgv: yes. a lot of them were replaced by single libs that are still maintained

7:58 ~contrib

7:58 clojurebot: Monolithic clojure.contrib has been split up in favor of smaller, actually-maintained libs. Transition notes here: http://dev.clojure.org/display/design/Where+Did+Clojure.Contrib+Go

7:59 clgv: wingy: in fact, some of the namespaces in contrib will not compile with clojure 1.3/1.4

8:02 wingy: wouldn't it be a good idea to not list the contrib lib functions in the search results in clojure docs?

8:03 clgv: wingy: I have no idea who is in charge for clojuredocs ;)

8:06 michaelr525: wingy: there is a lot of good stuff in the old contrib. sometimes i just copy/paste functions from there

8:07 clgv: michaelr525: I miss clojure.contrib.repl-utils/show

8:11 wingy: it seems that different sources are describing forms differently

8:11 is form the function call itself with fn and its args or any evaluation?

8:12 babilen: How can I add two lines (one at the start and one at the end) to an input-stream? (I essentially need to read files and add a string at the beginning and at the end). I am currently using something like https://www.refheap.com/paste/3522 but think that it is ugly. Can you think of something better?

8:12 wingy: eg. 1. (fn arg1 arg2) 2. [1 2] .. which one is a form?

8:12 from Programming Clojure: "A vector of numbers is another kind of form."

8:13 he even says "Numeric literals are forms." .. 1 2 3 etc

8:18 but then some people say that form is a S-expression that is a valid fn call

8:20 clgv: wingy: the [...] brackets are just syntactic sugar for (vector ...)

8:20 unnali: wingy: http://stackoverflow.com/questions/2877371/definition-of-lisp-form

8:21 clgv: unnali: lol in short everything in round brackets ;)

8:23 wingy: so why splitting hairs - are you learning for a theoretical exam?

8:23 unnali: and then some :)

8:23 wingy: clgv: i just hate when i dont understand

8:24 ok lets say its just an expression that is valid

8:26 clgv: wingy: well, just distinguish between "form" and "valid form"

8:26 wingy: form has to be valid?

8:26 (1 2 3) is not a form

8:26 lucian: wingy: i think a form is a data structure that can be evaluated as a program

8:26 wingy: yeah

8:26 1 is a data structure .. it can be evaled .. 1 will be returned

8:26 madsy: wingy: Think of why (1 2 3) isn't a valid form. What happens when you call 1?

8:27 wingy: (fn 1 2) as well

8:27 "Forms such as +, concat, and java.lang.String are called symbols and

8:27 are used to name things."

8:27 in this case the forms he is referring to is symbols that are evaled to the values of the vars they are naming

8:27 madsy: hmm

8:28 i just know it wont work since 1 is not a fn

8:28 lucian: does it matter?

8:28 wingy: yeah

8:28 clgv: well I think those sentences are meant to explain to you what the author will call "form" thrroughout the book

8:28 madsy: wingy: In a way 1 is a function. It evaluates to itself.

8:28 wingy: knowledge matters :)

8:28 madsy: Hence it is a unary function.

8:28 Same with strings and keywords

8:28 gfredericks: madsy: wat

8:28 michaelr525: watwat

8:29 madsy: gfredericks: I said you can think of it like that. Not that it literally is a function.

8:29 gfredericks: madsy: I just can't see why that's helpful

8:30 maybe "function call" instead of "function"

8:30 madsy: gfredericks: Yeah, okay.

8:30 gfredericks: since ("foo") won't work

8:30 michaelr525: what kind of certificate were we talking about

8:31 madsy: gfredericks: right

8:32 wingy: i think i get it .. form is simply a data structure that can be evaled

8:32 (1 2 3) is a data structure when read into memory, but not a form

8:32 AWizzArd: wingy: a form is something that you intend to evaluate.

8:32 wingy: wii

8:32 clgv: well you can do ##(eval '+)

8:32 lazybot: java.lang.SecurityException: You tripped the alarm! eval is bad!

8:32 clgv: lol not in the sandbox ;)

8:32 &+

8:32 lazybot: ⇒ #<core$_PLUS_ clojure.core$_PLUS_@1ca18e9>

8:33 wingy: yeah + is a form

8:33 AWizzArd: A type hint is not a form, as you don’t want to evaluate it. But a type hint is an expression, like everything else.

8:33 gfredericks: type hints can't be read on their own

8:33 michaelr525: gfredericks: ssl?

8:34 gfredericks: michaelr525: don't they serve the function of ensuring there aren't two certs for the same domain?

8:34 michaelr525: gfredericks: hmm.. didn't know that

8:35 gfredericks: michaelr525: how else do the clients know that they're connecting to your site?

8:36 michaelr525: gfredericks: that's why i thought it isn't worth the money, but if you say that they issue only one cert per domain maybe it is :)

8:36 rabbler: I have a really, really stupid Lisp/Clojure design decision to ask…. Why can't primitive types (integral, float strings and such) just resolve to themselves, such as symbols? Why can't everything be a function? Again, this is just a design question. Seems strange to me that we have to differentiate these from functions. But, I must be missing something important.

8:36 gfredericks: michaelr525: everything about "you connecting to your bank" can be easily faked by e.g.. your ISP except for the cert part

8:37 clgv: rabbler: what use would that have? do you want to build a herbrandt universe? ;)

8:37 michaelr525: i see..

8:37 gfredericks: well i feel a bit safer now.. thanks :)

8:37 gfredericks: michaelr525: probably "one per domain" isn't even all that important; more important is only issueing them to the domain owner

8:38 rabbler: Just a silly question. If I have a function, which takes another function that expects that function to return, lets say an Int, why can't I just pass an int to test. That int would just be treated as a function and return itself.

8:38 gfredericks: "one per domain" might not even be true...

8:39 clgv: rabbler: you can create such a function via e.g. (constantly 1)

8:40 gfredericks: subdomains should be possible

8:40 rabbler: true, but I have to create such a function. Why not treat them the same? Again, just a question.

8:41 Just wondering why it would be bad.

8:41 clgv: rabbler: how would you distinguish when it shall be really used as a function and when not?

8:42 rabbler: it still has a type. Just as a map does. Right? It's early and I am on my first cup. I just popped on because this has been bugging' me.

8:42 clgv: rabbler: if it would always be a function you'll get performance issues since you always have to call it to get the value

8:43 rabbler: clgv:So, you think it's just a performance thing? Wouldn't the runtime be able to deal with this once it's compiled and sees that the value in it is static?

8:44 clgv: Sorry for all the silly questions. Just something I was wondering.

8:45 clgv: rabbler: most of the time you want to use those constants as constants - I think that's a reason as well. if not there is `constantly`

8:45 rabbler: clgv: I'm not clojure/lisp expert. I've been to two clojure-conj and still don't use it. Grrr. No iOS version. ;-)

8:45 clgv: Thanks for the info.

8:46 clgv: rabbler: you want to program clojure on an iOS device?

8:46 algal: clgv: who doesn't ? :)

8:46 rabbler: clgv: I thought we'd want to program clojure on everything?

8:46 clgv: Though, not really.

8:46 clgv: I'd stick to something with a keyboard and a mouse ;)

8:46 rabbler: clgv:It's just what I have been doing for 6 months and I miss messing with clojure.

8:47 bordatoue: hello, could anyone tell me how i can pass string than need to re-find function

8:47 clgv: rabbler: programming on a tablet?

8:47 rabbler: clgv: No, writing iOS software. Using Xcode, on a Mac. You know.

8:48 bordatoue: okay, sorry for being stupid , i need to pass a string to re-find however # symbol keeps getting in the way

8:48 is there any way to do it .

8:48 clgv: rabbler: lol, right. hmm they are working on android though, GSoC project afair

8:48 rabbler: clgv:But, I've offloaded all server-side work to java devs. Some want to try to use clojure, badly! But, darned management. We have to sneak it in and show that it worked. You know how it is.

8:53 unnali: bordatoue: how do you mean by "getting in the way"?

8:53 bordatoue: unnali: the # symbol is being converted to string so this doesn't work

8:53 unnali: bordatoue: could you show me an example? I'm not entirely sure I'm on the same page as you.

8:53 bordatoue: unnali: all i need to do is to pass an argument that prefix # in such a way that # is not a string

8:54 unnali: for example (re-find #<something> [col]) ; how do i pass something as an argument

8:54 unnali: oh, right.

8:55 clgv: bordatoue: re-pattern

8:55 unnali: #"blah" is a reader macro to compile a java.util.regex.Pattern .. so there should be one to create such a thing from the string?

8:55 ^

8:55 bordatoue: per clgv's advice, (re-find (re-pattern <something>) [col])

8:56 bordatoue: unnali: # is implemented as re-patter

8:57 unnali: uh.. yes.

8:57 bordatoue: how did you find that # was implemented as re-pattern

8:57 unnali: clgv said so.

8:57 clgv: &(doc re-pattern)

8:57 lazybot: ⇒ "([s]); Returns an instance of java.util.regex.Pattern, for use, e.g. in re-matcher."

8:57 bordatoue: is there any other way to know about these things

8:58 unnali: bordatoue: search the API docs I guess?

8:58 clgv: $findfn "bla" #"bla"

8:58 lazybot: []

8:58 clgv: oh he cant do that :/

8:58 unnali: bordatoue: http://clojure.github.com/clojure/ and look for functions starting with "re-" is a good start.

8:59 bordatoue: unnali: i can find docs , but i need to understand the association of reader macros with the actual fn names

8:59 unnali: that's probably only defined in the clojure source

8:59 clgv: bordatoue: books are good for that ^^

8:59 bordatoue: nice one

9:00 unnali: bordatoue: https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/LispReader.java#L100

9:01 '#' causes delegation to a DispatchReader()

9:01 https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/LispReader.java#L105

9:01 and '"' in turn causes delegation to a RegexReader()

9:01 hence #" starts reading a regex in.

9:01 https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/LispReader.java#L422

9:01 bordatoue: can we not use source

9:01 to list the macros

9:01 unnali: book vs. source, if they disagree, who wins? ;-)

9:02 bordatoue: (source #) would that work

9:02 unnali: no

9:02 reader macros are not first-class

9:02 they're defined here in LispReader.java, as you can see

9:02 that's not necessarily introspectable (I haven't looked that far)

9:02 and besides, the source is java, not clojure

9:02 bordatoue: alright

9:02 thanks very much

9:04 unnali: np!

9:13 gfredericks: clgv: oh certainly, I didn't intend to exclude subdomains

9:21 jsabeaudry: Is sandbar the best library when it come to authentication for a web server written in clojure?

9:22 clgv: jsabeaudry: there is chas' "friend" library which he actively develops

9:23 kmicu: jsabeaudry: https://github.com/cemerick/friend/

9:25 jsabeaudry: clgv, kmicu, thanks!

9:31 bordatoue: is there any python equivalent of string[:-1] in clojure

9:31 foxdonut: /leave #clojure

9:32 jsabeaudry: I love the quotations (and the inspirations) for library names like friend and leiningen, great stuff

9:35 bordatoue: is there any python equivalent of string[:-1] in clojure

9:35 mtkoan: what does string[:-1] do in python

9:35 unnali: bordatoue: what have you tried?

9:36 clgv: bordatoue: (->> s count dec (nth s))

9:36 bordatoue: (nth "string" idx)

9:36 (butlast

9:36 (butlast string)

9:36 unnali: ,(drop-last "xyz")

9:36 clojurebot: (\x \y)

9:36 clgv: then use butlast ^^

9:36 bordatoue: problem is they return character sequence not a string

9:36 unnali: then use str after!

9:36 foxdonut: apply str

9:37 unnali: ,(apply str (drop-last "great string"))

9:37 clojurebot: "great strin"

9:37 bordatoue: so what about the performance

9:37 unnali: so what about the performance ;-)

9:37 clgv: bordatoue: for performance you have to use stringbuilder or similar anyway

9:37 bordatoue: doesn't it matter to keep on calling serveral fns to attain a simple task

9:37 llasram: &(let [s "examples"] (->> s count dec (subs s 0)))

9:37 lazybot: ⇒ "example"

9:38 bordatoue: okay, subs based on string builder

9:38 unnali: bordatoue: pick the clean solution first, profile and optimise later

9:38 llasram: I do wish the Clojure index-taking functions would accept negative indices as counting from the end where sensible

9:39 bordatoue: exactly llasram

9:40 unnali: i think we should write clean code from the start not just writing some ting that involves multiple invokataion to attain a simple task of creating a substring

9:40 unnali: ^ not that it would help perf-wise.

9:40 bordatoue: in python its "string"[:-1] thats it

9:40 unnali: just because python does it with one invocation, it doesn't mean any other language can necessarily do that

9:40 if the building block isn't there for you already, then that's it, you'll have to make your own.

9:40 it's idiomatic to treat strings as seqs.

9:41 but I mean, heck.

9:41 lucian: bordatoue: python's slicing isn't necessarily more efficient than function calls in clojure

9:41 unnali: ^^^

9:41 lucian: and getting back a seq is meh

9:41 not really a problem either way

9:42 perhaps strings should act as seqs without becoming something else

9:42 but it's not a big deal imo

9:42 unnali: ,(let [str "Blah blah"] (.substring str 0 (dec (count str))))

9:42 clojurebot: "Blah bla"

9:42 unnali: hardly better than llasram's example before, but whatever.

9:43 clgv: `subs` is definitely the way to go here, though ;)

9:43 lucian: but yeah, i also wish negative indices did something meaningful in more places

9:43 unnali: for sure :)

9:43 lucian: i think it's a nice small feature of python

9:43 unnali: ditto ruby, it's nice and makes sense

9:43 solussd_: it's a feature that you could add to [your] clojure [library] as a one-liner though, so just do it. :)

9:44 lucian: and it only eats into behaviour that is in fact an error, too

9:44 solussd_: but not all clojure funcs will support it magically

9:44 solussd_: what clojure functions would need to support it?

9:44 outside of what you write

9:45 lucian: indexing vectors, for example

9:45 &([0 1 2] -1)

9:45 lazybot: java.lang.IndexOutOfBoundsException

9:46 clgv: &((subvec [0 1 2 3 4 :evil] 0 2) 5)

9:46 lazybot: java.lang.IndexOutOfBoundsException

9:46 clgv: ah that one got fixed :)

9:46 solussd_: ooh ok.. you want that behavior everywhere

9:47 ;)

9:47 Iceland_word: Maybe something like ([:-3] "string") ;)

9:47 lucian: solussd_: i think it might be nice

9:47 solussd_: i agree

9:47 clgv: &((subvec [0 1 2 3 4 :evil] 2) -1)

9:47 lazybot: ⇒ 1

9:47 clgv: or not :P

9:48 &(clojure-version)

9:48 lazybot: ⇒ "1.4.0"

9:48 jweiss: anyone know what might be wrong when emacs slime-connect says it connects, but no slime repl buffer appears? clojure-jack in works just fine

9:49 solussd_: jweiss: have you verified it isn't in your buffer list (even though it doesnt appear)?

9:49 jweiss: solussd_: yeah, it's not there

9:55 jsabeaudry: jweiss, any clue in the *swank* buffer?

9:58 bordatoue: would it be possible to pass #{somevalues} as an argument to the main method

9:58 basically I would like to pass clojure set as an argument to -main fn from cmd line

10:00 ohpauleez: bordatoue: You can pick off the cmd args you want, and put them into a set

10:00 or

10:00 take the first arg and pass it to read-string

10:00 and it'll return a set

10:01 jweiss: jsabeaudry: hm, all that's in there now is the output from clojure-jack-in. what's interesting is after i ran clojure-jack-in, and doing sayoonara, slime-connect now works normally.

10:02 so clojure-jack-in must be initializing something in slime that i need to do in my emacs init file

10:07 locojay1: hi if i want to import a local api project is the right way to do it lein install and then use lein local repo to install produced jar file to m2 repo? or is there a better way

10:09 clgv: locojay1: lein install should work fine

10:10 I use it all the time

10:10 locojay1: k thanks

10:13 if i plan to opensource and upload to github is there any other step involved (repo server?) so others don't need to clone and install first. will do so research

10:22 clgv: locojay1: if you publish, you can upload your jars to clojars

10:27 locojay1: clgv: thanks

10:52 mtkoan: Just upgraded emacs24, now when compiling with swank-clojure, if there is an error in a file, the compilation error isn't reported correctly

10:53 just prints: error in process filter: symbols function defintion is void: cl-set-getf

10:53 happen to anyone else?

11:09 bordatoue: if i create a clj file with a -main fn would I be able to pass #{} clojure set as an argument to the clojure main fn , I don't know if it will be possible as all the argument to the main method in java is type String

11:10 can anyone please suggest

11:11 jsabeaudry: bordatoue, I beleive ohpaulesz had a pretty good suggestion the last time you asked the question

11:12 * foxdonut chuckles

11:16 bordatoue: jsabeaudry: well, I didn't understand what he meant, by putting cmds in a set. Wont the main method in java accepts a string array

11:17 hello

11:18 jsabeaudry: bordatoue, From my limited experience, the main function in all languages accept a string array. What he suggested is how to transform a string in a clojure data structure, "read-string"

11:20 bordatoue: using read-string, thanks. So why doesn't repl require a readstring

11:20 clgv: bordatoue: why would you want to put something in a main function?

11:20 jsabeaudry: bordatoue, the R in repl is about that part

11:21 bordatoue: so it is not a good env to test your functions then

11:22 jsabeaudry: it is a great environment to test your functions

11:22 just not your "-main"

11:23 clgv: bordatoue: you should test your functions in a REPL ...

11:23 bordatoue: okay, so how do i add a local jar file to the classpath in lein if i manually copy something to lib it is still not picking it up ,

11:23 clgv: testing in REPL is what ihave done, i came acrross this special case for -main

11:24 i wanted to pass few arguments to the main function

11:24 clgv: bordatoue: ideally your -main method only contains task selection code

11:24 nDuff: bordatoue: ...if you're doing it right, your -main is so trivial as to be obviously correct, and all the logic goes somewhere else that's easier to test.

11:25 clgv: I'll test my main via (-main "-E" "bla" "-R" "blubb"), well I have a convenience macro to just write (main -E bla -R blubb) ;)

11:25 bordatoue: clgv: nDuff there should be a entry point in the code to pass some arguments , is there any properties in clojure similar to java -D options

11:26 clgv: see above ^^

11:26 nDuff: bordatoue: ...well, you can certainly access Java properties from Clojure.

11:26 bordatoue: in my case i wanted to test something so (-main #{no no2 })

11:30 clgv: bordatoue: how do you provide that to your jarfile from commandline?

11:36 jsabeaudry: bordatoue, your main function needs to receive strings because that is what your OS will give it. If you find an OS that will pass clojure data structures to your main, then you will be able to do what you want to do

11:37 bordatoue, until then, if you want the strings to be clojure data structures, you need to perform the conversion yourself, possibly using read-string

11:47 bordatoue: this works in repl breaks from cmd

11:48 clgv: bordatoue: erm what?

11:48 bordatoue: clgv: just not getting anywhere

11:48 okay, in lein how do i add a local .jar file to the classpath

11:48 clgv: bordatoue: from cmd you can ONLY pass STRINGS to a program.

11:48 bordatoue: i copied .jar to lib directory and still it didn't pick up

11:48 TimMc: bordatoue: Of course it will work from the REPL, you can pass anything in there.

11:49 clgv: bordatoue: restart your repl - then it works

11:49 bordatoue: clgv: TimMc is there any equivalent of python keywords in clojure

11:49 TimMc: You mean, named arguments? Not really.

11:50 bordatoue: yes

11:50 okays forget the string , i do understand now. thanks/

11:50 tell me how do i add a local jar file in lein classpath

11:51 clgv: bordatoue: putting it in the lib folder works. just restart that repl

11:51 bordatoue: clgv: are you sure about it , so if i do a uberjar will it work

11:52 clgv: bordatoue: no. because you have to disable auto-clean of the lib folder which uberjar will do otherwise.

11:52 have a look at the sample-project-clj

11:53 bordatoue: thanks, and how do i disable this auto-clean hopefully it must be something in the project.clj file

11:53 clgv: i can goolge that one

11:57 ToxicFrog: ,(let [test-kwargs (fn [x y & args] (let [kwargs (apply hash-map args)] (println x y kwargs))] (test-kwargs "one" "two" :foo true :bar false :baz []))

11:57 clojurebot: #<ExecutionException java.util.concurrent.ExecutionException: java.lang.RuntimeException: Unmatched delimiter: ]>

11:58 TimMc: bordatoue: Down that road madness lies.

11:58 ~repeatability

11:58 clojurebot: repeatability is crucial for builds, see https://github.com/technomancy/leiningen/wiki/Repeatability

11:59 ToxicFrog: ,(let [test-kwargs (fn [x y & args] (let [kwargs (apply hash-map args)] (println x y kwargs)))] (test-kwargs "one" "two" :foo true :bar false :baz []))

11:59 clojurebot: one two {:foo true, :bar false, :baz []}

11:59 ToxicFrog: There you go, named arguments.

12:00 clgv: ToxicFrog: it can be much nicer with the "clojure.options" library

12:00 ToxicFrog: The API doesn't list that library.

12:02 TimMc: ToxicFrog: And then everyone who wants to use 'apply with that will hate you.

12:02 ToxicFrog: TimMc: why?

12:02 clgv: ToxicFrog: https://github.com/guv/clojure.options

12:02 TimMc: ToxicFrog: Go ahead, combine test-kwargs with {"one" "two", :foo true, :bar false, :baz []}

12:03 It's surprisingly common and surprisingly irritating.

12:03 ToxicFrog: ,(let [test-kwargs (fn [x y & args] (let [kwargs (apply hash-map args)] (println x y kwargs)))] (test-kwargs {"one" "two", :foo true, :bar false, :baz []})

12:03 clojurebot: #<ExecutionException java.util.concurrent.ExecutionException: java.lang.RuntimeException: EOF while reading>

12:04 ToxicFrog: ,(let [test-kwargs (fn [x y & args] (let [kwargs (apply hash-map args)] (println x y kwargs)))] (test-kwargs {"one" "two", :foo true, :bar false, :baz []}))

12:04 clojurebot: #<ArityException clojure.lang.ArityException: Wrong number of args (1) passed to: sandbox$eval103$test-kwargs>

12:04 TimMc: If you think you need kwargs, you should probably just accept an options map at the end.

12:04 ToxicFrog: Why is the above result meant to be surprising?

12:04 TimMc: It's not. It just shows that the standard tool for the job, 'apply, can't be used here.

12:05 And that pisses people off.

12:05 ToxicFrog: Why can't apply be used there?

12:06 TimMc: &(apply (fn [& args] args) {:a 1 :b 2})

12:06 lazybot: ⇒ ([:a 1] [:b 2])

12:06 TimMc: &(apply (fn [& args] args) [:a 1 :b 2])

12:06 lazybot: ⇒ (:a 1 :b 2)

12:07 ToxicFrog: Aah.

12:07 So it's not that you can't use apply, it's that you can't pass in an options map (with or without apply)

12:08 clgv: TimMc: well it's said that you should not pass options as a map. when ever you want named options they shall be passed without additional "{}"

12:08 TimMc: ToxicFrog: No, it's that you can't apply an options map.

12:09 clgv: I don't care what the clojure core style guide says.

12:09 I mean, most of that document is pretty reasonable, but that suggestion is misguided.

12:10 clgv: TimMc: For the cases of passing options from function to function with added documentation I wrote clojure.options ;)

12:11 for all other cases I do not want to add additional {}

12:13 locojay1: whein i use lein run install of java -jar i keep on getting output to stdout. example : upload sequence to mongodb via monger will keep on outputing the writeresult. anyway to prevent this witout redirecting when using lein run

12:14 antares_: locojay1: lein run install of java -jar?

12:14 if you use tools.logging or timbre and make your application to log to a file or elsewhere, it will

12:14 leiningen does not control that

12:15 locojay1: sry i meant lein run instead of java -jar

12:15 antares_: locojay1: can you paste the output?

12:17 locojay1: will get {"$oid":"4ffb02f0c0126262551793277b"},"n":1, "connectionId": 64, "wtime"0, "err":null,"of":1.0} for each elem in sequence im updating (so allot of output)

12:20 antares_: locojay1: this means you probably have println somewhere

12:20 as far as I know MongoDB Java driver does not log

12:20 monger definitely does not

12:25 locojay1: https://gist.github.com/3077448

12:31 ToxicFrog: mthvedt: I've got a working lexer and parser now!

12:31 The lack of error reporting in the parser is still a problem, though - I'm having to query the lexer to get a rough idea of where the error is

12:34 wingy: is it possible for 2 different vars to bind to one and the same value?

12:34 jweiss: ,`(let [x 1] x)

12:34 clojurebot: (clojure.core/let [sandbox/x 1] sandbox/x)

12:34 jweiss: how do i avoid the x getting namespaced in the syntax quote? is there any other way besides using gensym?

12:35 wingy: jweiss: i thought you were answering my question :)

12:35 jweiss: i tried doing postwalk/replace, but then that doesn't affect macros that expand into let

12:35 sorry :)

12:35 wingy: to answer your question can't you bind them both to a atom?

12:36 S11001001: ,`(let [x# 1] x#) ; jweiss is this what you mean?

12:36 clojurebot: (clojure.core/let [x__53__auto__ 1] x__53__auto__)

12:36 wingy: jweiss: have no idea .. just a thought that came up in my head .. nm :)

12:36 jweiss: S11001001: yeah, that *works* but part of the reason I'm using syntax quote is so the expression is more human-readable. those autogenned names are pretty ugly.

12:37 S11001001: jweiss: human-readable and avoiding capture don't go hand in hand, not without first-class bound/free variables in the forms (like scheme has) anyway

12:38 jweiss: S11001001: i prefer risking capture

12:38 otherwise i have to explain to my users to always remember to put # at the end of their local variables or else it will not compile

12:38 or eval, rather

12:40 wingy: is ^ not valid anymore in clj for returning meta data?

12:40 technomancy: jweiss: are you writing an anaphoric macro?

12:40 nickaugust: so when I use (map my-func my-seq) the function calls are not fired until I read the returned seq? I have a map call that doesnt run unless I (println (map ...

12:40 wingy: i get "java.lang.RuntimeException: EOF while reading" when using ^object

12:41 jweiss: technomancy: no, i'm trying out using quoted code for steps of funtional tests (and then evaling it to run the test)

12:41 ToxicFrog: ,(cons [1 2] [3 4])

12:41 clojurebot: ([1 2] 3 4)

12:41 jweiss: the point being that i want to preserve the original data

12:41 technomancy: jweiss: it's considered bad form to introduce implicit lexical bindings for callers; much better to let them pick the name for the local

12:42 jweiss: technomancy: that's what i want to do.

12:42 nickaugust: (map #(+ % 3) [2 4 7])

12:42 ,(map #(+ % 3) [2 4 7])

12:42 clojurebot: (5 7 10)

12:42 technomancy: jweiss: if the caller provides the name you don't need to set it in the syntax-quote

12:43 jweiss: technomancy: my users are going to give my test harness syntax-quoted forms, and the test harness runs them. at this point they cannot use let without the reader gensym

12:43 nickaugust: is there a map function that calculates the results immedietly?

12:44 ToxicFrog: nickaugust: (doall (map ...))

12:44 nickaugust: ToxicFrog: thanks :)

12:44 ToxicFrog: If you just want the side effects and not the resulting seq, use (dorun) instead

12:45 nickaugust: ToxicFrog: perfect thanks!

12:45 hiredman: http://news.ycombinator.com/item?id=4218820

12:45 ToxicFrog: (in particular, (dorun (range)) is an infinite loop and (doall (range)) is an OutOfMemoryException~)

12:47 hiredman: (I imagine dons is being sarcastic there)

12:47 dnolen: hiredman: :P

12:47 technomancy: jweiss: I don't think there's a good way to do that

12:48 with syntax-quote

12:48 jweiss: technomancy: i'm open to non-syntax quoted, but figured i'd need it for namespace resolution

12:49 technomancy: not if you can bind *ns*

12:51 jweiss: technomancy: i probably can, but then what?

12:52 oh you mean pop it back out before eval?

12:57 technomancy: just bind it to whatever ns has the values your form needs

13:04 wingy: why would i want to use the :tag meta data to describe what data type is expected in a parameter? it doesn't seem that clj enforces type checking

13:05 eg. what good does this :tag meta data do: (defn #^{:tag String} shout [#^{:tag String} s] s)

13:07 dakrone: wingy: :tag metadata is type-hinting

13:08 foxdonut: ~CPOR

13:08 clojurebot: CPOR is Clojure Programming (O'Reilly): http://www.clojurebook.com

13:09 ToxicFrog: dakrone: right, but what actual effect does the type-hinting have?

13:09 dakrone: ToxicFrog: http://clojure.org/java_interop#Java%20Interop-Type%20Hints

13:10 ToxicFrog: Aah

13:11 wingy: foxdonut: lol i actually ignored the java interop chapter in that book

13:11 perhaps i should read it :)

13:11 dakrone: thx

13:11 nDuff: Easiest way to tell is to set the *warn-on-reflection* flag

13:11 foxdonut: wingy: :-)

13:11 nDuff: anywhere that doesn't generate a warning, type hinting is unnecessary/useless.

13:11 (and it's not necessarily best placed at the warning site, either -- if putting it somewhere else allows inference...)

13:58 * nDuff eyes https://github.com/schani/clojurec

14:03 dustingetz: dnolen: i see a clojuescript branch "ext-js-sample" as well as an issue "CLJS-54 Create a sample cljs app that uses an external JavaScript library" (which is resolved) http://dev.clojure.org/jira/browse/CLJS-54

14:04 i already have from hackerschool i functional sencha/extjs sample app

14:04 is this something i can just slam in as a new sample, tag it against cljs-54, and submit a pul req? is that valuable and likely to be accepted?

14:04 dnolen: dustingetz: at this point probably not.

14:04 dustingetz: cool, glad i asked haha

14:05 dnolen: dustingetz: also, CLJS doesn't take pull requests, only patches via JIRA

14:05 dustingetz: sure, we'll get all that figured out

14:05 i dunno if you talked to sonali, its "open source week" at hackerschool. six of us looking at cljs issues right now

14:05 we just started

14:06 dnolen: dustingetz: I take it you all are you looking for low hanging fruit?

14:06 dustingetz: yeah, we think we can handle the docstring issue

14:06 might take a whack at it today and see what we come up with

14:07 dnolen: dustingetz: the docstring issue and related REPL things are not as simple as they seem (though not overly complex either)

14:07 dustingetz: yeah, the related repl stuff (from your email to Alan a month ago) would be a next step, but unlikely we can contribute something significant in a week

14:08 brainproxy: dnolen: I acquired an introductory prolog book last night :) but it doesn't recommend one runtime over another; do you recommend swi prolog or gnu prolog?

14:08 dustingetz: we spent a couple days looking at cljs internals last month, we may have a shot at the docstring issue

14:08 can you point us to other low hanging fruit issues ? we're skimming the jira now

14:08 foxdonut: brainproxy: which book is that?

14:09 dnolen: dustingetz: a simple docstring fix would be welcome and welcome.

14:09 brainproxy: dnolen: this one http://www.springer.com/computer/swe/book/978-1-85233-938-8

14:10 dnolen: i researched various intro books, and liked the fact that one can be purchased as a DRM free pdf

14:10 eventually I'd like to get the AI prolog book you recommended

14:10 dnolen: dustingetz: hmm nothing jumps out at me.

14:10 brainproxy: but this one will be my starter

14:12 dnolen: brainproxy: I'm not familiar that one. SWI-Prolog works well and has an active community.

14:12 oskarth_: dnolen: would writing marginalia docs for the source code be desirable?

14:12 dnolen: oskarth_: not really.

14:12 brainproxy: dnolen: okay, then I'll go w/ swi for starters

14:17 dnolen: oskarth_: dustingetz: to be honest if you all way to contribute I recommend first reading and playing around with the analyzer and compiler sources. More than happy to answer specific questions.

14:18 dustingetz: thanks, yeah, we agree

14:21 oskarth_: roger, thanks

14:45 jsabeaudry: Are people using 1.4 in production?

14:46 gfredericks: jsabeaudry: I am

14:46 jsabeaudry: gfredericks, so far so good?

14:46 gfredericks: surely

14:46 I'm not using anything 1.4 specific, I just wanted to postpone library issues as far into the future as possible

14:46 jsabeaudry: great, I'll give it a spin then

14:47 hiredman: sonian skipped 1.3 (too many issues) right to 1.4 from 1.2

14:51 jsabeaudry: pretty agressive liveperson on the sonian website :)

14:57 hiredman: :)

14:57 clojure is all the back end, so no point in looking at websites, etc

14:58 gfredericks: unless we have a mountain of emails and don't know what to do with them?

15:00 amalloy: geni skipped 1.3 to 1.4 also

15:01 wingy: fun performance comparison: https://gist.github.com/3078233

15:01 hiredman: gfredericks: sure, if you are interested as a customer, but if you are interested in clojure there isn't much to see

15:02 wingy: just paste it into the repl .. reduce is 500 times slower :/

15:02 but more readable

15:03 i cant even get the second one .. would you still prefer using reduce for readability?

15:03 amalloy: wingy: so try again with arrows: (-> (* n (inc n)) (/ 2))

15:04 KirinDave: Hey, if I do (dosync (pmap …))

15:04 Does that work the way I'd lexically expect it to?

15:04 amalloy: no

15:04 KirinDave: Figured

15:04 hiredman: you're gonna have a bad time

15:05 technomancy: dosync is the moral equivalent of dynamic scope

15:05 KirinDave: So each work unit in the pmap should establish its transaction internally?

15:05 hiredman: a. pmap is a mix of eager and lazy b. if you have a task where the runtime of the task dominates the over head of pmap you should *not* but it a transaction

15:05 put

15:05 amalloy: technomancy: you seem to be saying it's not actually dynamic scope

15:06 KirinDave: hiredman: I have a really big structure I'd like to iterate within.

15:06 amalloy: it's not dynamic scoping of a variable, but it's dynamic scoping of a resource (the transaction)

15:06 KirinDave: Okay, well easy enough to fix, I suppose.

15:06 technomancy: amalloy: right; I wouldn't use the word scope for something that's not reified

15:06 KirinDave: Just put the dosync inside the pmap and get the master list outside in its own transaction.

15:06 hiredman: :(

15:06 KirinDave: I suppose I could always use a readwritelock if this really causes consistency problems.

15:06 technomancy: or maybe you could use that word, but it would be a kind of pun

15:07 hiredman: clojurebot: pmap?

15:07 clojurebot: excusez-moi

15:07 hiredman: clojurebot: pmap is not what you want

15:07 clojurebot: Ok.

15:08 amalloy: i'm not sure i really understand what reified means in that context. is it just: something with a real existence manipulable by your program at runtime?

15:14 TimMc: Eh, it's still scope, just not a var.

15:23 ibdknox: More useful instarepl! http://www.chris-granger.com/2012/07/09/light-table-playgrounds-level-up/

15:27 dnolen: ibdknox: nice! when i try to run it seems to hang on "Waiting for server"

15:27 ibdknox: hm

15:27 weird

15:28 Raynes: Uses a special version of Clojure?

15:28 Why is that?

15:28 ibdknox: metadata gets nuked and I needed more position info

15:28 no reason those things can't make it into clojure proper, just haven't had the time to make that happen

15:28 dnolen: ~/.lighttable/logs/server.log

15:29 Raynes: ibdknox: So light table will end up not being compatible with < 1.5.0?

15:29 ibdknox: dnolen: it might be that somehow the server didn't get started?

15:29 Raynes: Assuming your stuff even gets into 1.5.0.

15:29 ibdknox: Raynes: no, it's a weird version that's actually 1.4.0

15:29 oh

15:29 sort of

15:29 only for the instarepl stuff

15:30 showing things flow through and whatnot

15:30 can't do that without position info :(

15:30 Raynes: Sucks.

15:31 ibdknox: Raynes: in theory I could fork the reader out

15:31 and do it that way

15:31 Raynes: I'm not really complaining. Just seems strange.

15:31 But I get why it is necessary.

15:32 amalloy: ibdknox: what do you mean by "metadata gets nuked"?

15:32 ibdknox: amalloy: metadata in the symbol -> var transition disappears

15:33 during analysis

15:33 dnolen: ibdknox: hmm, deleted light table, ran install commands from scratch - hangs on "starting server" in my terminal

15:34 ibdknox: dnolen: it usually does that when there's a rogue server hanging out somewhere :( ps aux | grep -i lighttable and kill those

15:34 wingy: ibdknox: i like the update notification

15:34 ibdknox: dnolen: I'm trying to come up with a different packaging mechanism

15:34 dnolen: hopefully next release :(

15:34 I reallllllly wish javafx would work

15:34 but the webkit it uses is so incredibly slow it's not even an option

15:37 dnolen: ibdknox: k killing rogue server allow terminal to start process "Server up!", but actual Light Table app frozen on "Waiting for server"

15:37 scriptor: on a fresh install of lein, trying to do lein new <something> is giving me:

15:37 https://gist.github.com/3078433

15:38 ibdknox: dnolen: ah, are you pressing cmd-r? I don't think that's hooked up on that page. If you open it in a new window does it work? How about in chrome can you get to http://localhost:8833/?

15:38 scriptor: any idea why it's trying to get the clojure 1.5 alpha?

15:38 instead of 1.4

15:39 installed lein through homebrew, if that makes a difference

15:40 foxdonut: "--- Found a new version!" awesome :)

15:40 dnolen: ibdknox: hmm neither things work

15:40 ibdknox: dnolen: oh weird :(

15:40 dnolen: did the server.log have anything in it?

15:40 Raynes: scriptor: Did you add lein-light?

15:40 foxdonut: ./light: line 198: unexpected EOF while looking for matching `"'

15:40 scriptor: Raynes: yep

15:41 foxdonut: ./light: line 200: syntax error: unexpected end of file

15:41 Raynes: scriptor: That's why it is trying to get 1.5.0

15:41 scriptor: ah

15:41 I had to create the profiles.clj file for it, so otherwise if I remove that it won't use 1.5?

15:41 ibdknox: foxdonut: yeah, after the update that should go away

15:41 Raynes: But I'm pretty sure that's wrong.

15:41 ibdknox: Why is it trying to get clojure 1.5.0-alpha1 when you never pushed that jar?

15:42 ibdknox: I haven't seen it do that

15:42 Raynes: I have no idea

15:42 pyrtsa: Hmm, so macros like "doc" don't quite work yet in Light Table? Despite that, this is looking really great!

15:42 dnolen: ibdknox: Connected. Server started. CONNECTING: local

15:42 Raynes: Why is everything broken today?

15:43 foxdonut: ibdknox: then I get a "We seem to have lost that one." on http://localhost:8833/

15:43 Raynes: I bet even amalloy isn't working.

15:43 technomancy: Raynes: clojars was broken because stupid American date formatting made it look to an aussie like the cert expired in August.

15:43 ibdknox: pyrtsa: yes they do, just do (use 'clojure.repl)

15:43 wingy: yeah I get "waiting for server" as well

15:43 pyrtsa: Ah, thanks!

15:43 Raynes: technomancy: Don't think that's the problem.

15:43 ibdknox: dnolen: looking into it

15:43 dnolen: ibdknox: I get that at :8833 as well. If I kill the light table app I get a rogue server that I have to kill at terminal.

15:43 pyrtsa: Great!

15:44 scriptor: is lein-light on github?

15:44 technomancy: Raynes: of course it is; month-first sucks

15:45 I mean the cause of the issues over the weekend

15:45 gfredericks: technomancy: I question your patriotism.

15:46 Raynes: He hates aussies.

15:46 Bet he doesn't like kittens either/.

15:46 wingy: ibdknox: also lein-light doesn't work: it cant find artifact

15:46 ibdknox: wingy: what can't it find?

15:47 Raynes: Let me guess, clojure 1.5.0-alpha1.

15:47 pbostrom_: ibdknox: The following artifacts could not be resolved: lighttable.hub.clj:lighttable.hub.clj:jar:0.0.2, org.clojure:clojure:jar:1.5.0-ibdknox5: Could not find artifact lighttable.hub.clj:lighttable.hub.clj:jar:0.0.2 in central (http://repo1.maven.org/maven2)

15:47 ibdknox: wtf

15:47 seancorfield: ibdknox: i was just about to report that same error

15:47 wingy: https://gist.github.com/3078481

15:47 ibdknox: ^

15:47 scriptor: yep, that's what I'm getting

15:47 Raynes: ibdknox: You've screwed up a project.clj somewhere.

15:47 gfredericks: wait do aussies use month-first?

15:47 ibdknox: apparently

15:47 gfredericks: don't americans also?

15:47 oh he wasn't talking to me

15:48 I knew my "always assume ibdknox is talking to you" policy would backfire eventually

15:48 Hodapp: Americans often to month-first with dates.

15:49 that's very common when writing in full - as in July 9, 2012 - and often they'll just take that and turn 'July' to a number.

15:49 not that 7-9-12 is ambiguous or anything.

15:49 gfredericks: haha

15:49 scriptor: there's always the yyyymmdd format

15:50 Hodapp: scriptor: that's what I use almost always

15:50 foxdonut: so that would be September 12, 2007 :)

15:51 Hodapp: NEVER FORGET

15:52 amalloy: i use yyyy-mm-dd in programs, and mm/dd/yy in real life. it's pretty terrible, i guess

15:52 Raynes: amalloy: Get out of my intenret.

15:52 internet too

15:53 amalloy: sometimes just m/d/yy. i bet you feel dirty just reading that

15:53 kmicu: lol

15:53 Raynes: amalloy: If you knew what I've been through with GEDCOM date parsing.

15:56 locojay1: python has a cool lib dateutil from dateutil.parser import parse as dateparser. dateparser(<string> , fuzzy=true) will convert any kind of format... Is there something simlar in clojure/java

15:59 ibdknox: lein2 deps :tree isn't showing anything anyone else have a good way to debug rogue deps?

16:01 amalloy: ibdknox: is the lein-light plugin source somewhere?

16:01 it seems likely to me you're doing something naughty like modifying the project map when your plugin loads, rather than when it's invoked

16:01 Raynes: Apparently brokeville.

16:04 ibdknox: ok

16:04 fixed

16:04 lein-light 0.0.3

16:04 acagle: (def ^:private uri1 "datomic:dev://localhost:4334/portland")

16:04 (def ^:private uri2 "datomic:mem://portland")

16:04 Raynes: ibdknox: What was the problem?

16:04 ibdknox: or if you want you can nuke the one in you ~/.m2

16:04 I did something stupid

16:04 changed the name of the project

16:04 Raynes: Well, yeah, but what in particular? ;)

16:04 Hah

16:04 ibdknox: but it adds itself to the project map like amalloy said, and was using the old name

16:05 amalloy: oh wow, so i was close? i don't even know how to write a lein plugin

16:05 scriptor: so the fix is to change 0.0.2 to 0.0.3 in profiles.clj?

16:06 ibdknox: yes

16:06 Raynes: That always fixes my problems.

16:07 scriptor: hmm, still getting the same error :/

16:07 Raynes: ibdknox: It isn't too late to quit programming and become a firefighter.

16:07 amalloy: *laugh*

16:08 ibdknox: Raynes: seems like a reasonable decision

16:08 scriptor: ibdknox: still getting errors saying it couldn't find the artifact clojure 1.5.0 in central or clojars

16:09 ibdknox: scriptor: ah yeah. rm ~/.m2/repository/ibdknox ~/.m2/repository/lein-light

16:10 foxdonut: hmm, even downloading from scratch gives me "We seem to have lost that one" on localhost:8833

16:12 wingy: ibdknox: http://pastebin.com/1k2TuHZX

16:12 even though i changed version to 0.0.3

16:12 LeNsTR: I have the same problem (

16:12 scriptor: ibdknox: removed those 2 directories, got the same error as wingy

16:13 amalloy: Raynes, technomancy: i'm about to make the big leap, guys. i'm pointing ~/bin/lein at lein2

16:13 Raynes: amalloy: Me moving protobuf/jiraph to lein 2 is the catalyst, right?

16:13 amalloy: yes

16:13 you are the hero

16:14 ibdknox: ooook

16:14 once more with feeling

16:14 lein-light 0.0.4

16:15 scriptor: should we rm /ibdknox and /lein-light again?

16:15 ibdknox: you shouldn't need to

16:15 amalloy: i'd rm everything ibdknox has ever written, just to be safe

16:16 ibdknox: A wise call really.

16:16 scriptor: let's rm ibdknox while we're at it

16:16 back him up first, of course

16:16 ibdknox: you didn't -f

16:17 wingy: use -r as well just in case

16:17 ibdknox: it says "connected" but is idling

16:18 amalloy: jeez, i didn't mean to start a kill squad

16:18 ibdknox: wingy: idling?

16:18 wingy: yeah nothing happens

16:18 Raynes: Means he doesn't have the accelerator depressed.

16:19 foxdonut: needs anti-depressants, then.

16:19 LeNsTR: it's work! ^^

16:19 wingy: ibdknox: does it work for you?

16:19 foxdonut: LeNsTR: let's the goods time rolls!

16:19 ibdknox: wingy: what are you expecting it to do?

16:20 wingy: it's kind of like swank

16:20 it should just start up :)

16:20 then you open light table and connect to it

16:20 scriptor: is there something I need to do to compile a clojure file if I've made changes after I connected?

16:20 foxdonut: ibdknox: sorry everyone's bombarding you.. in my case it has nothing to do with the plugin, just plain server up and running but error message on web page

16:20 wingy: ibdknox: ah

16:21 :)

16:21 45PAAS8B6: is there a way to have emacs code navigation, e.g. M-., on a project that doesn't use lein

16:21 wingy: ibdknox: it says Waiting for server...

16:21 dustingetz_: me ^

16:21 ibdknox: foxdonut: kill your java processes and rm ~/.lighttable/ and start over

16:22 I pushed an update that is my best guess as to why people are running into this

16:23 wingy: moment of truth

16:23 scriptor: ibdknox: sorry for the dumb question, but how do I use it? I have manual mode enabled and trying to evaluate a function call to a function from core, but I'm not seeing anything

16:23 ibdknox: if that doesn't work, what does going to http://localhost:8833 show?

16:24 foxdonut: ibdknox: works, thank you!

16:24 ibdknox: k

16:24 good to know

16:24 foxdonut: poor guy

16:24 bombardment! bombardment!

16:24 ibdknox: scriptor: what do you mean exactly? as in you pressed cmd-enter and nothing happened?

16:24 scriptor: ibdknox:

16:24 right

16:25 ibdknox: what are you executing?

16:25 foxdonut: ibdknox: "here it is, the update you've been waiting for, like the salivating dogs that you are..."

16:25 scriptor: my project's called tutor, and I have a function inside it called foo that just returns 2 + 3

16:25 foxdonut: (bonus points for recognizing the simpsons krusty-the-clown reference)

16:25 scriptor: so I have (tutor.core/foo) and shift-enter

16:25 but nothing shows up on the right side

16:25 ibdknox: scriptor: hmm and you required tutor.core?

16:27 SegFaultAX|work2: Any vim users in here that use vimclojure: I'm having trouble with the indentation settings. If I type `(defroutes main-routes` and press enter, it indents to align with the m in `main-routes` instead of 2 spaces in.

16:27 dnolen: ibdknox: sweet LT works again for me now.

16:28 ibdknox: good deal

16:28 Raynes: SegFaultAX|work2: let vimclojure#FuzzyIndent = 1

16:28 Put that in your .vimrc.

16:29 scriptor: ibdknox: I need (require '[tutor.core]) right?

16:29 ibdknox: I have no idea how that could be different for people

16:29 SegFaultAX|work2: Raynes: Awesome, thanks mate.

16:29 ibdknox: the thing that was causing the issues was a filter to make sure only local requests came in

16:29 scriptor: at this point I'm fairly sure I'm just failing at writing clojure

16:29 ibdknox: scriptor: yeah, that should be it

16:30 technomancy: my barista just called me "friendo" and I thought "wait, a logic programmer?"

16:30 SegFaultAX|work2: Raynes: That was it, thanks mate.

16:30 scriptor: ibdknox: nope, still doesn't work, this is all the code: https://gist.github.com/3078705

16:30 SegFaultAX|work2: Raynes: Also, are you aware of any way to get syntax highlighting for custom macros?

16:31 seancorfield: ibdknox: fwiw, i'm happily running LT connected to my local worldsingles project and it's *HOT* so thanx for that update!

16:31 scriptor: interestingly enough, if I change it to just (foo) I do get an error, but changing it back to (tutor.core/foo) and the error text is still there

16:31 SegFaultAX|work2: Raynes: Or even normal functions not included in clojure for that matter.

16:31 scriptor: Raynes: didn't know about FuzzyIndent, you just made vimclojure so much better for me

16:31 technomancy: seancorfield: is your work to make c.j.jdbc not require dynamic binding underway or is that still in the planning stage?

16:31 ibdknox: scriptor: does anything show up at the bottom?

16:31 seancorfield: scriptor: try (require '[tutor.core :as tc]) and (tc/foo)

16:31 Raynes: SegFaultAX|work2: No idea.

16:32 scriptor: ibdknox: yep, tutor.core in red text

16:32 seancorfield: technomancy: i'm incubating the new code in another project right now

16:32 ibdknox: scriptor: ah

16:32 scriptor: apparently that is the message of the exception O_o

16:32 scriptor: seancorfield: look through the files you have to install for vimclojure

16:32 foxdonut: (inc Raynes)

16:32 ibdknox: scriptor: ok, that means you probably aren't connected to your project, in the bottom right open the menu

16:33 scriptor: click connect and then select your project

16:33 scriptor: seancorfield: it won't be automatic, but you can manually add more keywords to highlight

16:33 seancorfield: scriptor: why would i install vimclojure? :)

16:33 ibdknox: seancorfield: yay it's working for someone!

16:33 scriptor: argh, wrong person

16:33 SegFaultAX|work2: check the files you copy to install vimclojure, you can at least manually change the list of highlighted keywords, nothing automatic though :/

16:34 ohpauleez: ibdknox: the only error I'm getting is a missing clj-stacktrace error, but I think that's an error on my part

16:34 scriptor: ibdknox: nope, I think I was connected before and I just tried having it connect again, same issue

16:34 ibdknox: hm

16:35 scriptor: seancorfield: just tried your suggestion, now getting:

16:35 ibdknox: scriptor: not sure then :( It picks up all its classpath stuff from Lein, so it should be there as long as it's running in that project

16:35 kotarak: vimclojure issues?

16:35 hyPiRion: ibdknox: It seems like some sort of documentation on this thing would be nice - people have questions and problems all over, and there's no real place where the questions and answers is placed.

16:35 technomancy: seancorfield: right; cool

16:36 scriptor: ibdknox: getting a new error from seancorfield's suggestion, but this friggin might mouse is being a pain

16:36 ibdknox: hyPiRion: as soon as the issues are fixed. Only have two hands :)

16:36 kotarak: SegFaultAX|work2: vimclojure issues?

16:36 hyPiRion: ibdknox: Just my two cents. ;)

16:37 kotarak: SegFaultAX|work2: with a running backend you get automatic highlighting of required, used and aliased namespaces.

16:37 SegFaultAX|work2: see vimclojure#DynamicHighlighting.

16:37 scriptor: ibdknox: seancorfield: new error, this time with :as tc and (tc/foo) https://gist.github.com/3078737

16:38 wingy: ibdknox: it has been on: --- Starting server... (this takes several seconds) forever .. and the cpu is idling .. i have reinstalled it but its still idling

16:38 ibdknox: scriptor: apparently tutor.core has an error in it

16:38 wingy: you have an old server running

16:38 scriptor: yes…yes it does

16:39 ibdknox: wingy: kill you java processes and run it again, should be ok

16:39 pandeiro: was there a new release of lighttable?

16:40 SegFaultAX|work2: kotarak: Does that require nailgun to use?

16:40 kotarak: SegFaultAX|work2: yes

16:40 foxdonut: pandeiro: have you been living under a rock? it's been over 2000 seconds already!

16:41 scriptor: ibdknox: it works!

16:41 SegFaultAX|work2: kotarak: Alright, well I was about to get that one up and running as well?

16:41 I didn't main to make that a question. It's imperative. :)

16:41 Mean. Man I can't type right now.

16:41 pandeiro: foxdonut:

16:41 sorry, link?

16:42 wingy: ibdknox: works fine

16:42 pandeiro: ah nvm hackernews

16:42 foxdonut: pandeiro: http://www.chris-granger.com/2012/07/09/light-table-playgrounds-level-up/

16:42 ibdknox: alrighty then

16:42 I believe the issues are sorted out

16:42 kotarak: SegFaultAX|work2: There is lein-parsier for leiningen, and vimclojure/gradle for gradle

16:42 ibdknox: thanks for bearing with me guys :)

16:42 pandeiro: weird, i went to chris' site and wasn't getting the new post

16:42 kotarak: SegFaultAX|work2: to start the backend server easily in your project.

16:42 foxdonut: pandeiro: but maybe just ./light table will auto update for you

16:42 wingy: love the "live off" feature already

16:43 scriptor: ibdknox: thanks for bearing with my inability to write clojure :)

16:43 kotarak: SegFaultAX|work2: that should be lein-tarsier, can't type neither

16:44 SegFaultAX|work2: kotarak: Is using nailgun as a stand-alone in-vim REPL a supported use case? Or does it only make sense inside of a project?

16:44 pandeiro: wow, looks like an enormous upgrade

16:45 kotarak: SegFaultAX|work2: I only use it inside a project, but vc itself doesn't care. Start the server manually as you like and it is good to go. Just make sure to get the classpath right.

16:45 SegFaultAX|work2: kotarak: Awesome, thanks.

16:46 scriptor: ibdknox: is there a way for it to reload code after I've made changes in the project?

16:46 ibdknox: (require [..] :reload)

16:46 sjl: is there a way to provide a default implementation for a protocol method? Or must I always type out the same fn body every time if just one implementor might need something different?

16:46 scriptor: ah, nice!

16:47 ohpauleez: ibdknox: Working for me - I had to comment out all my clj-stacktrace stuff in my profile.clj

16:47 Totally awesome stuff

16:48 pandeiro: right now light table is just doing jvm clojure, right? no js compilation?

16:48 ohpauleez: slj: are you in cljs or clj

16:49 ibdknox: pandeiro: yeah, just JVM right now

16:50 sjl: ohpauleez: clojure

16:50 seancorfield: ibdknox: it doesn't seem to recognize a top-level form like @foo - i have to either do (identity @foo) or (deref foo) - known issue?

16:50 ohpauleez: sjl: You can extend the protocol to Object

16:50 ibdknox: seancorfield: ah yeah, it doesn't know how to do that yet

16:50 ohpauleez: which will provide a default implementation

16:50 sjl: ohpauleez: that only works in an all-or-nothing wway, right?

16:51 ohpauleez: slj:Nope, it'll match specific extensions before it hits that one

16:52 kotarak: sjl: Use extend: (def your-defaults {:proto-fn (fn …)}) (extend YourType YourProtocol your-defaults)

16:53 sjl: you can mix-in other functions (extend YourType YourProtocol (merge your-defaults {:overriden-proto-fn (fn …)}))

16:53 sjl: kotarak: ohpauleez: one sec, let me type out something and paste it

16:55 SegFaultAX|work2: Random question: Is clojure feasible on Android (yet)?

16:56 scriptor: does vimclojure's fuzzy indent only work on def* and with-* names?

16:56 kotarak: scriptor: you can define your own patterns

16:56 scriptor: kotarak: right, just checking what comes out of the box

16:57 pbostrom_: ibdknox: my own $0.02: 1) it would be nice to have option to word-wrap output on right side instead of scrolling 2) It might not be that clojure-esqe, but if I want to de-reference an atom that has changed outside the light table scope, I have to exit live mode

16:57 kotarak: scriptor: that's basically what comes out of the box. def and with.

16:57 Raynes: SegFaultAX|work2: https://github.com/alexander-yakushev/lein-droid

16:57 scriptor: kotarak: ah, looks like let* also gets included

16:58 kotarak: scriptor: ah. indeed. The documentation contains a full list.

16:58 scriptor: :help clojure

16:58 sjl: ohpauleez: http://paste.stevelosh.com/4ffb45e5c5338c0007000000?clojure

17:00 kotarak: I think I can use bare extend and wrap a bit of sugar around it, thank you!

17:01 ohpauleez: sjl: Right, you don't want a default implementation, you just don't want to write the same code over and over again for you given types

17:01 sjl: ohpauleez: yeah, that's what I meant by default but there's probably another word that's better

17:02 ohpauleez: using raw extend is one way, or clojure.template if you felt really inclined

17:02 kotarak: slj; you always have to implement all functions of a protocol.

17:02 seancorfield: ibdknox: you need to update this page to show version 0.0.4 http://app.kodowa.com/playground/lein-light

17:02 kotarak: ohpauleez slj extend should be the first guess. No need to overengineer stuff for extend-type which just expands to an extend.

17:02 sjl: kotarak: really? In the example I gave ohpauleez the Dog can speak just fine, even though I didn't define the other one

17:03 kotarak: sjl: but you wrote that in-location fails for the dog.

17:03 ibdknox: seancorfield: pushing now, thanks

17:03 ohpauleez: kotarak: I agree

17:03 sjl: kotarak: in-location does fail. but speak works, even through I didn't implement thr full protocol

17:03 scriptor: I feel proud in having contributed to the creation of two entire lein-light versions

17:03 even if it was by whining

17:03 foxdonut: hehe

17:04 kotarak: sjl: yes. But in-location fails. If you want both to work, you have to implement them in the same extend.

17:04 ohpauleez: sjl: that's because you didn't implement the full protocol - that's why it failed, it has no method, because you didn't write one

17:04 kotarak: sjl: if you want default for the dog for in-location, you need extend+merge

17:04 ohpauleez: what kotarak said

17:04 sjl: kotarak: yeah, that "in the same extend" is what I'm trying to get around, and the bare extend + merge will let me do that

17:12 jg: (defmacro with-tokens [& body] `(let [tokens# (yaml/parse-string (slurp "tokens.yml")) {:keys [consumer_key access_key]} tokens#] (do ~@body)))

17:13 could someone explain what i'm doing wrong here?

17:13 the idea is to be able to write (with-tokens (print consumer_key))

17:13 technomancy: jg: consumer_key and access_key are locals

17:13 so they need gensyms

17:14 pydave6357: Hey all. I'm running my project with lein run -m <project-name>.core, but the execution time is pretty slow, presumably because I'm starting the JVM each time. Is there any way to speed things up? Keeping the JVM running in the background perhaps?

17:14 jg: technomancy: but will i be able then to access them in ~@body ?

17:15 technomancy: jg: what you're trying to do is write an anaphoric macro, which is widely considered a bad idea

17:15 you want to accept the names of the locals as args to the macro

17:15 pydave6357: most people start a repl and work from there

17:16 jjttjj: somewhat general question, but let's say I have have an entity "item" which corresponds to a db table, and I have an item model in my application. Some things, like a picture url, are not directly stored in the db, because they can be derived from the item's other attributes, config vars, etc. My question is, is it a bad idea to simply wrap the getters to tack on an extra k/v pair, eg, (assoc (first (select item)) :image-url

17:16 "www.site.com/blah.jpg"), or is it strictly better to have a seperate function (item->image-url [item])?

17:16 pydave6357: technomancy: I'll do likewise. Thank you.

17:19 jg: technomancy: okay i've written a macro accepting the names, it works. Still, i would be interested to know how to fix the posted code or if it's at all possible.

17:20 haspaker: Hi

17:20 My function returns 0N

17:20 Any knows what kind of value that is?

17:20 *anyone

17:20 technomancy: jg: it's not possible to use :keys in syntax-quote

17:21 hyPiRion: haspaker: ##(class 0N)

17:21 lazybot: ⇒ clojure.lang.BigInt

17:21 haspaker: Thanks

17:21 uvtc: haspaker: trailing "N" means arbitrary-precision decimal.

17:22 hyPiRion: uvtc: I think you're refering to M - ##(class 0.1M)

17:22 lazybot: ⇒ java.math.BigDecimal

17:22 hyPiRion: And no problem, sir.

17:22 haspaker: So what separates 0 from 0N? That the value is not certain to be 0, only close to it?

17:22 uvtc: hyPiRion: ack. I meant arbitrary-precision int. Thanks.

17:23 hyPiRion: haspaker: 0N means that the element is a BigInteger. In practice no difference from being a normal 0 integer.

17:25 haspaker: Yeah, looked it up on Wikipedia.

17:25 Thanks for the help everyone

17:26 Still strange, it should return 0.6

17:26 But I'll try some more debugging

17:27 hyPiRion: haspaker: Keep in mind that clojure has ratios. ##(/ 1 3)

17:27 lazybot: ⇒ 1/3

17:31 haspaker: hyPiRion: I don't understand your advice. Are you suggesting I should look for 3/5 instead of 0.6? :>

17:32 SegFaultAX|work2: Will (ns foo :reload-all) re-compile source?

17:33 hyPiRion: haspaker: Uh, not really. Just be aware of that. I burned myself on it first time I was around it.

17:34 haspaker: Ah. Don't worry then, I'm aware of that.

17:34 technomancy: SegFaultAX|work2: I think you have to scope :reload-all under a specific :require

17:35 but you can always try it

17:35 SegFaultAX|work2: technomancy: Here is the problem: I just want to reload source anytime I make changes without having to reload the repl.

17:36 technomancy: SegFaultAX|work2: best to do that via editor integration

17:36 SegFaultAX|work2: Also, I haven't got nailgun up and running yet.

17:37 technomancy: Ah. So does nailgun automatically relaod changed files?

17:37 technomancy: no, but presumably vimclojure would

17:37 or at least would make it easy

17:37 I don't know

17:38 emezeske: SegFaultAX|work2: You are a vim user?

17:38 SegFaultAX|work2: Use lein-tarsier, nailgun, and vimclojure, then you can type "\ef" to reload the current file. (You could also set up an after-change trigger to reload it)

17:39 kotarak: SegFaultAX|work2: vimclojure does not reload files automatically by design. You can add a autocmd on file saving to do that if you like.

17:39 SegFaultAX|work2: emezeske: Yea, that's what kotarak suggested earlier. I just haven't taken the time to get nailgun working.

17:40 kotarak: SegFaultAX|work2: I avoid doing anything automatic.

17:40 emezeske: SegFaultAX|work2: I see. You need to spend time to get it working, then :)

17:40 SegFaultAX|work2: kotarak: That's fair. What's the canonical way to reload something at the repl then?

17:40 kotarak: SegFaultAX|work2: Just do \ef or \et in the file. The repl will know the change.

17:41 SegFaultAX|work2: kotarak: What's the doing under the hood?

17:41 kotarak: SegFaultAX|work2: or a plain (require :reload 'your.name.space) in the repl.

17:41 SegFaultAX|work2: takes the code and sends it to the backend.

17:41 SegFaultAX|work2: the backend and repls running there will pick-up the change.

17:41 SegFaultAX|work2: kotarak: It just ships the entire file to the repl?

17:41 kotarak: SegFaultAX|work2: yes. With \ef. Or the current toplevel expression with \et.

17:42 SegFaultAX|work2: kotarak: That's pretty neat!

17:42 kotarak: Where is the best tutorial for setting up nailgun on OSX?

17:42 kotarak: (Or one for Linux if you got it)

17:43 kotarak: SegFaultAX|work2: java -cp clojure.jar:vimclojure-server.jar vimclojure.nailgun.NGServer

17:43 SegFaultAX|work2: with the correct jar names of course.

17:43 SegFaultAX|work2: There is also a launcher script in the VimClojure distribution but I haven't used it for ages.

17:43 emezeske: kotarak: Why not use lein-tarsier?

17:43 kotarak: SegFaultAX|work2: You have to use the nailgun server from the vc distribution.

17:44 emezeske: or vimclojure/gradle for gradle users. But SegFaultAX|work2 wants to use it outside a project.

17:45 SegFaultAX|work2: kotarak: That's right. While I'm learning it would be nice to have quick access to a REPL from vim eg slimv.vim

17:46 kotarak: SegFaultAX|work2: there is a repl built into vc. But with certain restrictions.

17:46 SegFaultAX|work2: eg. no access to stdin. So no (read-line).

17:46 emezeske: Well, I'd say particularly while you're learning, you should be using lein. But to each his own!

17:51 pandeiro: was there a doc somewhere on upgrading to lein2, specific issues etc?

17:52 technomancy: clojurebot: upgrading to leiningen 2?

17:52 clojurebot: upgrading to leiningen 2 is easy with this handy upgrade guide: https://github.com/technomancy/leiningen/wiki/Upgrading

17:56 pandeiro: technomancy: awesome thanks

17:56 technomancy: sure

17:59 haspaker_: God, my genetic algorithm certainly takes its time

18:00 TimMc: haspaker: Try giving it a few million years, I'm sure you'll see a result.

18:01 haspaker: I actually have some result just after 2000 iterations

18:02 The best of the created algorithms are 60% effective

18:02 emezeske: 60% of the time, they work every time.

18:03 tacoman: I think that's the first time I've heard that statement in a way that makes sense.

18:04 haspaker: I have a bug that only manifests itself after several thousand iterations

18:04 It's quite a pain in the ass to debug

18:08 tacoman: I think I've seen several mentions of genetic algorithms on the channel at various points. what are people using them for?

18:08 and does Clojure have any particular advantages to leverage them?

18:09 haspaker: They rarely have any real usage, only in very specific situations

18:09 They are mostly cool to make, I think

18:09 gtrak`: immutability means history's built-in?

18:09 ohpauleez: tacoman: genetic algorithms are great when you expect to have multiple maxima, and you don't have the clear way to find the absolute

18:09 so any problem that has that, counts

18:10 being able to have powerful, immutable data structures, with sane concurrency makes modeling the fitness function and the problem space easier

18:10 and opens the door for making the algorithm parallel

18:11 tacoman: You probably see a high mention of them here because a lot of early adoption of Clojure came from people doing machine learning and general sequence/stream crunching

18:12 tacoman: yeah. I have an AI class during my final undergraduate semester this fall, I wonder if the prof will let me use Clojure for it. I *think* we're supposed to do something along those lines.

18:13 ohpauleez: tacoman: If the prof can take a jar, solid. If not, spin up a Noir app on your university hosting account, and send him a URL :)

18:13 profs love the "extra mile"

18:13 tacoman: heh. and it'd certainly be good Clojure experience. I'm not even sure that I get any such hosting account. you mean one that the university would give to every student, right?

18:13 ohpauleez: right

18:14 tacoman: yeah.... despite being a "tech" school, I don't think I get one of those. >_<

18:15 SegFaultAX|work2: kotarak: So when you run your ng server, do you run it as a background job?

18:16 kotarak: SegFaultAX|work2: No. I run it in a separate terminal.

18:16 SegFaultAX|work2: kotarak: Or do you just always have an extra term open.

18:16 kotarak: I see. Isn't that kind of a waste, though?

18:16 kotarak: SegFaultAX|work2: I prefer the extra term. => Full job control.

18:16 SegFaultAX|work2: Other people prefer background jobs. Should work in any way.

18:17 SegFaultAX|work2: Who cares? Windows may be minimized if necessary.

18:17 SegFaultAX|work2: kotarak: That's true. I just have a separate tab in my console for it now (or a window in tmux depending on the environment I'm using)

18:18 ohpauleez: SegFaultAX|work2: FWIW, I use leon repl, then just start the ng server from there when I want it

18:21 SegFaultAX|work2: ohpauleez: Leon?

18:21 ohpauleez: Oh, lein. Yea.

18:21 ohpauleez: Disregard last highlight. :D

18:22 ohpauleez: leon - yes. OSX auto correct fail

18:22 technomancy: leon?

18:22 clojurebot: leon is a good sign it's time to turn off auto-"correct"

18:22 ohpauleez: lein**

18:22 technomancy: clojurebot: botsnack

18:22 clojurebot: Thanks! Can I have chocolate next time

18:22 ohpauleez: haha seriously, that was spot on

18:23 SegFaultAX|work2: kotarak: Your rainbow parens feature makes me want to find a general purpose plugin for that exact thing.

18:23 kotarak: Not only is it colorful and fun, it's damn useful to match things up visually.

18:27 kotarak: SegFaultAX|work2: It's probably possible to extract that. I just stole it from the lisp or scheme plugin. (Don't remember)

18:27 SegFaultAX|work2: kotarak: It's awesome all the same. :D

18:35 haspaker: Wohoo!

18:36 My genetic algorithm worked perfectly

18:36 Turns out I has set up the conditions wrong, so the "bug" was nothing more than the algorithm solving a different problem than I had expected

18:40 zakwilson: I'm looking for an imap library. All I've found with google is nonomail (which hasn't had an update in a while) and a project on nakkaya.com that has jars, but no public repo. There are a lot of noise results related to the interface imap.

18:48 hiredman: zakwilson: client? have you dismissed javamail's implementation?

18:49 * talios shudders at javamail

18:49 talios: it works. but thats all I can say :)

18:50 hiredman: javamail has the virtue of generally enforcing rfc compliant email generation, given the abundance of email that isn't compliant, there must be a lot of software that doesn't

18:51 talios: Agreed. I don't mind the API, its more some of its internals that are kinda weird, designed to be open/flexible almost tooo much, the whole activation.jar framework stuff

18:52 But… theres plenty of wrappers around it ( like SpringMail etc. ) which make it nicer to work with for simple things.

18:52 brehaut: hiredman: what do you mean you cant use a regexp to validate an email address correctl‽ *sigh*

18:52 zakwilson: hiredman: yes, client. nonomail seems to wrap com.sun.mail.imap. The other wraps javax.mail.

18:52 talios: 'lo brehaut

18:52 brehaut: hi talios

18:52 hiredman: we've been running in to almost the opposite at work, javamail has a lot global options

18:53 a lot of

18:53 and options the result of which are read in to a finaly private field, so you cannot change them, etc

18:53 talios: doh

18:54 There might be some stuff extracted from the Apache James mailserver project now as well, I know mime4j popped out of that.

19:06 hiredman: I just saw an email address that had a non-breaking space as the last character in the domain part

19:06 email really is disgusting

19:06 technomancy: it's the date headers that'll really churn your stomach

19:09 zakwilson: I have yet to find a satisfactory mail client (no, I'm not currently looking for libraries to write a general-purpose mail client in Clojure)

19:11 But yes, email is a mess. I love email though, conceptually.

19:32 Raynes: zakwilson: You can't even find a satisfactory IRC client!

19:33 seancorfield: using javax.mail is pretty nasty... at world singles we wrapped it up so we can just say (send-email from to subject body) and not have to see how the sausage is made...

19:34 zakwilson: Raynes: I have a pretty satisfactory general-purpose interactive IRC client. Clojure IRC libraries, on the other hand....

19:34 seancorfield: yeah, I have a wrapper like that in a product I built for a customer too. I want to receive email now.

19:36 hiredman: zakwilson: you can use something like subetha smtp to just recieve mail that way

19:37 (being an smtp server)

19:38 Raynes: seancorfield: You could have just used that apache commons library and not have bothered with javamail.

19:42 zakwilson: hiredman: I don't want to be a mail server. I want to be an imap client.

19:44 Raynes: Really? I always wanted to be a fireman when I grew up.

20:04 zakwilson: I wanted to be a cop. Almost went for it.

20:05 hiredman: then you realized you'd spend your days telling kids to get off their skateboards and move a long?

20:06 this email address is in the form: "Foo Bar" <foobar[foobar@blah.com]>

20:06 ugh

20:07 brehaut: hiredman: is dealing with that better or worse than the affordmention skateboards?

20:07 hiredman: touche

20:18 TEttinger: how would I call a function a set amount of time after the program starts?

20:19 (Clojure, probably going to be Swing-based)

20:19 gtrak`: java Timer

20:20 http://docs.oracle.com/javase/1.4.2/docs/api/java/util/Timer.html#schedule(java.util.TimerTask, long)

20:22 jeremyheiler: yeah, email sucks. There's a reason why I haven't done much with Lime. I'm still digesting the million related RFCs

20:23 Frozenlock: TEttinger: Check https://github.com/overtone/at-at

20:23 Is there a way to change the destination port in clj-http?

20:23 brehaut: Frozenlock yes

20:24 (finding it)

20:25 Frozenlock: actually, cant you just put it into the url string like normal?

20:25 pandeiro: are there any existing clojure wrappers for java smtp servers?

20:25 Frozenlock: Like ""? I must have done something wrong, it blew up when I tried...

20:26 brehaut: yeah, i was sure that worked

20:27 Frozenlock: Oh- it does, I forgot to put https

20:27 brehaut: aha

20:27 * Frozenlock is testing with certificates

20:27 brehaut: you have my sympathy

20:27 Frozenlock: :p

20:27 thanks

20:27 But of course my certificate is for my URL, not, so it just refuses to connect -_-

20:27 brehaut: hosts file time

20:28 Frozenlock: Oh wait, I just listened to the security now podcast about that!

20:34 TEttinger: Frozenlock, I can't seem to install AT-AT via Lein

20:35 pandeiro: who knew setting up an e-mail server was so easy? http://www.ian-barton.com/blog/linux/2011/10/31/archlinux-mail-server.html

20:35 just 73 steps

20:36 Frozenlock: TEttinger: [overtone/at-at "1.0.0"] works just fine for me...

20:36 (in your project dependencies)

20:37 TEttinger: http://ideone.com/usffj

20:38 oh, /

20:39 brainproxy: time to shop for a new work laptop, will primarily be doing clojure and nodejs dev stuff.. new macbook pro? or thinkpad w530 + linux? any clojure devs here recently contemplated similar decision?

20:39 Frozenlock: Arg I was messing with the hostname file silly me

20:41 emezeske: brainproxy: both of those options are very good, I think

20:41 Frozenlock: brainproxy: Why not a real computer? A big manly tower :)

20:42 brainproxy: Frozenlock: because I like to be able to switch easily between my standing desk, an easy chair, and going elsewhere to code

20:42 so using a beefy laptop as a mobile workstation is appealing to me

20:43 Frozenlock: Oh- didn't think of that. I must say I have a transforming desk. Desk, maximize! *weird tranformers sound*

20:45 Ehhh... do I need to reboot or something once I changed my hosts file?

20:45 brainproxy: shouldn't need to

20:46 Frozenlock: grrr

20:47 Is there, by any chance, a command to return the current hostname?

20:47 nsxt_: Frozenlock: echo $HOST

20:47 ?

20:48 Frozenlock: Sorry, I meant the name associated with

20:48 but yes, echo $HOST does work, thanks ;)

20:49 unnali: brainproxy: I use a MacBook Air for node/erlang/clojure, it's pretty sweet.

20:49 aperiodic: Frozenlock: `hostname`

20:50 Frozenlock: yes! Thank you very much

20:51 brainproxy: unnali: I'm wearing out a 17" mbp from 2010.. new mbp would make a lot of sense; but so many of my tools are *nix things or platform neutral and would work just as well on a linux laptop

20:52 so I'm contemplating just switching over to full-time linux for my work machine

20:52 but hesistant at the same time :/

20:52 unnali: brainproxy: I find the unrefinedness of the Linux experience distracts from just trying to get shit done™

20:52 emezeske: brainproxy: I do all dev under linux, and confirm that it is just fine

20:53 unnali: (I used Linux as primary for 6 or 7 years, had to use OS X with work, didn't go back.)

20:53 nsxt_: brainproxy: all dev under linux here as well, no problems. "getting shit done" is highly contingent on your distro, i've found.

20:53 brainproxy: nsxt_: what distro do you use?

20:53 nsxt_: brainproxy: arch

20:53 Frozenlock: I don't care about my OS anymore since I use Emacs

20:54 unnali: rofl

20:54 brainproxy: Frozenlock: yeah, emacs here also

20:54 emezeske: The first thing I do when I install an OS is totally bastardize it into what I want (xmonad, xterm+tmux, vim, etc), so OSX isn't really more refined for me

20:54 brainproxy: but at the same time, my brain has been wired to mac since i started using the os x public beta back in 2000

20:54 i mean for everyday desktop/laptop stuff

20:55 but I deploy and dev in linux virtual machines also

20:56 i wonder if I could find a place that would let me rent a thinkpad for awhile and wouldn't care if I blow away the OS and put linux on it

20:56 iow, try it for awhile and see if I would be happy

20:56 nsxt_: brainproxy: are you looking for any old laptop to try linux with? or specifically a thinkpad

20:57 brainproxy: I met some clojure devs at Strange Loop last year, and they all had thinkpads + linux

20:57 so seemed to me like a promising combo

20:57 nsxt_: brainproxy: i've an old dell i wouldn't mind giving away for free. i know some people cringe at the thought of dell, but for 3 laptops straight now, it's been pretty solid.

20:58 Frozenlock: brehaut: ok I don't want to sound like an easily impressionable little girl, but... OMG it worked! Thank you for mentioning the hosts file!

20:58 * Frozenlock says, in a manly way

20:58 unnali: Frozenlock: nothing wrong with sounding like a girl :3

20:58 brainproxy: nsxt_: i might consider dell, i just know thinkpad has a reputation for being linux friendly

20:59 Frozenlock: No, but "an easily impressionable little girl", yes :P

20:59 unnali: so you say it in a manly way … an easily impressionable little man? :P

20:59 nsxt_: brainproxy: i haven't really followed dell's bundling of ubuntu, but i'm fairly positive they're just as, if not more, friendly

20:59 Frozenlock: unnali: Ouch

20:59 brainproxy: nsxt_: thanks for the tip, I'll definitely research that avenue

21:00 nsxt_: brainproxy: here's some help: http://www.ubuntu.com/certification/desktop/make/Dell/?csrfmiddlewaretoken=c61120be39ee7cdbb58136e7ab7e4f57&query=&category=Laptop&release=Any&level=Any

21:00 Frozenlock: God I can't believe I thought I would have to test my webserver from outside my LAN after I added the certificates.

21:00 nsxt_: not that you're necessarily going to run ubuntu, but it'll give you a good idea of compatibility

21:00 * Frozenlock bangs his head on the wall

21:03 pandeiro: that thinkpad w530 looks pretty butch, anyone use one?

21:08 brainproxy: nsxt_: thanks for the link.. for starters I probably will use ubuntu

21:10 TEttinger: pandeiro, just got one for my brother

21:11 he loves it, but he loved his 4-year-old thinkpad (that still runs) too

21:11 old one was a thinkpad T-series

21:11 they are both clearly durable things, no flimsy bits anywhere on them

21:12 thinkpad edge series are crazy cheap for what you get though, especially when there's a coupon

21:17 brainproxy: TEttinger: what does he think of the new chiclet keyboard?

21:17 vs the old style keyboard that was so highly praised for many years as one of the best features of thinkpads

21:18 TEttinger: brainproxy, haven't heard him complain -- he has always had a lenovo-branded thinkpad, never had an IBM

21:23 _tca: the new keyboards are still good brainproxy

21:23 brainproxy: I'm pretty used to the chiclet style, since mbp's have had that for awhile

21:23 pandeiro: TEttinger: i think i'd prefer to shed the optical drive and a couple inches off the screen, but it's an impressive machine for the price

21:23 albeit once you quadruple the RAM and switch to a 128GB SSD it pushes $2500

21:44 TimMc: I know that 'keys and 'vals must return the same ordering for a given instance, but are (map key m) and (keys m) guaranteed to match?

21:48 zakwilson: I don't think it makes that guarantee. The current implementation might always behave that way, but you can't rely on it.

22:05 amalloy: TimMc: probably not

22:30 alfred: e

22:35 emezeske: bash: e: command not found

22:40 cshell_: e

22:50 unnali: ksh: e: command not found

22:57 TimMc: clintm: Nope, -> is a stitching macro.

22:58 &(clojure.walk/macroexpand-all '(-> d (c) (b) (a e)))

22:58 lazybot: ⇒ (a (b (c d)) e)

23:01 nDuff: Hrm.

23:15 clintm: TimMc: damn, that's cool. $ and . in haskell. sort of.

23:16 wait, not sort of. Per that example, it's the same behavior as $ in .hs

23:17 either way, pretty cool.

23:25 nDuff: ::foo seems to always be becoming "\ufdd0'user/foo" in cljs, regardless of the local ns

23:32 amalloy: clintm: no, it's not the same

23:32 wmealing: so, ive done some quick reading on https://github.com/schani/clojurec , i think you'd lose the java interop, but can you call C ?

23:32 amalloy: -> operates at the source-code level because it's a macro, so it can do things that are not possible with function composition

23:33 &(-> lol whut undefined symbols quote)

23:33 lazybot: ⇒ (symbols (undefined (whut lol)))

23:41 mwanga`: clj-camel - a new library that lets you write routing DSL in clojure

23:41 as plain vectors. https://github.com/hmanish/clj-camel

23:42 clj-camel - a new library that lets you write Apache Camel routing DSL in clojure

23:42 as plain vectors. (https://github.com/hmanish/clj-camel)

23:43 brehaut: mwanga`: pure functions of no arguemnts are just constants; you could write (defn make-error-handler [] [[…]]) as (def error-handler [[…]])

23:44 mwanga`: agreed ... i'll fix the sample

23:53 nDuff: dnolen: I'm hitting the CLJS-266 issue myself, and have attached a patch updated to apply to the current code. WORKSFORME, but I'm not sure if the decisions in terms of which namespace to put the new vars in was appropriate.

23:57 dnolen: nDuff: will take a look

23:57 nDuff: thx

Logging service provided by n01se.net