#clojure logs

2010-07-17

00:03tautologicois there any nice, built-in 2d matrix data structure available in clojure? or should I roll my own?
00:06woobytautologico: you may consider incanter.Matrix
00:06tautologicowooby: will search for it, thanks
00:06woobytautologico: http://wiki.github.com/liebke/incanter/matrices
00:07zkimtautologico: Might help: http://measuringmeasures.com/blog/2010/3/28/matrix-benchmarks-fast-linear-algebra-on-the-jvm.html
00:10tautologicoboth links will be useful, thanks
00:45slyrusanyone around care to give my toy undirected graph implementation a quick review?
00:45slyrushttp://gist.github.com/479247
00:45clojurebothttp://github.com/hiredman/clojure-dependency-grapher
03:05slyruswell, perhaps in the morning then...
05:24vu3rdd,quit
05:24clojurebotjava.lang.Exception: Unable to resolve symbol: quit in this context
05:24vu3rddoops.. slime-isms..:-(
05:41vasily_pupkinhi
05:42vasily_pupkinhow can i get value linked to symbol via it's name?
05:42vasily_pupkinjust now i do: (eval (symbol "a"))
07:48idrophi, is there any function that will return a map with keys as keywords when given a map without? i.e ..... {foo 1 bar 2} ----> {:foo 1 :bar 2}
07:52mikemidrop: this would work
07:52mikem,(reduce #(apply assoc %1 %2) {} (map #(vector (keyword (str (first %))) (second %)) {\a 1 \b 2}))
07:52clojurebot{:b 2, :a 1}
07:52mikemdon't know if there's a function for that
07:54idropmikem: thanks for that! just have to digest it now..
08:04raekidrop: this could be useful too: http://github.com/richhickey/clojure/blob/c1c39162608551d50cfb18998d015974b11cfecc/src/clj/clojure/walk.clj#L95
08:05raekif you have a multi-leveled structure
08:06raek(more here http://richhickey.github.com/clojure/clojure.walk-api.html)
08:10raek(defn keywordize [m] (into (empty m) (for [[key val] m] [(keyword key) val])))
08:10raekmy solution for one level
08:13raek,(let [keywordize (fn [m] (into (empty m) (for [[key val] m] [(keyword key) val])))] {'some-symbol 1, "some-string" 2, 'symbol.with/namespace 3})
08:13clojurebot{some-symbol 1, "some-string" 2, symbol.with/namespace 3}
08:13raek,(let [keywordize (fn [m] (into (empty m) (for [[key val] m] [(keyword key) val])))] (keywordize {'some-symbol 1, "some-string" 2, 'symbol.with/namespace 3}))
08:13clojurebot{:some-symbol 1, :some-string 2, :symbol.with/namespace 3}
08:13raek*ahem*
08:14mikemwhy does a vector not implement ISeq? iow, why does (seq? [1 2 3]) return false?
08:15raekyou can think of a sequence as some kind of iterator
08:15raekthat provides a sequential view of something
08:15raekin java, an ArrayList is not an iterator, but can provide one
08:16raekit's kind of the same in clojure: a vector is not a sequence, but it can make one (with seq)
08:16raeka seq is just something you can do first and rest on
08:17raek(those functions also call (seq) on their arguments)
08:17mikemok, so the reason vector doesn't implement ISeq is for ... performance reasons? or vectors are just used for different purposes...?
08:17raeka vector seq is implemented as something like a reference to the vector and a counter for the current index
08:18raekit would be possible to make the vector implement ISeq, but what should rest on it return?
08:18mikemok, it's due to the underpinning implementation then
08:19raekseqs and collections are not the same thing
08:19raekI think this is a intentional design decision
08:19mikemok, this is something i'll need to deeper understand as time goes on i guess :)
08:20raekseqs are just first rest
08:20raekand *behaves* as cons cells
08:20raek/linked lists
08:22raekthis might be helpful to understand the rationale: http://clojure.blip.tv/file/734409/
08:22raekbut beware that the behaviour of rest has changed slightly since then
08:23raekrest does not have to return nil if the rest of the seq is empty anymore
08:23raekbut what it returns should become nil when passed though (seq(
08:23raeknext behaves as the rest
08:23mikemwoah, it's 75 minutes of rhickey talking about sequences! awesome
08:24mikemoh yeah, i'm familiar of the distinction between next and rest
08:28mikemraek: thanks :) the video is on my to-do list
09:11raekwow: http://www.st.cs.uni-sb.de/edu/seminare/2005/advanced-fp/docs/sweeny.pdf
09:11raekI had no idea that the ideas of clojure could be such a great fit for game programming
09:12raekespecially take a look at slide 51 and forward
09:16raekanother thing:
09:16raekis there a simple way of delaying the effects of certain functions until a transaction succeds?
09:17raeklike how sends to agents are held?
09:17carkhsends to agents are also delayed within transactions
09:18carkhand only sent upon success
09:18raekyes
09:18raekis there any known way of having this behaviour for other functions?
09:19lpetithello, I'm having trouble with a macro. Maybe I'm not totally awaken, maybe it's subtle ...
09:19rhudsonCan't you just execute the function in an agent?
09:19raekwell, I guess so
09:19lpetit(defmacro f ([a] a) ([] (f 1))
09:19raekbut I might not need the serializing effect agents have
09:19carkh,(send (agent) println "coucou")
09:19clojurebotjava.lang.IllegalArgumentException: Wrong number of args (0) passed to: core$agent
09:20raeki.e. all operations are queued up
09:20carkh,(send (agent nil) println "coucou")
09:20clojurebot#<Agent@667ed7: nil>
09:20lpetitthis does not work. (if I call (f) it complains with java.lang.IllegalArgumentException: Wrong number of args (1) passed to: user$f (NO_SOURCE_FILE:0)
09:21carkhlpetit: you're calling f with one parameter from your second definition
09:21carkhwhen it has either 0 or 2
09:21lpetitcarkh: ?
09:22raek(f) => 1, (f 2) => 2 for me with your definitoin
09:22carkhah sorry wasn't awake either =P
09:23carkhanyways you're using f as a function in your second definition
09:23lpetitcarkh, raek: got it. By the time the macro is compiled, I should not emit a direct call to f, or I'll get strange results since f is not totally compiled yet (so cannot correctly macroexpand)
09:23raekhrm, aha
09:23lpetitcarkh: I'm using f as a callable, as can be done with macros, but you're right,
09:23carkh(defmacro f ([a] a) ([] `(f 1)))
09:23lpetitcarkh: yes
09:24raekthat looks more right
09:24rhudsoncarkh: you could use multiple agents if you're concerned about serialization
09:24lpetitcarkh: since it's the return value of the macro, it does the job. Thanks guys for the brainstorming
09:24carkhraek: carkh: you could use multiple agents if you're concerned about serialization
09:25carkh=)
09:25carkhi feel like an agent now
09:26rhudsond'oh!
10:15bmhWhat is the random number generator of choice in Clojure? Should I rely on probabilities.random-numbers or call out to something in java? I'm not doing Monte Carlo simulations so the quality of the RNG isn't very important right now
10:37raekrand-int is useful
10:37raek,(doc rand-int)
10:37clojurebot"([n]); Returns a random integer between 0 (inclusive) and n (exclusive)."
10:40bmhThat does seem useful.
11:00defnhello everyone
11:01defn$seen zkim
11:01sexpbotzkim was last seen quitting 293 minutes ago.
11:01defn$(/ 293 60.0)
11:01sexpbotThis command is old. Use -> now. It's a hook, so it can evaluate anything, even stuff that doesn't start with parentheses.
11:01defn->(/ 293 60.0)
11:01sexpbot=> 4.883333333333334
12:07Lajladefn, does Clojure support tail calls?
12:10raekclojure does not, since function calls build on top of jvm method invokations
12:10Lajlaraek, HAH
12:10LajlaYou fell for me trap.
12:10LajlaI did not say taill cal optimization, now did I.
12:10LajlaAlso, invokation?
12:10raekLajla: ah, now I get it
12:10raeksure, you can do tail calls :)
12:11LajlaI can feel my sanity sleeping away between the holes of my teeth, I try to to keep my mouth shut and keep it in, but it is not working
12:11Lajlaslipping
12:12raekinvoKe, invoCation
12:12raekEnglish, tsk tsk tsk
12:12raek"Also, invokation?" <-- was that regarding the spelling?
12:14Lajlaraek, I was just asking if it was the proper one.
12:14LajlaNo hard feelings
12:14Lajlaraek, but french me, french me passionately to keep my sanity in.
12:17raekI don't take offence on behalf of the English spelling system
12:17raekso, it's cool
12:26Lajlaraek, MY SANITY
12:26LajlaI am losing it lke we lost the world cup.
12:26LajlaBloody hell, that octopus bought my sanity from that ref.
12:26LajlaThat was a clear offside in my sanity.
12:26LajlaNow the Spanish have it and they will use it to become the second best programmers in the world.
12:29raekLajla: write a programming book.
12:29Lajlaraek, hmm
12:29Lajlaand excellent suggestion
12:29LajlaI was busy expressing the formal semantics of that language in FOL anyay.
12:30Lajlaraek, shall I dedicate it to you?
12:31raekyour choise
14:01defnLajla: choice ;)
14:01Lajladefn, what?
14:02defnhe said choise -- it is choice, like your invokation vs invocation
14:17raekI always get that wrong... :)
14:18defnraek: what's new
14:18defnwhatcha workin on today
14:35LauJensenI know we've talked about some of the UI options for Java before, but please remind me. We have Swing/AWT (ewww), and then Qt which is a little nicer but not fully baked yet, then there are those funky Mac Components, anything else?
14:35LauJensen(thats nice ofc)
14:36qbgSWT?
14:37LauJensenIsnt that as vile as SWT ?
14:37RaynesI thought Qt was pretty much abandoned?
14:38RaynesJambi, that is.
14:39LauJensenRaynes: I dont think so, but as anything OpenSource it crawls
14:39LauJensenIt was neeearly good when they dropped official support
14:42bobo_javaFX?
14:43LauJensenbobo_: Not available through Clojure
14:43bobo_suspected that
14:44RaynesThere is that Pivot thing.
14:44LauJensenGot link?
14:45LauJensenI also wonder why the web isnt drowing in these SetLookAndFeel UIs for Java
14:47RaynesLauJensen: http://lmgtfy.com/?q=Java+pivot
14:48Rayneshttp://pivot.apache.org/
14:48bobo_that looks like web gui's to me?
14:49RaynesSomeone mentioned it here in the context of desktop GUIs a while back.
14:49RaynesI've never investigated.
14:49LauJensenSure does - And at least in Conkeror they suck the life out of the browser
14:50LauJensen"Apache Pivot is an open-source platform for building rich internet applications in Java. It combines the enhanced productivity and usability features of a modern RIA toolkit with the robustness of the Java platform. Pivot applications are written using a combination of Java and XML and can be run either as an applet or as a standalone, optionally offline, desktop application. "
14:51HodappBINGO!
14:51Hodapp...oh, wait, we weren't playing web 2.0 buzzword bingo.
15:02LauJensenHodapp: No we always save that for later, when the whole gang is here
15:07Ploujis forexmercenary written in clojure? : http://www.forexmachines.com/reviews/forex-mercenary/#comment-5592
15:08LauJensenRaynes: Thanks for pointing to Pivot, its very interesting
15:08RaynesYou're welcome. <3
15:08LauJensenPlouj: Certainly looks like it
15:15eshiraHi, I'm trying to setup clojure on os x. I git cloned clojure and clojure-contrib, built it, and symlinked the jars into ~./clojure/clojure.jar and ~./clojure/clojure-contrib.jar
15:16eshirafirst question, how do i run the repl w/ jline (i have this dependency)?
15:19eshirasecond, i'm trying to setup vimclojure. I follow the instructions (http://kotka.de/projects/clojure/vimclojure.html) to build PrettyPrinter. But i still get erros about it not finding it: java.io.FileNotFoundException: Could not locate clojure/contrib/pprint__init.class or clojure/contrib/pprint.clj on classpath.
15:20slyrushmm... what does this warning mean? Warning: protocol #'ugraph/Edge is overwriting method nodes of protocol Graph
15:21LauJensenosx..vim-clojure... I think Im staying away from this one :)
15:22RaynesThere is a vim-clojure ggroup that seems to be active enough: http://groups.google.com/group/vimclojure
15:35eshira*sign* i've gotten this whoel setup working once on another mac..
15:35eshirathere are just wayyyy too many ways (pacakage managers, manual installs) to do it
15:40technomancyeshira: with swank at least the main problem is everyone posts on their blog about how they think they've got it figured out, and nobody reads the official documentation
15:48slyrusanyone up for helping solve a defprotocol/defrecord problem? i don't understand why the last two forms in http://gist.github.com/479786 give different results
15:50raekis edged both a method name and a field name?
15:50raek*edges
15:51raekmaybe edges in (bar [g node] (edges g node))) resolvs to the field instead of the method
15:51slyruswhy, yes it is. ok, thanks!
15:51raeknp
15:53slyrusraek: is this a defprotocol bug or just my lack of grokking how this is supposed to work?
15:53raekyou can get the value of a field by just using it's name
15:54raekthey work a bit like locals
15:54slyruslocals?
15:54raeklocal "variables"
15:54raeklike a surrounding let
15:54rhudsonwithin the defrecord scope
15:55slyrusthanks rhudson
15:55raek(they're not exactly variables, since they cannot be mutated)
15:55slyrusthey're akin to CLOS accessors then? but outside of the defrecord scope I still have to do (:edges g)?
15:56raek(:edges g) is how you access the field from the outside of a record, yes
15:56raekfields are like instance variables in java classes
15:57raekI'm not familiar with CLOS vocabulary, but I would call :edges an accessor
15:57slyrusright, but inside the defrecord scope there's _another_ accessor (edges ...) that returns the value of the field, right?
15:58slyrusor the same accessor called by a different name
15:58raekno, you don't call it
15:58raekuse use the name as if it was a variable
15:58raek(bar [g node] edges)
15:58slyrus"(edges g)" isn't a function application?
15:58raekit is, but edges is not a functoin
15:59raekedges contains the value
15:59slyrusis used to a lisp-n
16:00raekin the scope of a record method, the name of the fields are bound to the field values
16:01raek(defrecord pair [one two] SomeProto (some-method [p x y] (+ (* x one) (* y two))))
16:02raeknonsensial example...
16:02raekthis could also be written with the accessors:
16:02raek(defrecord pair [one two] SomeProto (some-method [p x y] (+ (* x (:one p)) (* y (:two p)))))
16:04raek"The class will have the (immutable) fields named by fields, which can have type hints. [...] Note that method bodies are not closures, the local environment includes only the named fields, and those fields can be accessed directy."
16:05slyrusbut (defrecord pair [one two] SomeProto (some-method [p x y] (+ (* x one) (* y two))) (one one)) would allow me to say (one p) from outside of the defrecord scope, right? Otherwise I'd have to do (:one p), I think.
16:05slyrus(for suitable values of p, of course)
16:05qbgNo
16:05slyrusI mean (one [p] one)
16:05yasonDecided to try 1.2 beta on Ubuntu; none of the installation tutorials did the trick. Are things in clojure/slime/swank-clojure world in order or should I debug into it once again?
16:06qbgOh, yeah then
16:06raekslyrus: then "one" could mean one of two things
16:07raekwhich can be confusing for someone reading the code
16:07raekif you want to hide the fact that thefunctionality is implemented with records, give the fields other names
16:07slyrusnot for those of us coming from a lisp-n background where if you wanted the accessor one you would have to say #'one :)
16:07raeksince they will not be visible to the user
16:07slyrusright, I'm starting to come to the realization
16:08raekif the fact that they are records is a part of the API, then using :edges as accesor functions should be fine
16:09raek*should be sufficient for getting the work done
16:10raekI don't know if naming conventions for these things have came up, since records are still pretty new
16:11slyrusok, works as expected now. thanks for your help!
16:25slyruscan I have methods of the same name in different protocols?
16:26raekyes, but not in the same namespace
16:26raekthey are still used as functions
16:26slyrusso, no, in other words :)
16:26raekexactly... :)
16:27slyrusOk, defrecords being able to implement multiple interfaces makes it easy enough to factor the common stuff out into its own interface
16:27raekin java, classes both group together functions (as methods) and play the role of namespaces
16:27raekin clojure, these are separated
16:27slyrusclojure-mode could use some defrecord love
16:28raekif to things have the same name, they should probably do the same thing too
16:28raek(unless the term itself is ambigous)
16:29raekthe indentation?
16:29raekthat has ben bugging me too
16:29slyrusyeah two more spaces in for the methods (is that the right term?) so that they're to the right of the protocol names would be nice
16:30slyrusoh, and I'm still getting used to seeing CamelCase identifiers in my lispy code :)
16:30raekagreed.
16:31raekI think "methods" is an accepted term
16:31raekthe docs uses that word anyway
16:34slyruscan I specify protocol methods with variable arity?
16:35caiohow can I extend a namespace?
16:36slyruse.g.: (defprotocol Moose (foo [x]) (foo [x y]))
16:36yasonA follow-up question: What's the situation with swank-clojure? Usable with 1.2?
16:36slyrusi'm using it
16:37raekcaio: if you're at the the repl, just (in-ns 'the.name.space) and define stuff
16:37raekusing it too
16:37slyrusoh, nvm... i already discovered how to do that yesterday, and promptly forgot...
16:37raekthe docs in swank-clojure is the most up to date
16:38yasonslyrus: latest from git://github.com/jochu/swank-clojure.git?
16:38raektake technomany's instead
16:38slyrusyason: I use http://github.com/technomancy/swank-clojure.git
16:38raekhe's the maintainer now
16:38yasonoh, there are *two*?
16:38yasonok
16:38yasonno wonder mine had "NOTE: swank-clojure.el is currently unmaintained."
16:38raekjochu was the original maintainer, I think
16:39yasonyeah, makes sense
16:39raekyes, it's bad that jochu's the one that comes first on google
16:40yasonfor us who update their clojure a few times a year, this begs for an intelligent setup script. It's always the same trial-google-and-error hassle
16:40raek21:38 < technomancy> eshira: with swank at least the main problem is everyone posts on their blog about how they think they've got it figured out, and nobody reads the official documentation
16:40raekI do git pull origin on clojure-mode, swank-clojure and slime
16:41raekbut my .emacs is a mess
16:41raekno packages
16:41yasonraek: yeah, I've noticed that. But people love things where documentation isn't needed :)
16:42raekyason: here is my .emacs: http://gist.github.com/443590
16:43raekthe important line is (ad-activate 'slime-read-interactive-args)
16:43yasonraek: thanks, I'll cross-check with mine
16:43raekit is required if you don't use ELPA, I think
16:46raekI think there are clojure-mode forks on github that fixes record indentation too
16:46raekanyone else notices that dosync and future indents the body *one* space?
16:47caioraek: Im trying to extend the namespace clojure.contrib.sql, I created a (ns extended.sql), how can I import all functions of clojure.contrib.sql into this namespace?
16:47cemerickI wonder if anyone knows off-hand where the discussion about case dispatch can be found (e.g. using lists for grouping multiple dispatch constants, etc)?
16:48cemerickI think it was here, but I've not had any luck googling.
16:48caiolook, I have to call (:require extended.sql) then have all functions defined in contrib.sql too
16:48raekthere's immigrate in c.c.ns-utils
16:49raekbut it has caveats
16:50caiowhats "the right way (tm)" for doing this type of thing?
16:50raeknamespaces are not designed to be copied and extended, I think...
16:50caiouse immigrate?
16:50yasonraek: swank-clojure automagically offered to install 1.1, did you say you tweaked it to work with 1.2 too?
16:50raekwhat is the usage scenario?
16:51raekyason: don't use the auto features
16:51caioi need to extend contrib.sql to support returning insert-id when I insert rows
16:51caioand other stuffs like this
16:51raekI think that is ELPA trying to download its latetest version
16:51raekwhich is not the one on github
16:52raekcaio: the most common way (I think) would be to have your extensions in your own namespace
16:52raekand a user that want's to use te original sql API plus your simply uses both
16:52yasonraek: it didn't seem to find my clojure 1.2 eventhough I pointed swank-clojure-jar-path to it -> tried the automatical features to see if they would add some setup lines to .emacs or .emacs.d
16:54raekhave you added to the load path?
16:54yasonraek: you mean emacs load path?
16:54raekyes
16:55yasonraek: they're good
16:55raekI'm not an emacs guru...
16:55raekso I don't know how to debug emacs probelms
16:56yasonI know emacs, I know clojure, but only slightly about the internals of slime and even less about swank-clojure
16:56yasonwell, i'll take a look at that tomorrow
16:56raekyou might have to delete the packages ELPA have downloaded
16:57raekI only use the 3 git projects + the .emacs file you saw, nothing more
17:00slyrusi had to turn off slime-autodoc to get things working well :(
17:00slyrusnot sure if that's still the case though
17:06yasonraek: I had deleted elpa stuff already, just trying to find out how to point swank-clojure to *my* clojure.jar
17:07raek(setq swank-clojure-jar-path "path/to/clojure.jar")
17:12LajlaIN YOUR HEEEEEEAAAAD, IN YOUR HEEEEEAD.
17:12Lajlaqbg, functions used by people that are bad at functional programming and try to duplicate imperative.
17:13qbgtake-nth would benefit
17:17qbgOoh, you could make lazy vectors with that
17:18qbgWell, not vectors, but a lazy indexed sequence
17:27Lajlaqbg, indexing lists, or indexing at all really has little palce in functional style I think.
17:27LajlaI know of no library function in any functional language except one that indexes itself that I have seen implemented using indexing.
17:28qbgfirst/rest places limits on the computational complexity of algorithms
17:28LajlaPeople always say that lists are slow on indexing, and they are, that is why they are not used for that in general.
17:28Lajlaqbg, well, functional style usually means you do stuff with all the elements in the list.
17:28LajlaAnd not pick them out accordingly runtime information
17:28LajlaYou tend to transform lists, not select elements from them.
17:30qbgBut sometimes you do select elements from them
17:31qbg(this is all just an excuse for me to play with protocols)
18:13Nanakhielqbg, name me an example?
18:13NanakhielI would be most gracious
18:14qbgNanakhiel: Of?
18:15Lajlaqbg, explain?
18:15LajlaHow does one binary search a list?
18:15qbgThe same way you normally perform a binary search
18:16Lajlaqbg, I just mean, why binary search a list when you can also binary search a vector.
18:16LajlaI think that actually first converting it a vector is going to end up faster than if you were to index from the start all over again, of course, that is not needed if you do it smartly.
18:16qbgAn indexable list is an abstraction
18:16LajlaNo it's not!
18:17LajlaIt's a binary tree whose rightmost leave is null.
18:17LajlaDo not let the people who tell you that it is anything other confuse you
18:18qbgHow is it not an abstraction?
18:18Lajlaqbg, because it is what it is.. =(
18:18LajlaA binary tree
18:18Lajlawhich like any binary tree supports exactly two operations
18:18Lajlaleft branch, right branch
18:19qbgInstead of first/rest, you have first/rest/nth
18:19LajlaNO YOU DOOON'T
18:19LajlaYou have car and cdr.
18:20Lajlarest is a nondescriptive name.
18:20Lajlafirst and second are good too.
18:20rhudsonWrong language Lajla
18:20LajlaYou are frightening me with your conceptualism.
18:20LajlaHEY, there are already eyes in here.
18:21qbgHmm.. Perhaps I should make it first/rest/nth/nthrest
18:22LajlaWAAHH
18:22LajlaSo you're like implementing them on top of ARRAYS?
18:22qbgI can get a vector in terms of my abstraction
18:23qbgI can get a sequence of the form (map f (range length)) in terms of my abstraction
18:24LajlaEvery time you do this, a lisp machine dies...
18:24LajlaSay you believe in cons pairs.
18:25qbgNo love for hunks?
18:25qbg;)
18:25qbg(http://maclisp.info/pitmanual/hunks.html)
18:38clajhow to get the clojure.set.union (and other set-functions) to work? I've tried (clojure.set.union #{1 2 3} #{4 5 2}) without results... is it my classpath?
18:39clajI get java.lang.Exception: Unable to resolve symbol: union in this context (NO_SOURCE_FILE:16)
18:39Raynes->(clojure.set/union #{1 2 3} #{4 5 2})
18:39sexpbot=> #{1 2 3 4 5}
18:39clajbig thx^inf
19:03Lajlaqbg, my toy lisp has that actually, vectors are homogenous, so I invented tuples for hetrogenous random access, then I realized that a tuple of 2 is essentially a cons cell
19:11somniumLajla: see SRFI 101 -> some percentage of schemers no longer believe in cons cells either
19:12somniumat least not of the 'look ma, its just like the lambda calculus' variety
19:13Lajlasomnium, actually, I just like to be insane, in reality I have given the issue _a lot_ of thought in my own toy lisp and am leaning towards cons pairs which are just a special case of tuples in thend.
19:14LajlaI considered storing the length of the list in it too but I figured in the end that tail-hopping was going to have too much overhead to be worth it unless every cons pair had to store the length of what was to come.
19:16technomancy"Just like grandma used to make!"
19:18LajlaMy grandma used to make me fish eyes.
19:18LajlaI still eat them.
19:18LajlaIt grosses people out.
19:24LajlaProbably some Chinese thing though, I hear it's normal in the... our culture.
19:52Lajlasomnium, dicisne latinam?
19:53somniumnil
19:53LajlaI like your response
20:51ericthorsen_o where do type hints go with defrecord and deftype on the fields that are not ints or floats? It appears everything turns into Object otherwise. Is thing information used/stored anywhere in the genned class?
20:51ericthorsen_so
20:56ericthorsen_so where do type hints go with defrecord and deftype on the fields that are not ints or floats? It appears everything turns into Object otherwise. Is thing information used/stored anywhere in the genned class?
21:46bmhI've got a list of characters '(\a \b \c), what's the proper way of turning that into a bonafide string?
21:47rhudson,(apply str '(\a \b \c))
21:47clojurebot"abc"
23:38TimMcRaynes: Where do you want feedback on try-clojure.org?