0:11 muhoo: ok stupid question time. first returns nil if the list is empty, but rest returns empty list?
0:11 that seems... confusing.
0:13 (let [foo '()] [(first foo) (rest foo)])
0:13 &(let [foo '()] [(first foo) (rest foo)])
0:13 lazybot: ⇒ [nil ()]
0:14 _phil: ,(doc rest)
0:14 clojurebot: "([coll]); Returns a possibly empty seq of the items after the first. Calls seq on its argument."
0:14 G0SUB: muhoo, that's the difference between rest & next.
0:15 ,(doc next)
0:15 clojurebot: "([coll]); Returns a seq of the items after the first. Calls seq on its argument. If there are no more items, returns nil."
0:15 muhoo: hm, ok. it still seems weird to me.
0:15 _phil: ,(reduce + 0 nil)
0:15 clojurebot: 0
0:16 G0SUB: muhoo, use next if you need that behavior.
0:16 _phil: ,(reduce + nil)
0:16 clojurebot: 0
0:16 _phil: ok then i dunno what it is for :)
0:17 since functions operating on seqs seem to not have any problems with nil
0:17 muhoo: &(seq nil)
0:17 lazybot: ⇒ nil
0:17 muhoo: &(seq)
0:17 lazybot: clojure.lang.ArityException: Wrong number of args (0) passed to: core$seq
0:18 muhoo: ok, so first/next instead of first/rest, got it.
2:20 echo-area: Is `alter' retried for every commits in other transactions?
2:21 E.g. if there are 5 versions made by some other transactions, an alter will be retried for 5 times?
2:24 http://
2:25 For example, the transaction in function `retries' is always retried for 3 times
2:42 Hmm, Clojure's Java source code is in Whitesmiths style
2:51 raek: echo-area: have you seen this? http://
2:51 echo-area: raek: No, but I'm reading now, thank you
2:55 raek: The first glance makes me believe that this link is definitely more informational than the source code. Thank you!
2:57 raek: the point in time when it is determined if the current transaction should be retried is at the end of the transaction
2:57 they are optimistic, so they won't be aborted halfway through
2:59 echo-area: I seem to understand what these two sentences mean, but don't know how this connects to my question. Will come back to them when I finish reading.
3:00 raek: "Is `alter' retried for every commits in other transactions?" Calls to alter are not retried, whole dosync blocks are.
3:01 "E.g. if there are 5 versions made by some other transactions, an alter will be retried for 5 times?"
3:02 if those 5 changes by some other thread all happen during the transaction of the first thread, the transaction if the first thread will be retried once
3:02 echo-area: Oh, I see. So when the whole transaction is retried for the second time, another change to `r1' happens, this triggers the third retry.
3:03 Completely understood. Thank you :)
3:03 raek: the "start point" and the "end point" of a transaction are where the interesting things happen at...
3:15 mduerksen: what tools are recommended for authentication in a ring-based web-app?
3:15 sandbar?
3:33 brehaut: mduerksen: what tools are recommended for building a build? it depends on the building
3:38 Blkt: good morning everyone
3:40 mduerksen: brehaut: you're right, my question is quite vague. next try: do you know of other alternatives for basic-authentication+ssl in a ring-based web-app?
3:55 tscheibl: mduerksen: cookies + ssl
3:55 clojurebot: I don't understand.
4:05 mduerksen: tscheibl: yes, basic-auth for login, then cookies, and everything with ssl, that's what i have in mind. my question is: should i write it myself, with my own ring middleware for redirecting to https when necessary, together with ring.middleware.cookie, or is there already a solution for this? i'm not experienced in security and authentification, so i don't know what puzzle pieces i may miss.
4:05 ivan___: Good Evening. In scala i have a state machine that is implemented with actors because we have several tasks running through it - ie one thread manages a lot of of concurrent workflows. Is there a way I can do this with clojure? I've been looking at agents but im not 100% sure
4:11 aperiodic: yeah, agents are an easy way to do that
4:12 i have some code that does farms out most of its io to agents
4:12 to deal with so many failures and dropped connections
4:13 basically, set the state of the agent to the data you want to send, then write a function that takes that state as input and attempts to flush it
4:14 it returns what it didn't manage to flush, so if it flushed everything, it returns an empty collection
4:15 ivan___: aperiodic: so one state machine is something that provisions a ec2 server. the workflow is, you launch a server, then wait until it comes up, currently in akka I use a scheduler to send a message every 10s to look at state of server to see if its ready
4:15 if its not, i send the same state 10s later
4:15 if it is, im done
4:15 aperiodic: ivan___: you could have the agents implement state machine functionality, sure
4:15 they run in their own threads
4:16 ivan___: 1 agent = 1 thread?
4:16 aperiodic: yup
4:16 use send-off! to start an io-bound agent, though
4:16 ivan___: what happens if you want to have say 10 threads for the state machines (in akka you do 10 actor instances, and you can load balance them)
4:16 aperiodic: it denotes that it's gonna be sleeping a lot, so cpu cores will be oversubscribed
4:16 that's fine
4:16 fire them up as needed
4:17 when you need to wait on one, deref it (see the '@' reader macro)
4:17 they're even stopped if the reference is gc'd!
4:18 that's one of the great things about clojure; this kind of thing is not hairy at all
4:18 i mean, i haven't had an issue, it's possible YMMV
4:18 ivan___: do they have to store state?
4:18 aperiodic: my n is 1
4:19 well you can just think of it as a computation
4:19 ivan___: so in akka my state is what i send the actor, its not actaully reading input, and mutating state
4:20 the function that reads the state sends a new message back to itself with the new state, progressing the machine
4:20 aperiodic: the state machine is implemented as a pure function?
4:21 you can do the same thing in clojure
4:21 ivan___: so its like def receive = { case Task("somestate") => self ! Task("somenewstate")
4:21 if you are familiar with scala at all ..
4:21 aperiodic: i am not familiar in the least, sorry
4:22 but you can have the actor do only io
4:22 um, agent
4:22 sorry
4:22 or do both
4:22 ivan___: thats just matching a case with state == somestate, and sending a new message back to the actor with the updated state, no internal mutation of state
4:22 ok
4:23 it doesnt help that im learning clojure while doing this ;)
4:23 aperiodic: have you done any erlang?
4:24 this sounds a bit similar to some erlang idioms i've seen
4:24 echo-area: Is add-watcher removed in the current Clojure?
4:24 ivan___: yeah i believe akka/scala actors were based on erlang
4:24 i havent done any erlang, although its on my todo list
4:25 we do use erlang at work (the scala state machine is from a work project too)
4:25 aperiodic: i guess one question i have is am i even approaching this the right way in clojure. I feel like im just trying to reimplement an actor
4:26 aperiodic: have you read through all the sidebars on clojure.org?
4:26 ivan___: ive done about half 4clojure.org hehe, and read some of the sidebars
4:27 aperiodic: until i found 4clojure i was really lost in lisp
4:27 aperiodic: i'd highly recommend sitting down and reading through all those sidebars
4:28 once i grokked clojure's focus on immutability and its approaches to concurrency writing this sort of code became much easier for me
4:28 ivan___: immutability is fine, most of the scala i write is immutable, its more the approach to concurrency
4:29 aperiodic: each concurrency primitive has a really well-defined scope, and one is usually a fairly natural fit for any given way i want to access the data/have the computation performed
4:29 ivan___: actaully learning clojure has been fairly easy, everything is a function, just look up the function api
4:29 aperiodic: right?
4:29 it's just a big list
4:29 not some crazy javadoc where you have to do the class hunt
4:30 also, i've been reading through joy of clojure this weex
4:30 *week
4:30 and i've learned a ton
4:30 ivan___: aperiodic: so there is one more constraint i havent told you about... i need to update a db each time the state changes, and have the state machine be resumable - this is by far the hardest part of the whole exercise since state machines are pretty common
4:31 aperiodic: afraid i don't have any RDB experience
4:31 only redis and hbase
4:31 ivan___: we are probably going to be using redis
4:31 but where its persisted is irrelevant
4:31 thats easy
4:31 Psy-Q: wow, that's some big doc comments in clojure core :|
4:32 aperiodic: ivan___: i've found using redis to be pretty painless
4:32 ivan___: aperiodic: currently we store everything in json on disk, anything is painless compared to that... :)
4:33 aperiodic: ivan___: just in the fs? access it via file open?
4:33 ivan___: i mean, im trying to right a v2 of this app, v2 wont do fs
4:33 aperiodic: ivan___: gotcha ;)
4:34 patchwork: I am having a problem with load-file. I try to say (use 'clojure.string) but it gives me "Unable to resolve symbol: use in this context"? Does load-file really not know use?
4:35 aperiodic: ivan___: i don't see much need for a state-machine framework/library... i think they're implemented pretty well using letfn
4:35 twem2: //
4:35 #
4:35 uit
4:36 aperiodic: ivan___: if you wanted you could write some macros for that, or even just high-level functions
4:36 ivan___: aperiodic: a workmate said we could implement it around a blocking queue, actors are just conventent in scala
4:36 i need to read up on concurrency more
4:38 lucian: ivan___: your scala case can be expressed in a regular clojure function in several ways, afaikl
4:38 aperiodic: ivan___: i usually use a map, since our data is coming in semi-structured, and it allows me to, e.g., flush certain parts of that structure faster than others
4:38 lucian: ivan___: explicit (case ...), multimethod, protocol
4:38 ivan___: i was just pointed to channels
4:39 lucian: ivan___: there are also a few matching libraries for clojure
4:39 ivan___: i think i'd express a state machine as a multimethod
4:39 aperiodic: ivan___: have the main thread loop through the structure and see what needs flushing, then farm out the actual transaction to an agent, have the agent return what it couldn't flush, rinse, repeat
4:39 ivan___: lucian: that stuff im not really worried about, its more the state changes
4:40 aperiodic: ivan___: but i'm not a whiz or anything, so there are almost certainly better ways to do it ;)
4:40 lucian: ivan___: right. the way i understand it (and i'm a clojure newbie too) is that you give the actor a function to change itself with
4:40 s/actor/agent/
4:40 ivan___: aperiodic: i think ill ask again tomorrow during more primetime, but you have given me things to thing about
4:40 lucian: dammit, the terms are too similar
4:40 ivan___: lucian: yeah, although im not sure i even need an agent
4:41 lucian: ivan___: so i think you could put your data in an agent and then pass it the state machine function until it runs out of data
4:41 osa1: why (type 'true) is java.lang.Boolean? shouldn't it be clojure.lang.Symbol ?
4:41 aperiodic: ivan___: yeah, i'll probably be actually online 2-5 PST
4:42 lucian: ivan___: they seem the right thing to use here, i guess. i highly recommend reading The Joy of Clojure
4:42 ivan___: aperiodic: i think ill try and write some code with an agent, and then gist it and ask for advice... one issue i have is actaully visualising what we have been talking about ;)
4:42 aperiodic: ivan___: yeah, that's how one really gets a handle on things.
4:43 man fogus must love us
4:43 ivan___: i have a few ideas
6:27 osa1: why (type 'true) is java.lang.Boolean? shouldn't it be clojure.lang.Symbol ?
7:05 raek: osa1: no. true, false, and nil look like symbols but they aren't
7:14 osa1: raek: why do we need false and true as symbols when we already have true/false special values?
7:18 fhd_: I'm changing the Leiningen source path by setting :source-path (to src/clj), but now it doesn't find my custom plugin (under src/clj/leiningen) anymore. Ideas?
7:26 raek: osa1: are you asking why one would want to have true/false/nil as special values or why one would want to have true/false/nil as symbols?
7:27 osa1: raek: actually why one would want to have both at once
7:28 raek: I didn't say that one would want that
7:28 but technically it is possible in CLojure
7:29 (just not recommended)
7:29 lucian: one could make false truthy or something
7:30 raek: that too :)
8:30 yawNO: howdy world
9:07 uvtc: When using `ns`, why don't the "references" need to be quoted? That is, (ns foo (:use (my.lib this that))) seems like it ought to be (ns foo '(:use (my.lib this that))) or (ns foo (:use '(my.lib this that)))...
9:09 compj: ns is a macro I guess
9:10 uvtc: Seems like Clojure would try to treat (my.lib this that) as a fn call... and also it would not be able to resolve those symbols.
9:13 compj: the forms are already quoted passed to the (ns...) call, because it is a macro
9:13 sentence broken, hope you get it :)
9:14 uvtc: compj, thanks. Yes ... macros appear to be aware of the matrix. :)
9:14 Is there a way to ask if a given symbol refers to a macro (as opposed to a regular fn)?
9:15 compj: try (.isMacro #'ns)
9:16 don't think this is part of the stable api
9:16 uvtc: compj: oooh.
9:17 compj, neat. Oh, doh -- also it says right at the top of the output from `(doc ns)` that it's a macro. Should've noticed that.
9:17 TimMc: Huh, I figured that was a special form.
9:18 compj: yes, thought you were looking for a api call. (:macro (meta #'ns)) should also work
9:18 TimMc: seeing as it is used in the first form in core.clj
9:19 compj: is defined in core.clj:5065 here
9:25 TimMc: Interesting...
9:25 but it is definitely used at the top of the file, also
9:26 compj: so macros can be used over its definition, maybe
9:26 TimMc: That's probably a compiler literal that is later shadowed by a macro.
10:07 Psy-Q: any book recommendations to get into clojure?
10:08 joegallo: Joy of Clojure is very good.
10:08 Psy-Q: i'm reading Joy of Clojure and will probably get the pragprog book, but beyond that i'd be happy about recommendations.
10:08 oh good, then i'm on the right path :)
10:08 joegallo: "The best book on programming for the layman is 'Alice in Wonderland'; but that's because it's the best book on anything for the layman."
10:08 ;)
10:08 jk, jk
10:09 Psy-Q: :)
10:09 it seems there's no section on book recommendations in the wikibook linked from clojure.org
10:09 jeremyheiler: Psy-Q: Just start creating stuff.
10:09 Psy-Q: is that on purpose, so as not to be biased towards anyone's book?
10:09 TimMc: Doubt it.
10:10 algernon: It's because all of them are awesome, so if you buy and read any Clojure book, that's good.
10:10 jeremyheiler: Psy-Q: oh, and solve problems on 4clojure.com !
10:10 Psy-Q: jeremyheiler: we're making a media archive system and we have a small REST interface now, i wanted to dive into the deep end and make something in clojure that displays a grid of images from the archive via REST with a java GUI
10:11 jeremyheiler: Psy-Q: Nice, that sounds cool.
10:11 Psy-Q: could do that in clojurescript with a browser, now that i think about it
10:11 jeremyheiler: ah, will do 4clojure stuff this weekend then
10:48 brett_h: Java Interop question: I can't figure out how to access the CompressionType enum given the SequenceFile class http://
10:48 I've tried (. foo bar), foo/bar, etc to no avail
10:48 joegallo: SequenceFile$CompressionType
10:48 bit a wart, imho
10:49 bit of a wart, even
10:50 brett_h: thanks
10:50 ah, that's kind of hidden on http://
10:51 hmm, Unable to resolve symbol: SequenceFile$CompressionType in this context
10:51 joegallo: of course, that's the actual class on disk, but java provides pretty sugar when you reference it
10:51 import it?
10:51 brett_h: SequenceFile is
10:52 joegallo: gotta do both, i think
10:52 brett_h: I don't have to/can't import CompressionType can I?
10:52 hmm
10:52 joegallo: these are two distinct classes, the name relationship is a trap
10:52 brett_h: it's nested, now I'm confused, so do I actually import foo$bar?
10:52 joegallo: (:import (some.package Foo$Bar))
10:53 It's a legitimate distinct class, you just need to treat it as such, do not be fooled by the $. ;)
10:54 gtrak`: can you actually construct non-static inner classes from clojure?
10:55 in java you would do this.new InnerClass();
10:55 raek: the whole nested classes thing is a java compiler invention
10:55 it does not exist on the byte code level
10:56 (except for some annotations and attibutes)
10:56 gtrak`: I imagine in clojure you would have to do (InnerClass. outer arg1 arg2..)
10:56 raek: gtrak`: ah, now I understood the question.
10:56 in theory, yes
10:57 you can look at the output from javap -c to see what the contstructors really look like
10:57 there is a good article about this
10:59 ah, here it is: http://
11:03 gtrak`: raek: thanks, on my reading list :-)
11:03 TimMc: tmciver and I are working on "import+", which will have renaming imports.
11:04 Doing something about the inner$class situation would be in scope.
11:22 raek: TimMc: will it be able to import static fields too? (e.g. enum values)
11:40 tmciver: raek: you can import static fields like Math/PI but...no sure about enums
11:44 TimMc: raek: Sure, that's the goal.
11:44 raek: We're actually building it off of clojure.contrib.import-static, which really needs an overhaul itself.
13:16 * hagna is watching simple-made-easy
13:17 cemerick: FYI, new Mostly λazy: Episode 0.0.4 w/ hugod and tbatchelli about #pallet and more (from Clojure Conj 2011) http://
13:18 pyr: when / where is euroconj
13:19 tbatchelli: pyr: may 24+25, London
13:19 pyr: 'k sounds nice
13:20 tbatchelli: it does. Airplane tickets from SF don't look that nice though :(
13:20 pyr: heh
13:20 not gonna complain for once
13:20 tickets from geneva will be much less :)
13:31 tutysara: Hi room
13:31 mdeboard: hi
13:31 tutysara: clojure newbie
13:31 trying to setup a clojure env with emacs
13:32 following the instructions at - http://
13:32 got an error while installing - slime-repl
13:32 mdeboard: tutysara: That is very outdated
13:32 the-kenny-w: 2009 is pretty outdated
13:32 dnolen_: tutysara: http://
13:32 tutysara: slime-repl.el:122:39:Error: No setf-method known for slime-connection-output-buffer
13:33 yes outdated
13:33 let me try your link
13:33 mdeboard: It's literally like 2 steps nowadays :P
13:33 the-kenny-w: Short version: Use leiningen, install swank-clojure as leiningen plugin, install clojure-mode in emacs and do M-x clojure-jack-in
13:34 tutysara: as simple as that?
13:35 technomancy: you probably have to get rid of your current slime setup first
13:35 mdeboard: tutysara: Yes
13:35 tutysara: It's extremely easy thanks to that one dude who made lein
13:35 and all the other contribs to it
13:36 the-kenny-w: technomancy: Btw. is there a way to prevent jack-in from bootstrapping slime by installing a compatible version? Sometimes, when I restart emacs, I find myself without slime when I want to use it with scheme.
13:39 technomancy: the-kenny-w: if you don't want to bootstrap slime you should use lein swank instead of jack-in
13:40 the-kenny-w: Hmm
13:40 Nah, I'll stick with jack-in.
13:57 hagna: I suppose someone here would agree with Rich Hickey that you should leave information alone and not turn it into an object?
13:58 TimMc: hagna: Not sure where you're getting that.
13:59 {:a 5} is an object
14:00 hagna: 56:23 in http://
14:00 TimMc: Oh, *classes*, sure.
14:01 hagna: heh not sure I get it then hmmm
14:01 TimMc: hagna: {:a 5} is an object that is an instance of.... let's see: ##(class {:a 5})
14:01 lazybot: ⇒ clojure.lang.PersistentArrayMap
14:02 TimMc: that ^
14:02 hagna: TimMc: I don't know clojure that well
14:02 TimMc: but an ORM does seem to hide information behind a micro-language
14:02 TimMc: ORM's are a whole 'nother kettle of monkeys
14:03 arohner_: hagna: the point there is that each class is it's own mini-DSL, .getFoo, .getBar, etc, while 'everything is a map' means you can use the same api on all maps
14:03 TimMc: arohner_: Thanks, I was struggling to phrase that.
14:04 hagna: arohner_: so if I have a database then ... what's the nice way to represent the data?
14:04 everything is a map again?
14:04 arohner_: hagna: every row is a map, in most clojure DB libraries
14:05 TimMc: a set or list or vector of maps
14:06 or more likely, a seq of maps
14:11 ibdknox: hagna: try Korma: http://
14:11 hagna: seems to me the ORM made databse access more consistent and possible easier to reason about
14:11 ibdknox: ok
14:12 s/possible/possibly
14:12 TimMc: ibdknox: Does Korma provide data manipulation, or just retrieval?
14:13 ibdknox: TimMc: hm? I does all the standard SQL stuff
14:13 it*
14:13 insert/update/delete/select
14:13 korma.incubator has some of the DDL stuff in it too
14:13 though I didn't finish it
14:18 TimMc: I've run into a situation in one of my projects where SQL wasn't sufficient, so I pull allll the data into memory and munge it from there, then stuff it all into a different database at the end.
14:19 Now there's a bit where I actually wish I had SQL semantics for data-structures.
14:19 I probably just need to dump stuff into the DB sooner than I had been.
14:20 hagna: is it pretty simple to give someone a clojure program if that someone is using osx, windows, linux or droid linux?
14:22 TimMc: hagna: Yes, if they have a JVM installed.
14:22 which most people do
14:22 ibdknox: TimMc: I played around with doing that
14:22 I don't have the motivation to really do it though
14:22 TimMc: ibdknox: ANy luck?
14:22 hagna: TimMc: so what do you give the person a jar file?
14:23 ibdknox: TimMc: yeah, it seemed like I could apply a decent subset of Korma's functionality directly to objects
14:23 TimMc: hagna: Yep. `lein uberjar` makes a jar with all the dependencies, and you hand them that and maybe a shell script to call java -jar foo.jar
14:24 dougs87: TimMc: is that jar file then dependent on a particular JVM version?
14:24 TimMc: "Sufficiently recent" should be good.
14:25 dougs87: same major version sort of thing?
14:25 ibdknox: TimMc: simple example: https://
14:26 hagna: leiningen as in vs. the ants?
14:26 mdeboard: yes
14:27 hagna: that'
14:27 s quite humerous
14:28 ibdknox: TimMc: with some more macro magic, you could get rid of the (% :t) necessary
14:32 it'd probably be pretty useful
14:35 For those not using Noir, I'd love to hear why not :)
14:38 hagna: lein compile gave me Exception in thread "main" java.io.FileNotFoundException: Could not locate leiningen/core/main__init.class
14:38 technomancy: hagna: leiningen from git is not quite ready for consumption; use a stable release.
14:39 hagna: technomancy: ahh ok
14:39 I suppose I ought to delete .lein to get back to a fresh state?
14:40 chewbranca: ibdknox: I've been using noir for some personal projects and its been working well, clean framework that makes it easy to get stuff done. I would say the biggest issue is mainly just lack of 3rd party libs, especially coming from the rails world, but that will only get better with time
14:40 technomancy: hagna: probably doesn't matter, but you can try that if you have trouble
14:41 ibdknox: chewbranca: yeah, just a matter of people building them :)
14:41 hagna: technomancy: so I was following the instructions that say download lein then do lein self-install
14:41 TimMc: ibdknox: Yeah, definitely looks reasonable.
14:42 technomancy: hagna: yes, but the instructions point to the stable branch, not master
14:42 hagna: technomancy: do I need a different version of lein or just a different jar in the .lein/self-installs/ directory
14:42 oh oops I copied the link instead
14:43 chewbranca: ibdknox: one recommendation I have is to maybe add some documentation about how to go from a development noir app to actually running in a production environment. Right now I'm just using git and manually grabbing the latest and then I've got a little shell script that sets some server environment variables
14:43 hagna: technomancy: the link to download one file points to master http://
14:44 chewbranca: which works decently well, but I'm not sure how to do things like no downtime deploys and what not, although that could be more related to my inexperience with the java ecosystem
14:44 technomancy: hagna: you'll do much better if you follow the official documentation rather than some dude's blog from 2 years ago =)
14:44 ibdknox: chewbranca: that's not really a noir-level problem
14:45 chewbranca: most of the time you should run a server in front of your actual app (nginx probably)
14:45 chewbranca: or you could deploy to heroku :)
14:47 hagna: technomancy: oh ok where is that on github?
14:47 technomancy: clojurebot: leiningen?
14:47 clojurebot: leiningen is always the easiest way
14:47 technomancy: ...
14:47 chewbranca: ibdknox: I agree that its not entirely a noir level problem, and I am running behind nginx, but nginx doesn't assist you in doing live deploys, you would want to use something like ha proxy for that
14:47 technomancy: hagna: yeah
14:47 TimMc: hagna: Google it!
14:47 chewbranca: ibdknox: but things like dev/production mode in noir I didn't see until I was poking around in the noir src
14:47 ibdknox: chewbranca: well, if you have nginx setup as a reverse proxy, you can do hot deploys
14:48 chewbranca: just bring up to instaces on different ports, swap the config and restart nginx
14:48 two*
14:49 chewbranca: yeah that works ok, I just thought haproxy handles reloading configs better when dealing with live connections
14:49 ibdknox: yeah, it will :)
14:50 chewbranca: ibdknox: anyways, I'm enjoying noir a lot and its working well, just giving my thoughts as someone new to clojure who started using noir as their first clojure web stack
14:50 ibdknox: chewbranca: you're right though, a tutorial or some documentation on that would be a good addition. There are a few such things I need to write at some point
14:51 chewbranca: I'm glad it's work out :) Thanks for the feedback!
14:52 chewbranca: ibdknox: no problem, thanks for the great projects!
14:52 ibdknox: man my typing is terrible today
14:52 pandeiro: ibdknox: it's the vim you've been vimming man
14:53 ibdknox: lol
14:53 I think it's the half-asleep bit more than anything heh
14:53 pandeiro: have you been doing a lot of client-side stuff too lately?
14:54 ibdknox: pandeiro: have you been talking to someone from the bay area clojure group? lol
14:54 I showed a bunch of stuff last night
14:54 pandeiro: ibdknox: wish i was... i would like to see!
14:55 ibdknox: well enough people hounded me last night that I'll try and put some stuff up this weekend
14:56 pandeiro: ibdknox: i won't hound you... in person
14:56 ibdknox: haha
14:56 pandeiro: can i ask you one question with a bug i'm having?
14:56 cljs.reader stuff
14:57 ibdknox: pandeiro: here's the example code I showed: https://
14:57 sure
14:57 pandeiro: the cljs reader should be able to process maps with keys that begin with a colon and a number?
15:00 technomancy: ibdknox: doing a little sneak peaking?
15:00 *peeking
15:01 pandeiro: for serialization purposes i am playing with cljs.reader/read-string and it can't handle such keys... when i try to debug, i come to a function in the same ns called number-literal? that i cannot get to return true...
15:01 anyway i could just file a bug on jira but i was trying to solve the mystery
15:01 ibdknox: technomancy: not of the thing I showed you :)
15:02 pandeiro: I'm not sure
15:02 sounds like a bug
15:03 dnolen: pandeiro: definitely a bug please open a ticket.
15:03 technomancy: ibdknox: aha. how many did you guys have there?
15:03 ibdknox: technomancy: 25ish?
15:03 technomancy: nice
15:03 pandeiro: dnolen: will do, sorry i couldn't patch it myself
15:04 dnolen: pandeiro: reader isn't actually that tricky :) feel to try to patch it at anytime ;)
15:04 feel free
15:07 ibdknox: technomancy: that refheap has some new stuff in it actually. I've been working on some state management stuff and there's a little bit of my lazy-store in there too. Basically a map that you can request keys for that get fetched lazily and cached :)
15:08 pandeiro: dnolen: sadly i already did :) ... i can't get cljs.reader/number-literal? to ever return true, and there the trail goes cold for me
15:09 technomancy: you mean ... a memoized function? =)
15:09 ibdknox: technomancy: no, sorry, fetched over the network :)
15:09 technomancy: gotcha
15:09 ibdknox: from the server to the client
15:09 dnolen: pandeiro: gotcha, please do put what you've discovered in the ticket
15:17 pandeiro: dnolen: http://
15:18 dnolen: pandeiro: thx
15:26 pjstadig: hugod: ping
16:00 daaku: is there some easy way to have code auto reload on file save in a running repl? (one started using `lein repl`)
16:00 brehaut: (use :reload 'my.namespace)
16:00 or (use :reload-all 'my.namespace)
16:00 you could probably steal some of the autoreload stuff from ring
16:01 and those should be requires probably
16:01 daaku: brehaut: i use :reload atm, was wondering if i could somehow trigger that on file save -- the ring stuff for sure -- will look into it
16:01 duck1123: I have a feeling it would be kind of annoying if your namespace was automatically reloaded on every save
16:02 brehaut: daaku: https://
16:02 daaku: looks like it depends on an ns-tracker library
16:03 daaku: https://
16:04 daaku: brehaut: nice, thanks -- that doesn't look terribly difficult to build into my stuff
16:04 trigger it via :repl-init
16:04 thanks
16:16 cemerick: LazySeq.withMeta forces the first value in the seq. Anyone know the rationale for that?
16:19 technomancy: does the fact that (seq ()) is nil imply that there's no such thing as an empty seq, only an empty list?
16:20 dnolen: ,(lazy-seq)
16:20 clojurebot: ()
16:20 cemerick: There are definitely empty seqs.
16:21 technomancy: what's the rationale behind getting nil there then?
16:21 cemerick: I just can't think of why anything meta-related should impact realization.
16:21 tomoj: 'seq' is conflated?
16:21 technomancy: seems like a bizarre special case just to avoid using clojure.core/empty?
16:22 cemerick: (seq ()) => nil is just part of the contract.
16:22 s/the/seq's
16:22 but, (not= (seq ()) (lazy-seq ()))
16:22 technomancy: doesn't make it any less bizarre
16:40 cemerick: technomancy: I just realized that your first msg re: seqs had nothing to do with my msg re: meta on lazy seqs. :-P
16:42 technomancy: not necessarily
17:17 simonj: Confused as to why the seq returned by this func isn't lazy. https://
17:23 Raynes: simonj: What is the type of nodes? (type nodes)
17:24 tmciver: simonj: my guess is that the call to getLength on nodelist walks the seq
17:24 hiredman: simonj: there is optimization on lazy-seqs called chunking that happens
17:24 range creates a chunked seq, iterate does not
17:25 Raynes: That's what I figured.
17:25 simonj: Your seq is still lazy, but instead of being evaluated one at a time as needed, it is evaluated in chucks of 32 elements.
17:25 hiredman: certain operations like for and map respect chunking
17:39 muhoo: does korma deal with composite primary keys?
17:40 i.e. PRIMARY KEY (foo_id, bar_id, baz_id) , where all 3 are foreign keys referencing another table?
17:44 emezeske: technomancy: I'm having trouble finding the docs on what each :dependencies sub-vector can look like
17:44 muhoo: hagna: "droid linux"?
17:44 what's that?
17:44 emezeske: technomancy: I'm probably just bad at google-fu :(
17:44 technomancy: can you point me in the right direction?
17:45 technomancy: emezeske: I think it's all in "lein help sample"?
17:45 lemme see
17:45 yeah, just :exclusions, :type, and :classifier
17:46 emezeske: technomancy: gah, why didn't I look there!?
17:46 technomancy: thanks
17:46 technomancy: is it safe to assume that the first entry of the vector is always the symbol describing the jar?
17:46 technomancy: yep
17:46 emezeske: cool, thanks!
17:47 technomancy: sure
17:47 muhoo: hiredman: Raynes: also, i remember reading that "do" is an implicit non-lazy, or something like that.
17:48 Raynes: That'd surprise me.
17:49 amalloy: it's not clear what that means, but whatever it is it's nonsense
17:52 brehaut: muhoo: are you perhaps confusing dorun, doall, and doseq with plain do?
17:53 muhoo: brehaut: probably, yes. thanks.
17:53 brehaut: muhoo: do just lets you do a bunch of expressions imperatively; like { } in a c-family language
17:54 (and the return value of a do is the result of the last expression)
17:54 muhoo: ah, ok. thanks.
18:07 daaku: for anyone interested in the repl auto reloading stuff, i made it into a module (uses java 1.7 file watching stuff) -- https://
18:09 aaelony: I've been using R for years with various tools, but the RStudio guys really did a great job providing an ideal IDE experience (Demo video at http://
18:26 ibdknox: muhoo: it doesn't deal with composite keys implicitly, but you can always do your joins and specify the keys to join on
18:33 amalloy: does anyone know what the deal is with org.clojure.contrib/mock? it's got a name that sounds like...half compatible with 1.3, and half old-contrib; i can't figure out where its source is to have a look at it, and the only projects that depend on it seem to be hiccup and clojureql
18:36 Scriptor: on windows 7, where should should I install the emacs starter kit?
18:36 I tried putting it in documents and settings but it didn't seem to work
18:36 konr: No REPL was launched with clojure-jack-in, which I got from el-get. Must I launch it through a command or something?
18:38 technomancy: konr: I've seen that in a few cases, but I'm not sure what causes it. I recommend installing via marmalade in any case.
18:38 konr: technomancy: ok! Thanks!
18:45 TimMc: technomancy: Here's how I *tried* to do work in a temporary namespace: <https://
18:45 I was looking, but failed to spot the trick.
18:45 technomancy: don't you just have to bind *ns* first?
18:46 TimMc: Huh!
18:46 I'll take a look at that.
18:46 technomancy: The interesting thing is that it works fine in a 'do form, just not in a 'let.
18:47 Wow, is it really just as simple as binding *ns*?
18:48 technomancy: set! only works on bound vars
18:49 TimMc: I wasn't using set! at all.
18:49 technomancy: ,(source in-ns)
18:50 clojurebot: Source not found
18:50 technomancy: ~botsmack
18:50 clojurebot: clojurebot evades successfully!
18:50 TimMc: I'll take a look.
18:51 Ah, it's a special.
18:53 technomancy: It's interesting that you use 'remove-ns inside the binding. Looks dangerous!
18:54 technomancy: slamhound is hell of dangerous
18:54 that's why it's named after an explosive device
18:55 TimMc: heh
19:00 technomancy: It's not good enough -- I'm seeing defs from the "outer" namespace from inside.
19:01 I wonder if macro expansion is the problem -- if things are getting namespace-resolved...
19:03 ibdknox: TimMc: what are you doing this for?
19:04 TimMc: ibdknox: I'm working with tmciver to bring clojure.contrib.import-static into 2012. I'd like the tests to not pollute each other's namespaces.
19:05 ibdknox: ah cool
19:06 TimMc: but for now I think we might just import stuff and test the test namespace
19:25 Sample syntax: (import+ [java.awt Color [geom :rename {Point2D$Double P2D}]])
19:28 I'd like to unify that with static imports, and I'm kind of stuck on the syntax.
19:31 aperiodic: static imports? is that another import+ feature?
19:31 TimMc: hopefully!
19:32 I'd like to be able to say, "I want sin, cos, and PI from java.lang.Math, but PI should be pi"
19:34 arohner: TimMc: how would that work? Wouldn't you need to create a clojure fn to wrap the java method?
19:35 aperiodic: do you have a static import syntax already?
19:39 TimMc: aperiodic: Insofar as import-static does. It's not very extensible, and that API will probably be thrown out for 2.0
19:39 arohner: Yep, needs to be wrapped in a hinted fn. I think it will be HotSpot-inlinable!
19:39 arohner: c.c.import-static currently makes macros, which you can't pass around. Terrible.
19:40 I was thinking that (import+ (java.lang (Math :statics {PI pi}))) would be reasonable, until I remembered that you can't distinguish packages from classes of the same name.
19:41 emr, pretend those inner lists were vectors, for clarity ;-)
19:42 I really don't want to give up the sub-package syntax.
19:42 aperiodic: yeah, that's pretty nice
19:43 TimMc: This should be able to simplify the handling of both fuckoff-long package names and classnames.
19:44 aperiodic: you mean i won't have to have thirty lines of hadoop class imports?
19:44 TimMc: Hopefully.
19:45 You can only reduce the problem so much, though.
19:47 aperiodic: you say that the above syntax doesn't distinguish packages from classes: is the capitalization distinction for packages and classes just a convention?
19:47 TimMc: yeah
19:47 * aperiodic knows little about java
19:47 TimMc: And I just tried building com.java and com/foo.java in the same space -- it totally worked.
19:48 Packages, classes, methods, and fields all have completely separate "namespaces".
19:51 benares_98: Would this quicksort require O(n) extra memory allocation? https://
19:51 aperiodic: that all map down to source code representations non-injectively
19:51 brilliant
19:51 is there any way to detect conflict/misuse?
19:51 TimMc: aperiodic: There *are* no conflicts, just abuses.
19:52 benares_98: It will consume O(n) stack
19:53 Memory allocation... I'm not even going to try to figure that out.
19:54 gfredericks: (malloc 10)
19:54 TimMc: haha
19:54 benares_98: TimMc: that's what I meant thanks
19:54 * gfredericks starts imagining how one might implement a goto
19:59 arohner: gfredericks: goto is easy when you have access to the instruction pointer :-)
19:59 lynaghk: aperiodic, is that you Dan?
20:01 TimMc: gfredericks: I bet you love first-order continuations.
20:02 aperiodic: lynaghk: hey kevin!
20:02 lynaghk: how's it going?
20:02 small internets.
20:03 aperiodic: no kiddin'
20:03 lynaghk: Are you finally getting on the Clojure boat then?
20:03 arohner: where did wall-hack-method go?
20:03 aperiodic: I've been on the Clojure boat since about June
20:03 TimMc: arohner: From contrib?
20:03 aperiodic: finally starting to get the hang of it now
20:03 i think
20:04 lynaghk: Have you bitten the bullet and moved over to emacs then?
20:04 arohner: TimMc: didn't it get renamed, and possibly moved into cor?
20:04 hiredman: arohner: it got renamed to something boring
20:04 arohner: hiredman: yeah, I remember that, and now I can't find it
20:04 aperiodic: lynaghk: nope! vim forever
20:05 TimMc: aperiodic: I hear vim is pretty good for Clojure, actually.
20:05 aperiodic: TimMc: I've been meaning to trick it out more. Right now I only have syntax highlighting + tslime.
20:06 TimMc: aperiodic: And paredit, surely?
20:06 lynaghk: is there a paredit for vim?
20:06 TimMc: yep!
20:06 aperiodic: TimMc: I'll probably just copy Raynes's setup
20:06 lynaghk: Yes, Dan, you need the paredit!
20:06 aperiodic: TimMc: nope
20:06 lynaghk: talk to homer right now
20:06 aperiodic: i've been using %
20:06 TimMc: You *have* to have it.
20:07 gfredericks: augh; I wanted to find out how big this data structure was without vomiting it up on the screen so I said (count (prn data))
20:07 TimMc: It's not as fully-featured as Emacs' version, but I wouldn't be able to code in lisps without it.
20:07 gfredericks: that was not the way to do it.
20:07 TimMc: haha
20:07 hiredman: (ha ha)
20:08 TimMc: I probably wouldn't even consider moving to vim until paredit.vim supported paredit-convolute-sexp
20:08 (def ha #(% %))
20:08 gfredericks: TimMc: I was just thinking that
20:09 hiredman: earlier today a co-worker and I were doing things with seqs of numbers, and we wanted to save some for local analysis, so (spit some-file some-numbers)
20:09 arohner: ok, so wallhack got moved to c.c.reflect
20:09 which also didn't get promoted
20:09 hiredman: and guess what was in the file we scp'ed down the localhost?
20:09 ,(.toString (map inc (range 10)))
20:09 clojurebot: "clojure.lang.LazySeq@c5d38b66"
20:10 gfredericks: hiredman: wonderful
20:11 hiredman: arohner: there is a clojure.reflect now, but I think it only describes classes, no accessing fields or invoking methods
20:13 amalloy: arohner: https://
20:15 arohner: amalloy: no worries, I still have https://
20:15 * hiredman just copies and pastes wall-hack-field and wall-hack-method around
20:19 hiredman: https://
20:35 daaku: i'm specifying a module for :repl-init which does things upon being required -- but seems like marginalia includes this module and ends up stuck because my :repl-init logic spawns a thread. not sure what the right fix is here (only start the thread for :repl-init somehow, or detect marginalia?). anyone got any pointers?
20:36 TimMc: Why would marginalia do that?
20:37 daaku: TimMc: to get the vars defined in the ns i assumed?
20:37 maybe it's lein doing it.. since i'm running "lein marg" (but then why is lein running :repl-init for "lein marg")
20:38 TimMc: Maybe the answer lies in the marg plugin. grep for the string "repl".
20:38 brehaut: daaku: i think marginalia uses its own reader to dig about your code, rather than loading the NSes?
20:38 (it might do both though)
20:40 daaku: git grep repl in lein-marginalia yields nothing
20:40 oh, here's a definitive test -- this happens even without :repl-init defined
20:41 so it's marginalia that must be including the ns
20:41 or lein-marginalia
20:45 tmciver: I find that I finally have to learn how to write macros. I have what I think is probably a dumb question: why do I have to quote the if here: ##(list 'if true :true)
20:45 lazybot: ⇒ (if true :true)
20:45 tmciver: ,(list if true :true)
20:45 clojurebot: #<CompilerException java.lang.RuntimeException: Unable to resolve symbol: if in this context, compiling:(NO_SOURCE_PATH:0)>
20:47 gfredericks: tmciver: if you didn't quote it that would mean you were trying to take its value
20:47 Null-A: ,(eval '(if true :true))
20:47 clojurebot: #<Exception java.lang.Exception: SANBOX DENIED>
20:47 TimMc: tmciver: Because you want the symbol, not its value.
20:47 dammit, gfredericks-sniped
20:47 * gfredericks plays theme-song
20:47 Null-A: ,(defn fact [n] 3)
20:47 clojurebot: #<Exception java.lang.Exception: SANBOX DENIED>
20:47 TimMc: tmciver: Leaving aside 'if not resolving to a value at all, itself being a macor or special form.
20:48 Null-A: The SANBOX forbids!
20:48 gfredericks: ,(let [if 12] (list if true :true))
20:48 clojurebot: (12 true :true)
20:48 Null-A: ,((fn foo [n] (* (foo (dec n)) (foo (- n 2)))) 3)
20:48 tmciver: ooh, nice.
20:48 clojurebot: #<RuntimeException java.lang.RuntimeException: java.lang.StackOverflowError>
20:48 gfredericks: ^ I'm sure that clears everything up
20:49 Null-A: ,((fn foo [n] (if (= n 1) 1 (* (foo (dec n)) (foo (- n 2))))) 3)
20:49 clojurebot: #<RuntimeException java.lang.RuntimeException: java.lang.StackOverflowError>
20:49 tmciver: ,(list (symbol if) true :true)
20:49 clojurebot: #<CompilerException java.lang.RuntimeException: Unable to resolve symbol: if in this context, compiling:(NO_SOURCE_PATH:0)>
20:49 Null-A: ,((fn foo [n] (if (<= n 1) 1 (* (foo (dec n)) (foo (- n 2)))))
20:49 clojurebot: #<ExecutionException java.util.concurrent.ExecutionException: java.lang.RuntimeException: EOF while reading>
20:49 tmciver: ,(list (symbol "if") true :true)
20:49 clojurebot: (if true :true)
20:49 tmciver: Got it! Thanks.
20:49 Null-A: ,((fn foo [n] (if (< n 2) 1 (* (foo (dec n)) (foo (- n 2)))))
20:49 clojurebot: #<ExecutionException java.util.concurrent.ExecutionException: java.lang.RuntimeException: EOF while reading>
20:50 Null-A: ,((fn foo [n] (if (< n 2) 1 (* (foo (dec n)) (foo (- n 2))))) 3)
20:50 clojurebot: 1
20:50 Null-A: ,((fn foo [n] (if (< n 2) 1 (* (foo (dec n)) (foo (- n 2))))) 30)
20:50 clojurebot: 1
20:51 gfredericks: Null-A: dost thou have thine own repl?
20:51 Null-A: no, I develop all my programs here
20:51 gfredericks: ah, carry on then
20:51 TimMc: Null-A: clojurebot and lazybot support /msg
20:53 brehaut: are we writing fibonaccis with the bots again?
20:55 * gfredericks imagines a disadvantaged child whose parents could not afford a repl and so he was forced to develop his programs on IRC
20:55 Null-A: It would be like bill gates back in mainframe days
20:56 He could only afford an ethernet cable and a 5 volt battery
20:57 gfredericks: one-repl-per-child
20:57 TimMc: and apparently only one window per IRC server?
20:58 tmciver: Did you see my email?
21:02 Ugh, I do *not* want an O(n^2) algorithm over a list of 1e4 items.
21:02 gfredericks: TimMc: so use a O(log n) algorithm duh
21:02 TimMc: Oh!
21:02 Thanks, you're a life-saver!
21:03 * gfredericks plays his theme song
21:03 TimMc: (I find it amusing that a layperson would not realize that was all a joke.)
21:03 gfredericks: haha laypeople are dumb
21:04 TimMc: >_<
21:04 gfredericks: TimMc: but I am curious what your algorithm is
21:06 TimMc: I have a list of image-to-tag records, {:imageID int, :catID int, :tagID int} (where category and tag are a composite key for tags), and a map of {:catID {:tagID set(tagIDs)}} indicating parent relationships.
21:07 I want to end up with a list of image-to-tag records like the first, but with an additional :implicit boolean key indicating whether it was in the original list or added via that map.
21:08 (Actually, those tagIDs are not parents, but *all* ancestors -- I've already computed the transitive closure.)
21:08 I suppose the first step is to group everything by category and merge again at the end.
21:08 gfredericks: a hash-set doesn't help here?
21:09 i.e., to check whether things exist yet...
21:09 TimMc: I'm sure it does, but I haven't figured out the algorithm yet.
21:09 gfredericks: if I understood what the parent-child relationship meant I might be able to imagine it
21:09 you have hierarchical tags?
21:09 TimMc: yeah
21:09 tag DAG
21:09 gfredericks: okay, I guess that makes sense
21:09 * gfredericks mulls
21:10 gfredericks: wait
21:10 in your second map
21:10 the values are always singleton maps with just the :tagID key?
21:10 TimMc: No, I forgot the ellipses in both levels.
21:11 gfredericks: wait what's a category? just a non-leaf tag?
21:11 it's not a tree? it's a proper DAG?
21:11 TimMc: The tag space is partitioned into completely independent categories.
21:12 each of which contains a probably-disconnected DAG of tags.
21:12 gfredericks: okay, I give up. I need to finish my own algorithm. This doesn't sound very O(n^2)ey though
21:12 TimMc: Probably ends up being O(n log n).
21:13 http://
21:14 amalloy: gfredericks: a lot classier: "Hast thou thine own repl?" i'm not sure the other one is good grammar, but maybe it is
21:15 TimMc: dost has!
21:15 gfredericks: amalloy: it's so frustrating not having a reliable intuition about these things
21:15 TimMc: <insert lolcat in Shakespearean garb here>
21:15 gfredericks: #0thworldproblems
21:19 amalloy: gfredericks: "thou" is the second-person informal, whereas "you" is second-person formal. english decided to junk the informal quite a while ago, but if you're talking olde tyme, you want to make sure your verbs conjugate to match the subjects (hast thou, have you)
21:19 gfredericks: amalloy: this sounds fuzzily familiar
21:22 amalloy: i guess that doesn't really address the actual issue of putting in a "dost"
21:22 but it's a fun little history lesson all the same
21:24 gfredericks: quite
21:26 why is that buffer named "*slime-repl nil*"?
21:42 emacs tabs semicolon comments to the weirdest places...
21:43 jodaro: what, like the back of a volkswagen?
21:43 TimMc: gfredericks: double-semicolon is probably what you want
21:44 gfredericks: TimMc: I bet I do; so what does single-semicolon function as?
21:44 jodaro: (i guess that works better with "uncomfortable places")
21:44 hiredman: gfredericks: that is to warn you are making a mistake
21:44 gfredericks: oh; single semicolons are accidents?
21:44 TimMc: Right-column comments, like you see in assembly code.
21:44 hiredman: gfredericks: for comments on their own like use double semi colons
21:44 single semicolons are for comments after a form
21:45 gfredericks: aah, I see
21:45 thanks
21:46 * gfredericks likes emacs
21:46 TimMc: Ignore hiredman, follow http://
21:46 Oh, I misinterpreted "after a form".
21:48 oakwise: jodaro: I chortled
21:48 gfredericks: Rationale: The parentheses grow lonely if their closing brackets are
21:48 all kept separated and segregated.
21:48 jodaro: I also appreciated the comment but didn't think of any good way to acknowledge it
21:48 TimMc: This is why God invented "LOL", which stands for "Laughing On-Line".
21:49 (not really, it is just punctuation these days)
21:49 gfredericks: really?LOL!
21:49 huh that kind of looks legible
21:51 jodaro: thanks guys
21:52 TimMc: gfredericks: MY DEAREST MARIA LOL STORE BURNED DOWN LOL COMING HOME WITHIN WEEK FULL LOL
21:53 gfredericks: :D
21:53 TimMc: (I didn't invent that interpretation, but could not find the original.)
21:55 gfredericks: I suppose he means to eat a large meal before he comes home?
21:55 TimMc: Are you familiar with "full stop" from telegrams?
21:56 gfredericks: oh that makes sense of it
21:56 I was sure that "week full" meant something
21:56 TimMc: The original made it clearer.
22:03 benares_98: Lots of Love
22:03 TimMc: Haha, yeah.
22:03 benares_98: "I heard your father died, LOL"
22:19 TimMc: Yesss... expansion takes 75,565 tag-to-image relationships to 148,872.
22:31 echo-area: Is there the online video of Mark Volkmann's Clojure STM talk on StrangeLoop 2009?
22:50 tutysra: hi there
22:51 trying to install clojure-mode for emacs and following the instructions in its site - https://
22:51 struck at - step 2 (Setting up package.el)
22:52 i didn't had a init.el in my emacs.d dir, so i created a new file and added the contents given to that file
22:52 (require 'package)
22:52 (add-to-list 'package-archives
22:52 '("marmalade" . "http://
22:52 (package-initialize)
22:53 tmciver: tutysra: you can add that stuff to your .emacs too.
22:53 tutysra: then called init.el from my .emacs file as (when (load (expand-file-name "~/.emacs.d/init.el")) (package-initialize))
22:54 i thought init.el was a better place since we have a separate place to put all our initialization stuff (that is what the site recommends anyway)
22:55 i get this error when i start emacs - Symbol's value as variable is void: package-archives
22:55 tmciver: tutysra: go with that then. I have similar code to what you posted in my .emacs; I didn't have an init.el either.
22:56 I'm sure it works either way.
22:56 tutysra: ok
22:57 add-to-list 'package-archives - this is the line which gives an error message when put in init.el, have any idea how to fix it?
22:59 tmciver: tutysra: what error? Is it complaining about 'package-archives?
22:59 tutysra: yes you are right - Symbol's value as variable is void: package-archives
23:00 tmciver: My setup may be a little out-dated but I think you have to call 'package-initialize' (once you've loaded the package.el file).
23:01 tutysra: here is the relevant section of my .emacs: https://
23:01 tutysra: tmciver: yes, I am doing the package-initialize in .emacs where I have the setup to load package.el
23:03 tmciver: tutysra: are you using package.el from here: http://
23:03 tutysra: and are you using emacs 23?
23:03 tutysra: tmciver: yes 23.3.1 build
23:04 tmciver: tutysra: I'm no expert on this stuff, but I know there was a version of package.el that you had to get - not the one that comes with emacs.
23:05 the declaration of package-archives is only in the package.el at the link above; you need that one.
23:05 tutysra: tmciver: I got that from elpa site - http://
23:06 tmciver: tutysra: Yeah, I think that might be the wrong one.
23:07 tutysra: there's a link to the right package.el that you can get to from the link you listed above: https://
23:07 tutysra: tmciver : I tried moving that to my .emacs file, still the same error, so as you guessed something with package.el versions
23:12 tmciver : got the package.el from the link you had given, works without issues for the configs in .emacs, i will also try init.el
23:13 TimMc: tmciver: Signing off for the night.
23:14 tutysra: tmciver :thx, it works from init.el as well