#clojure logs

2010-07-08

01:51scottjugh I hate it when you have to write two versions of the same thing, one in your backend language and one in javascript, if you want security and a decent UI. Really then your better option is just using the javascript version on front and backend and using javax.script.ScriptEngineManager, but it's pretty sad when writing javascript on the server is the best option.
02:21persHello all. I am trying to do some rough benchmarking of clojures lazy sequences against the CL SERIES lazy sequences. Is there a faster way (maybe with types) to express in clojure: (reduce + (take 10000000 (iterate inc 0)))
02:22persor better than: (reduce + (range 0 10000000))
02:46semperostrying to make a relatively simple macro
02:46semperoswant to send an agent an arbitrary number of assoc's
02:47semperosthe agent is a map with keywords mapped to vectors
02:47semperosso I'm conjing and then sending that to the agent via assoc, but I want to do that an arbitrary number of times for one send command
02:47semperosand I want to abstract away the conj syntax in a macro
02:48semperosif stats were my agent, then an example would look like this:
02:49semperos(send stats assoc :nicks (conj (:name @stats) "Johnny") :hobbies (conj (:hobbies @stats) "Piano"))
02:49semperosso from a macro standpoint
02:49semperosjust not quite clicking with how I write out the arbitrary number of repeats for the args to that assoc
03:15mmarczykbetter (send stats (fn [s] (assoc :nicks (conj (:name s) "Johnny") :hobbies (conj (:hobbies s) "Piano")))) (or sth similar) so that the :name & :hobbies values are taken from the Agent state assoc will be working with
03:15mmarczykas for the macro, you'd have to give an example of what you'd like an example invocation to look like
03:25mmarczyksemperos: plus this definitely sounds like a job for a function rather than a macro...
03:25semperosalso what I like to hear :)
03:26semperosreading your code from a few minutes back...
03:27mmarczykthat was in response to your snippet which obtained some of the arguments to (send stats ...) from @stats
03:27semperosright
03:28mmarczyknot a good idea -- who knows what might happen between the first @stats, the second @stats and the final send ;-)
03:28semperosabsolutely true
03:29semperosto make sure I understand
03:29semperoshow is your 's' above being dereferenced, so I can get at the actual value attached to each keyword?
03:30mmarczykthe 's' is the agent's state
03:30semperosmore often, that is
03:30semperosI read it, didn't sink in; thanks, that makes complete sense
03:30mmarczykthat's how send works
03:30mmarczyk:-)
03:30mmarczykin your (send stats assoc ...) version
03:31mmarczykassoc gets a "state" argument too -- as the first argument, in fact
03:31semperosyep, makes sense
03:31semperosthanks for answering complete newbie questions and guiding aright
03:32mmarczyknp :-)
03:32semperosI miss IRC
03:32mmarczyknow I'm not sure if I understand what you're trying to do, but I guess you want to conj multiple things
03:32mmarczykonto some of the vectors in your map
03:32mmarczykwhich is held by the agent
03:32mmarczykright?
03:32semperosyep
03:32semperosstill in play-to-learn phase
03:33semperosparsing some server logs
03:33mmarczykyou might find update-in useful
03:33mmarczyke.g.
03:34mmarczyk(send stats (fn [s] (-> s (update-in [:nicks] conj "Johnny" "Lil' John") (update-in [:hobbies] conj "Piano" "Harpsichord"))))
03:34mmarczykmaybe use a 'let' around the '->' form if you need to compute some of those arguments to conj first
03:35semperosthat's pretty
03:36mmarczykyou can wrap it in a function with whichever signature is convenient
03:38semperosthat definitely reads in the code like what I'm trying to do more than the straight conj's
03:39mmarczykmaybe (defn update-stats [args] (let [m (apply hash-map args)] (fn [state] (reduce (fn [s [k vs]] (apply update-in s [k] conj vs)) state m))))
03:39mmarczykum, actually (defn update-stats [stats args] ...)
03:40semperosat first read-through, makes sense
03:40mmarczykto be used as (send stats update-stats :nicks ["Johnny" "Lil' John"] :hobbies ["..." "..."])
03:40mmarczykalso, it's (defn update-stats [stats & args] ...)
03:40mmarczykhopefully no more typos remain :-)
03:40semperosno worries
03:41semperosI really appreciate it
03:41mmarczykit might not be enough if some of the values need to be computed from other stuff already in stats, but you can generalise from here
03:41mmarczyknot at all
03:41mmarczyk:-)
03:41semperoscan indeed
03:41semperosand in this case, no further context needed; just insertion
03:42semperosthat's what I get for disobeying the first rule of macros
03:42mmarczyk:-)
03:42mmarczykactually in this case a macro wouldn't work at all
03:42mmarczykbecause there's no getting around the need for the actual runtime values of the arguments
03:42semperosyep
03:43semperosmacro expansion at compile time
03:43mmarczykright
03:43mmarczykso in this case, a macro would likely end up expanding to ((fn ... :-)
03:43semperosright
03:45cais2002is there a way a site-map or anything where I can view all pages on clojure.org
03:45semperosthere's this one :)
03:45semperoshttp://clojure.org/space/sitemap
03:46mmarczykwhoa, cool :-)
03:46mmarczyknever knew about that!
03:46semperosjust figured there'd be one for the search engines
03:46semperosby day, I'm a Drupal programmer, which is why I enjoy Clojure so much
03:46semperosfeels mentally cleansing
03:47cais2002it does not include http://clojure.org/protocols
03:47semperoscais2002: I don't know if it includes everything, or if it's even the primary sitemap for search engines
03:47mmarczykcais2002: it's best to go to assembla for the new features anyway
03:47mmarczykcais2002: http://assembla.com/spaces/clojure
03:48cais2002mmarczyk, right, but then it points back to clojure.org, saying that that's where the latest copy is
03:49mmarczykcais2002: hm, indeed
03:49mmarczykguess this will be cleaned up 'round release time
03:49cais2002so assembla is supposed to be the starting point for latest info?
03:50mmarczykit's the starting point for development info, in addition to the ggroups
03:52mmarczykok, breakfast time... bbl
03:52semperosmmarczyk: thanks for everythign
03:54mmarczyksemperos: np :-)
04:20esjhowdy, y'all
04:27yangsxhi, what does & mean in a function call like (standard-metadata &form docstring sym) in Stuart's lazytest?
04:28mmarczykyangsx: &form is bound to the entire form being expanded in the body of a macrofunction; try e.g. (defmacro foo [& args] &form) (foo 1 2 3)
04:30mmarczykyangsx: or actually (defmacro foo [& args] `'~&form)
04:33yangsxmmarczyk: the expression I cited comes from describe.clj in lazytest. The problem for is it is not in a backquote form
04:34mmarczykyangsx: it doesn't need to be, it's just a "magic argument" to macros
04:34mmarczykyangsx: every macro defined with defmacro receives two extra arguments, &form and &env
04:36mmarczyk&env allows access to the lexical context of the site where the macroexpansion takes place
04:36mmarczyk&form just holds the whole form being expanded
04:36mmarczykthese are just regular symbols, the & has no special meaning
04:36yangsxhow is &form different from the body of a defmacro
04:36LicenserHmm case study: would it be useful to couple a combo box with a hash map? As in key is displayed, key and value given as selected?
04:37mmarczykyangsx: when (foo 1 2 3) from above gets macroexpanded
04:37mmarczykthe body of the macro function is `'~&form -- syntax-quote, quote, unquote, &form-the-symbol
04:37mmarczykwhereas &form is bound to (foo 1 2 3) -- a list of the symbol foo and a bunch of numbers
04:38mmarczykLicenser: useful for what? ;-)
04:39yangsxmmarczyk: thanks. I never know this. (I don't think CL has this convention.)
04:44mmarczykyangsx: I think you can use &whole to specify a symbol to be bound to the whole form being macroexpanded in CL's defmacro
04:44mmarczykas in, (defmacro foo (&whole form &rest args) `',form)
04:49yangsxmmarczyk: you're right
04:57yangsx&whole is mentioned just once in "On Lisp" and &form is not mentioned at http://clojure.org/macros. That explains why I have to ask for help here :)
05:02mmarczyk:-)
05:02mmarczykyangsx: http://www.lispworks.com/documentation/HyperSpec/Body/m_defmac.htm#defmacro
05:03mmarczykall the magic incantations assembled :-)
05:04mmarczykthen by following the links we can learn that apparently (setf (macro-function foo) (lambda (form env) ...)) is possible... crazy language :-)
05:05yangsxthere are quite some arcane features in CL :)
05:06mmarczykyup :-)
05:08mmarczykjust searched On Lisp for any mentions of &whole... the only one -- well, except the other one pointing back to it from the index :-P -- says that some model of macro expansion wouldn't handle &whole properly :-)
05:09mmarczyktechnical merit aside, OL never comes short in the amusement department
05:18LauJensenMorning guys
05:18BahmanMorning LauJensen!
05:18tcrayfordmorning Lau
05:28npoektophi! how to get public field of an object?
05:31esjnpoektop: in repl-utils is show, which i think will help
05:33npoektopesj, i need smth else. I need to get a field of an object and used it
05:33vibrantany shortcut for (let [foo (someexpr)] (map #... foo) foo)?
05:33esjnpoektop: sorry dunno ;)
05:33vibrantso to create an object, map it and return it
05:34Chousukevibrant: that code is buggy
05:34Chousukevibrant: map is lazy, so nothing will actually happen to foo
05:35vibrantoh ok so i should just do for
05:35Chousukeno, for is lazy too
05:35Chousukeyou want doseq or something
05:35Chousukeif you need side-effects
05:35vibrantoh ok yea.
05:35vibrantbut regarding my initial question, any idea?
05:36Chousukeno such thing
05:36Chousukeit'd be easy to make though.
05:36vibrantyea, was just checking if i'm missing something. thanks.
05:40npoektopChousuke, is it possible to get public field of an object to use it somewhere else? I solved my problem another way, so i'm just asking
05:40npoektopfor interest
05:43mmarczykvibrant: (doto (someexpr) (->> (map #...) dorun))
05:44mmarczyknot that it's shorter, but perhaps DRYer
05:44vibranthaha thanks
05:44vibrantmmarczyk; where are you from?
05:44mmarczykPoland
05:59cais2002what's the difference btw defrecord and deftype ?
06:07Chousukecais2002: defrecord implements a standard map interface automatically
06:08Chousukecais2002: deftype does nothing
06:08Chousukecais2002: unless you know you need deftype, use defrecord :)
06:11cais2002Chousuke: map interface means I can do (fieldname record-instance) ?
06:11Chousukecais2002: :fieldname, but yeah
06:11Chousukecais2002: basically, it works just like a normal map
06:11Chousukecais2002: there are some other interfaces implemented too
06:12Chousukecais2002: but I don't know what they are
06:12cais2002Chousuke, under what situation will reify be useful?
06:12Chousukewhen you need to implement a java interface or a protocol without actually creating a new named class.
06:12Chousukeeg. a swing listener or something.
06:13cais2002i c, that's what I guessed.. sort of anonymous class
06:13Chousukeyeah
06:13cais2002(foo
06:13cais2002 (let [x 42]
06:13cais2002 (reify P
06:13cais2002 (foo [this] 17)
06:13cais2002 (bar-me [this] x)
06:13cais2002 (bar-me [this y] x))))
06:14Chousukereify also closes over locals so you can return reified objects from functions.
06:14cais2002it seems a waste to implement bar-me when u only need foo in this case
06:15Chousukewell, I dunno, usually you're supposed to implement the entire interface
06:15ChousukeThough won't reify generate stubs for methods that you leave out?
06:16tomojisn't (foo (reify P (foo [t]))) useless anyway?
06:16tomojI mean, why bother reifying?
06:16Chousukeyeah, you wouldn't really use reify like that :p
06:16Chousukeusually you'd have a function that returns reified objects and then do (foo (get-object))
06:17cais2002right, the documentation is pretty confusing. I have to dig into the code in clojure.java.io to reach the ah-ha moment
06:17cais2002i mean what i thought is the ah-ha moment for me
06:18cais2002documentation is a bit abstract, should have more meaningful examples
06:20tomojprotocol function vars don't get :file and :line metadata, bug?
06:21tomojI mean, is there some reason they shouldn't?
07:05LauJensen tomoj: Are you on a recent snapshot, I seem to recall that issue being discussed a while ago
07:14tomojI have clojure-1.2.0-master-20100623.220259-87.jar, looks like that's the latest
07:20LauJensenI cant say if its a bug or not. I think its tied to the fact that datatypes are reified as classes and not as values in vars.
07:30LicenserGood morning my lispy friends
07:31LauJensenGood morning
07:32RaynesMorning.
07:32LicenserHow is the world of parentheses today.
07:32Licenser.
07:33Licenser? Is what I mean
07:33tomojlooks like defprotocol uses intern directly
07:35tomojand the :line/:file stuff is done in the compiler
07:37tomojshould macros have another implicit arg for this?
07:37tomojguess it would be rarely useful
07:38LauJensentomoj: From a user-perspective, you shouldnt need it
07:40LicenserFor a swing combo box would it be goood to allow key value pairs as data source?
07:40tomojuser-persective?
07:41tomojuser of what?
07:50esjHi Licenser
07:51Licenserhi esj
07:54LauJensentomoj: user = developers. Im not seeing where you, Mr. tomoj, will be needing that info ?
08:05zmila,({ :1300 [:1322 :1003] :0130 [:1003] } :0130)
08:05clojurebot[:1003]
08:42vibrantwhat use is ~'name in a macro?
08:42vibrantisn't it equivalent to just name?
08:49dabdI am searching for the Clojure 1.2.0 roadmap to find more info about
08:49dabd support for annotations in gen-class. Does anyone know where this is
08:49dabd documented? Thanks.
08:50LicenserThe one page has some info not github but where the trackers are
08:50Licenser Ut I always forget the name
08:51esjassembla ?
08:52LicenserExactly
08:52LicenserThey have some nice infos the in the wiki thingy I think
08:54LauJensenvibrant: name resolves to user/name, #'name resolves to the literal symbol (be it local or whatever) 'name'
08:55LauJensen,`#'name
08:55clojurebot(var clojure.core/name)
08:56vibranti guess i have to experiment with this :)
08:56vibranti just found it in clj-record
08:56vibrantany other suggested ORM?
08:56Licenservibrant: Stupid db :P
08:57vibrantmade by Smart Joe? :)
08:57vibrantoh shit it exists
08:57LicenserNope smart smart licenser
08:57vibranthehe
08:58vibrantyea look neat hehe
08:59LicenserI think it is pretty cool if you don't need real db featured
08:59LauJensenvibrant: You can check out my blogpost on fluid dynamics and understand the definition of map!, that relies heavily on #' syntax
09:01vibrantthanks Lau
09:01LauJensennp
09:13LicenserClj-cookie
09:19LicenserCoojies
09:23neotykguys anyone would be interested in taking a look at async http
09:23neotyk*** client for clojure?
09:23neotykI'm interested to know if it's api is idiomatic clojure
09:24LicenserSure
09:24neotykhttp://github.com/neotyk/ahc-clj
09:24LicenserExpect me to whine about it not being simple enough ;)
09:25neotykLicenser: that would be very much appreciated
09:25neotykI like simple
09:26cemerickneotyk: how does that differ from c.c.http.agent?
09:27neotykis backed by NIO
09:27neotykdoesn't block a thread to wait for response
09:28neotykand you can provide callback for events
09:28LicenserHmm looks good actually, since you only seem to have two really external fns GET and POST
09:28neotyklike body part, ideal for streaming
09:28LicenserHow about allowing params to be passed in a map?
09:28LicenserAo the k, v pairs
09:28neotykLicenser: yes, all http verbs will have support fns
09:29LicenserSo you might think about making the other functions private
09:29LicenserUnless there is a Reason to publish em
09:29neotykLicenser: http://github.com/neotyk/ahc-clj/blob/master/test/async/http/client/test.clj#L136
09:30LicenserAh neat
09:30neotyknext thing I'm working on, whel writing a test for it is to be
09:30neotyk*** able to provide a map as body
09:30dnolenneotyk: have you looked at clj-apache-http ?
09:30LicenserAlso if the map is the last arg you can make it look like key worded args, at least in 1.2
09:30neotykbut it could be that it works already
09:31dnolenneotyk: one thing I recommend is support urls to be represented as maps. make it's a easier to manipulate urls when representing restful resources
09:31neotykLicenser: how would that look like?
09:31dnolenuri as strings is fine, but maps should be supported
09:31neotykdnolen: have had quick look at it
09:31neotykbut find apache http client api not nice
09:32LicenserAs last arg just put ... &{:as opts}]
09:32LicenserWith a space of cause
09:32neotykdnolen: how would that map as url be used?
09:33LicenserIt is part of the new destructing neotyk
09:34neotykwhere can I read about new destructing?
09:34Ktmhi, i'm having a problem with leiningen (snapshot from github) : I called "lein compile" but it does not stop and seems to compile clojure.contrib in the classes directory
09:35LicenserHmm good question I yhink the main new feature is map destructing
09:35LicenserKtm I thick it is not supposed to is it?
09:37KtmLicenser: well i just want the class specified in :aot to be compiled :-)
09:39neotykLicenser: so basically I could have in GET for example: [#^String
09:39neotyk*** url & {:as options :or {}}] ?
09:40Licenserneotyk: I think so yes
09:41LicenserKtm: Wasn't it renamed to something else
09:41LicenserNamespaces I think
09:44KtmLicenser: do you have a doc on that?
09:57dnolenneotyk: you should look again clj-apache-http is very, very good.
10:09KtmLicenser: i've got the same problem when replacing :aot by :namespaces
10:10LicenserHmmm look at the gh page of lien, I k
10:11LicenserDon't use oat myself
11:09cemerickimport isn't cutting it anymore. Being able to apply aliases to packages would be nice.
11:10cemerick(:import [java.awt.image :as img]), or something
11:11Licensercemerick: Yes it would
11:12cemerickand the 1.3 list gets bigger :-)
11:16chousercemerick: and outer classnames
11:17LicenserIt should be 1.3 times as big as the 1.0 list
11:17cemerickchouser: that seems less useful to me. I suppose it depends on how gnarly the classnames in question are.
11:17chouserI have classnames 3 levels deep, each 20-30 chars long
11:17LicenserAnd wildcard imports
11:18chouserthat's like a 60-char classname, and no shorter way to refer to it without resorting to macros.
11:18cemerickLicenser: I think package aliases are far saner than wildcard imports.
11:18chouseryeah, I don't actually like wildcard imports at all.
11:18Licensercemerick: Yes but both could be possible
11:19cemerickwell, *anything* is possible. There was a wildcard import fn kicking around years ago.
11:19LicenserAlso if you defprotocol something in a namespaces using that ns should import the proto classes
11:19LicenserCall it import
11:19LicenserErm wimport
11:20cemerickchouser: Aside from stuff in the JDK, I'm blissfully in control of all the package and classnames floating around here. :-)
11:22chouserextended by com.google.protobuf.DescriptorProtos$DescriptorProto$ExtensionRange$Builder
11:22chouserpain
11:22cemerickyikes
11:23cemerickman, four-deep inner classes!
11:23LicenserKiiiilll them
11:23chouserbeing able to import the class so you can leave of "com.google.protobuf" just seems entirely insufficient.
11:24cemerickare there similarly-absurd things in .NET-land?
11:24Licensercemerick: Give people freedom and they will do absurd things
11:27AWizzArdrhickey: Hello, are you here?
11:29vibranthuh
11:29vibrantdid anyone else notice that json-str captures all printed information when passed a lazy seq?
11:30vibrantis it a known bug?
11:37polypus~ping
11:37clojurebotPONG!
12:18AWizzArd~max people
12:18clojurebotmax people is 283
13:24fbru02hey all i have a question , when is it necessary to do bdd or unit testing when programming in clojure ?? \
13:26qbgDefine 'necessary'
13:27mmarczykhurray! just defined a DefaultMap in Clojure :-)
13:27mmarczykhttp://gist.github.com/468332
13:28mmarczyknow I can use merge-with even if some maps might miss some keys. :-)
13:29dabdwhat is the release date for Clojure 1.2.0? thanks
13:31qbgdabd: Soon for certain values of soon ;)
14:18LauJensenmmarczyk: is the __map a standard for naming that you just made up ?
14:38Licensercoookies
14:39Licensermmarczyk: awsome!
14:59LauJensen2x Clojure on the frontpage of HN today :)
15:03LauJensenMan alpeh/netty is an impressive combo
15:11lancepantzLauJensen: HN?
15:11LauJensenhttp://news.ycombinator.com
15:12LauJensen@ lancepantz
15:12lancepantzty
15:14LauJensennp
15:22tomojLauJensen: for example, to implement defprotocol
15:23tomoj(re: where one might use file and line metadata in macros)
15:38persHello folks. If I may... What is the correct way to get the function associated with a symbol. I can do it with (eval 'foo-function) but wonder if there is a bettery way, ala CL's SYMBOL-FUNCTION.
15:39perss/better/bettery/
15:39sexpbotHello folks. If I may... What is the correct way to get the function associated with a symbol. I can do it with (eval 'foo-function) but wonder if there is a betteryy way, ala CL's SYMBOL-FUNCTION.
15:40cemerickpers: maybe you mean @#'var-name?
15:40cemerick,@#'+
15:40clojurebot#<core$_PLUS_ clojure.core$_PLUS_@1842c64>
15:40cemerick(which is sugar for (deref (var +)))
15:41cemerick,(deref (var +))
15:41clojurebot#<core$_PLUS_ clojure.core$_PLUS_@1842c64>
15:41perscamerick: thanks, i'll play with that...
15:41cemerickpers: but, functions aren't associated with symbols :-)
15:41arohnerpers: resolve, ns-resolve
15:42arohner,(resolve 'map)
15:42clojurebot#'clojure.core/map
15:42arohnerthat gives you the var associated with the symbol
15:42arohner,@(resolve 'map)
15:42clojurebot#<core$map clojure.core$map@677786>
15:42persarohner: thank also..
15:42arohnerpers: that doesn't require reader syntax, so you can even do
15:42arohner,(resolve (symbol "map"))
15:42clojurebot#'clojure.core/map
15:45vibrantif I dispatch multimethods with the class function
15:46vibranthow do i defmethod which will work for a byte array?
15:47vibrantbtw when is 1.2 coming out?
15:48RaynesWhen It's Ready(TM)
15:48RaynesAKA soon.
15:49cemerickvibrant: using (class (make-array Byte/Type 0)) as your dispatch value should work
15:49cemericker, Byte/TYPE
16:02LauJensencemerick: Did you check out my last post? Im sure you'll find some inspiration :)
16:02cemerickLauJensen: sorry, link?
16:02LauJensenhere via HN http://news.ycombinator.com/item?id=1498275
16:03LauJensenConsider it an early birthday present :)
16:03LauJensen(or late)
16:04bobo_LauJensen: the screencast was awesome, it would be even awesomer if keybindings you use are displayed as overlay in the video
16:05bobo_ive seen it in some other videos, but cant rememver where atm.
16:05LauJensenbobo_: Yea thats where linux is failing me a little bit. Im recording using gtk-recordMyDesktop and grabbing the sound with a separate soundrecorder, then merging with mkvmerge - So in that process there is no tool for overlays :(
16:05LauJensenIn this regard the OSX guys have it made
16:05bobo_ah
16:06LauJensenAlthough, now that I think of it, I actually think that theres a video editing more for Emacs - I'll check it out
16:06bobo_:-)
16:06LauJensensure enough http://1010.co.uk/gneve.html
16:06bobo_haha, thats abit weird tbh =)
16:07LauJenseneh?
16:07bobo_seeing video in emacs
16:07LauJensenI dont follow?
16:07LauJensenHere's how its done http://www.youtube.com/watch?v=0vumR5Hcz7s
16:08tomojhttp://julien.danjou.info/blog/2010.html
16:08cemerickLauJensen: screenflow FTW, FYI :-)
16:08LauJensencemerick: I know I know :)
16:09cemerickLauJensen: so far, this screencast highlights everything about emacs that I find objectionable. Perhaps that was your intent. ;-)
16:09LauJensenno no - I was actually hoping that you would appreciate the power of integrating all of your daily-use tools
16:10cemerickheh
16:11Licensernight my lispy friends
16:11LauJensenI finish with some Clojure tips though - I think they might make you jealous :)
16:11LauJensengood night Licenser
16:11vibrantanyone did some digging with Vaadin and Clojure?
16:15AWizzArdLauJensen: did you see Zach Tellmans new lib? "Aleph"?
16:16LauJensenAWizzArd: Oh yes I did!
16:16cemerickLauJensen: I've never doubted the incremental power that emacs/slime/etc provides. It's the UI and discoverability (lack thereof) that keeps me away (C-x o for marking a task as done is *so* obvious! ;-).
16:16AWizzArdLauJensen: so, it sounds good doesn't it?
16:16LauJensenIts C-x t, t = toggle. It toggles the TODO states :)
16:16LauJensenAWizzArd: Very good - I'm definitely going to run some tests with it
16:16cemerickheh, whichever it was :-)
16:17LauJensenThe great thing about Zach, is that everything he does it 100x faster than what everybody else is doing :)
16:17cemerickSee, I just heard you say what it was in the screencast 1 min ago, and I've already forgotten.
16:17LauJensencemerick: Could that be, because you dont _want_ to learn ?
16:17LauJensenI mean, a man with your intelligence should be able to sit down with a cheat-sheet and memorize 10 or so shortcuts ?
16:17cemerickExactly. I've got other things to learn already. :-)
16:17cemerickAFAICT, there's *hundreds*.
16:17LauJensenAh, so you're too busy sawing to sharpen the saw? makes sense I guess... :)
16:18LauJensenI think I use 10 or 12 regularily, but I'll have to ask my fingers
16:21slyrusanyone have a pointer to a nice library that uses protocols (? -- defrecord is what I want, I think) that I can learn from?
16:23LauJensensec
16:23LauJensenslyrus: http://blog.higher-order.net/2010/07/04/conj-labs-clojure-lessons-part-i/
16:23slyrusthanks LauJensen
16:23ohpauleezthat's what I was going to point you to :)
16:24LauJensenohpauleez: sure sure :)
16:24ohpauleezhaha
16:24LauJensenslyrus: But if you really want to dig in, you should do what the author of that post did and visit conj-labs.eu :)
16:24ohpauleezlabrepl has an example too
16:25ohpauleezand there's a create talk/video about them http://vimeo.com/11236603
16:26LauJensenohpauleez: give up already - I beat you to that first link, you cant take it back by flooding the channel :)
16:27ohpauleezhaha
16:27ohpauleezLauJensen: I also enjoyed the post today. I always forget that you also use Awesome
16:28LauJensenThere was this fun comment on #archlinux, where one guy said "I run awesome", then the next guy goes "I run ok. I wouldnt say I run awesome" :D
16:28LauJensenGlad you enjoyed the post though!
16:28LauJensen(and I hope cemericks being so quiet because he's secretly installing Arch and Emacs)
16:28ohpauleezI was a slackware guy for a long time, and now I use Arch and OS X
16:29LauJensenYea Slackware was my second distro as well. But I just grew weary of not having pacman
16:30LauJensenI remember a great post on the Arch forum where this guy suddenly injects in a discussion about version control in pacman "WHAT? Arch has a package manager?! Ive been hand-compiling for a year now!"
16:30cemerickI can't imagine I'll ever run linux on a non-server box.
16:31technomancyLauJensen: have you considered relabeling the comment submission button on your blog? right now it says "Submit Query", which is a little strange
16:32cemerickactually, that's not true -- I do some limited testing in ubuntu in virtualbox
16:32LauJensentechnomancy: Thanks - I forgot all about that, I'll get to it
16:32smiley-how can I use the # character in a string?
16:33smiley-if I use "#w" it will say "No dispatch macro for: w"
16:33cemerickoh?
16:33cemerick,"#w"
16:33clojurebot"#w"
16:33smiley-hmm
16:35technomancyhmm... looks like I need to generate a TAGS file for Clojure's Java source =)
16:35smiley-I used the string in a doto did put the string into a def instead now
16:35smiley-seems to work better
16:36cemericksmiley-: can you paste the usage that wasn't working?
16:36cemerick,(doto "#w" println)
16:36clojurebot"#w"
16:36clojurebot#w
16:36slyrusso, I want to represent atoms (you know, the basic unit of matter in the physical world, not the data structure for managing stateful data). any suggestions on a type name?
16:36cemerick,(println "#w")
16:36clojurebot#w
16:37LauJensenslyrus: sure, basic unit of matter => bum
16:37slyrusbah
16:37LauJensen:)
16:37hiredmanwhats wrong with atom?
16:37slyrus(defrecord atom ...)?
16:37hiredman(defrecord Atom ...)
16:37technomancyslyrus: atomos is where our English "atom" comes from
16:38technomancycould always go greek
16:38technomancyor better yet: ἄτομος
16:38technomancythat last one was for hiredman =)
16:38AWizzArdBtw, is Zach Tellman sometimes in here?
16:38smiley-bah.. I had unbalanced " thats why it failed
16:38slyrusyeah, I thought about Atom. I feel like it's likely to confuse folks (me included) at some point.
16:38hiredmanin whatever.physics that defrecord will result in whatever.physics.Atom so you can call it a physics atom
16:41LauJensentechnomancy: I answered your question on the post - **; is your friend
16:41LauJensenAWizzArd: Less than rarely
16:42technomancyLauJensen: but I have to use the mouse to read your reply since I don't know the answer yet. (oh noes!)
16:42technomancyLauJensen: thanks. =)
16:42LauJensenI was actually considering removing the 'show comments' button and just have all comments rendered
16:43technomancyLauJensen: would be nice not to have a nested scrolling div at least
16:43LauJensensure :)
16:43LauJensenbtw - Been a while since I saw an Emacs post in the top 6 on HN
16:44LauJensen"this screencast is the first thing that's made me seriously consider switching to Emacs from vi"
16:44technomancygo go gadget M-x upvote
16:44LauJensen:)
16:44LauJensenI'll bet you've got a red button strapped to your arm that does that
16:44slyrushiredman: is (defrecord foo.bar.DataType ...) the convention, rather than foo.bar.data-type?
16:45AWizzArdIs there a good reason why the binding forms of 'binding' are evaled in parallel and not in sequence, as it happens in 'let'? (do (def x 0) (def y 0) (binding [x 10, y (dec x)] [x y])) ==> [10 -1] (vs. [10 9])
16:50LauJensenAWizzArd: Shouldnt that blow-up and not give you -1?
16:50neotykLauJensen: haven't seen your new screencast yet, have you showed power of paredit?
16:50LauJensenneotyk: The power of paredit is that you can disable it
16:51neotykplain wrong
16:51LauJensenneotyk: paredit is crutched for the lame and handicapped
16:51LauJensenneotyk: paredit is like training wheels. The sooner you get them off the faster you go
16:51LauJensenBetter to master Emacs
16:51LauJensenThan to be a slave of pardit
16:52ysphLauJensen: in what sense?
16:52technomancywe are still waiting for Lau to see the light on that one.
16:52neotyktechnomancy: m'key
16:53shooverLauJensen: do you use kill-sexp, transpose-sexps, etc?
16:53AWizzArdLauJensen: I expected it to behave like let in the way it binds the vars, i.e. sequentially. But binding seems to behave like CLs LET, whereas CLs LET* is like Clojures let. Throwing an exception would be strange I would say, because binding should be able to take multiple bindings.
16:53cemerickAWizzArd: I wouldn't expect that to ever change if I were you.
16:54LauJensenshoover: no
16:54LauJensen,(binding [x 10 y (dec x)] [x y])
16:54clojurebotjava.lang.Exception: Unable to resolve var: x in this context
16:54AWizzArdcemerick: what changes? The behaviour of 'binding'?
16:54cemerickyeah
16:54AWizzArdLauJensen: yes, because (def x 0) needs to be done first.
16:55LauJensenAnyway - I have to hit the sack - Good night to all- Feel free to drop comments on the blog if you can make a strong case for paredit :)
16:55AWizzArdcemerick: I don't want to vote for binding to change, but I am interested if there is a technical reason why it was made to behave the way it does.
16:55AWizzArdIt is easy to add a binding* macro that works sequentially. This however may indeed be a nice addition.
16:56cemerickah, I thought you were revving up to lobby for a change to binding :-) My bad.
16:56AWizzArdWell, this is one of the valid interpretations. I was not clearly specifying against such a breaking change.
16:57AWizzArdThough, I would vote for the addition of binding* or something similar. Anyway, I will have to ask rhickey next time he shows up.
16:59cemerickIt seems like a rarely-needed item. I can only remember requiring it once or twice.
16:59technomancyAWizzArd: IIRC it's not possible to implement with good performance in binding like it is in let
17:06AWizzArdtechnomancy: ok, efficiency would make sense
17:12slyruslet me put that another way... why do folks use CamelCase instead of sanely-cased-identifiers for defprotocol?
17:16hoeckslyrus: maybe to denote that ThisIsAProtocol?
17:16neotykslyrus: they compile down to java interfaces, that can be used by Java folk
17:16slyrusah, ok. I thought it might be something like that.
17:39anonymouse89I'm trying to do something like (ns myprog (:require [clojure.contrib.math :as math]))
17:39anonymouse89but now how do I add another :require?
17:39anonymouse89I understand I could do (:require (a b c))
17:39chouser(:require [a :as b] [c :as d])
17:39anonymouse89but how can :as be used in that case?
17:41anonymouse89chouser: thanks, I was being silly: the require wasn't on classpath
17:45chouserok
18:08arohnerI don't suppose anyone is working on map-of, similar to vector-of?
18:41ohpauleezdoes anyone know what the latest/fastest/most used interface to cassandra is?
18:41ohpauleezclient*
18:49arohnerdo defrecords use less memory than the equivalent PersistentMap?
18:53dsopstuarth: before I post it to clojure-dev, does it make sense to add a digest wrapper in contrib. something that wrapps MessageDigest?
18:54dsopand if yes, does it make sense to star ta contrib.crypto.digest namespace or just add contrib.digest
19:18itistoday#_(defn reduce
19:18itistodaywhat's the #_ there?
19:18cemerickarohner: yes, slots in records are fields, whereas slots in PMs are entries in a tree.
19:18qbgIgnore the next form
19:20arohnercemerick: thanks. I'm dealing with massive memory usage in my app, 1.5GB
19:20itistodayqbg: oh right, thanks
19:20arohnercemerick: and that's only 1/4 the data loaded so far
19:21itistodaydoes that mean the entire definition is commented out? why ... do that?
19:21qbgitistoday: IIRC, the protocol based reduced caused some issues
19:21cemerickitistoday: because that version of reduce will come back eventually
19:22itistodayoh, ok, thanks!
19:23cemerickarohner: records will help, but of course, do some profiling before embarking on any major efforts.
19:23arohnercemerick: yep. I
19:24arohnerI'm looking at the visualvm heap dump
19:24TeXnomancyarohner: 8GB instances on EC2 aren't that pricey, depending on how long you need it for. =)
19:24arohnerTeXnomancy: 24/7, if we're successful
19:25arohnerTeXnomancy: and we're not being paid yet, so I'd rather not spend the money :-)
19:25arohnerTeXnomancy: and I suspect that excessive memory usage is causing performance problems paging across the datastructure
19:26dsoprhickey: would it make sense to add a wrapper around MessageDigest as contrib.digest or contrib.crypto.digest?
19:27TeXnomancysure
19:39slyrusok, now for a good example of using zip-filter.xml?
19:44itistodayis there a good document somewhere on chunked seqs?
19:56rbergerAnyone know of an Opscode chef cookbook for installing leiningen and its dependencies?
20:00TeXnomancyrberger: I'm not sure leiningen belongs on chef-handled servers?
20:04itistodayi think i just received my first customized lisp-related spam email...
20:05rbergerTeXnomancy Why do you wonder that? I would think it would be ideal way to make sure the right things are installed?
20:05TeXnomancyrberger: we use lein to build a tarball to deploy
20:06TeXnomancythat way as long as a build succeeds on the CI server, it'll always be deployable
20:06TeXnomancyyou don't want issues with mirrors going down, etc. to affect being able to deploy a known-good build
20:06TeXnomancyhttp://github.com/technomancy/lein-release
20:07rbergerTeXnomancy I see... I guess we're still at the stage where we are deploying more from source right now..... But what you are suggesting does make sense.
20:32itistodayah ok, found this: http://www.infoq.com/news/2009/12/clojure-11-rc1-transients
20:34itistodaywhat about creating chunked-seqs? how do you do that?
20:37slyrusis there a better way to get the attributes from each of these nodes than: (map :attrs (zf/xml-> elements :element zip/node))
20:40slyrusin particular, I was hoping something like this would work: (zf/xml-> elements :element zip/node :attrs)
20:41slyrus(maybe without the zip/node in there, but neither way works)
20:48hiredman,(doc repeatedly)
20:48clojurebot"([f] [n f]); Takes a function of no args, presumably with side effects, and returns an infinite (or length n if supplied) lazy sequence of calls to it"
20:54hiredman,(doc interpose)
20:54clojurebot"([sep coll]); Returns a lazy seq of the elements of coll separated by sep"
20:54hiredman,(doc interleave)
20:54clojurebot"([c1 c2] [c1 c2 & colls]); Returns a lazy seq of the first item in each coll, then the second etc."
20:59TeXnomancy,(zero? nil)
20:59clojurebotjava.lang.NullPointerException
20:59hiredman,(zero? nil)
20:59clojurebotjava.lang.NullPointerException
21:03qbgCause is .getClass() being called on nil in clojure.lang.Numbers/ops
21:03itistodayshould it return true?
21:04TeXnomancyI'd prefer false, to an exception, but whatever.
21:06itistodayoh, yeah that would make sense
21:07itistoday,(and nil (zero? nil))
21:07clojurebotnil
21:07itistodaytada!
21:07itistoday:-p
21:09itistoday,(System/exit 0)
21:09clojurebotjava.security.AccessControlException: access denied (java.lang.RuntimePermission exitVM.0)
21:10itistoday,(Thread.)
21:10clojurebot#<Thread Thread[Thread-278,5,main]>
21:11itistoday,(.start (Thread. #(println "foo")))
21:11clojurebotnil
21:11itistoday,(dotimes [_ 1e9] (.start (Thread. #(println "foo"))))
21:12clojurebotjava.lang.OutOfMemoryError: unable to create new native thread
21:12dsop:)
21:12itistodaygrrr
21:16itistoday,(#((println "foo")(println "bar")))
21:16clojurebotjava.lang.NullPointerException
21:16itistodaywhy?
21:16clojurebotwhy not?
21:16qbgYou are trying to call the function nil
21:16itistoday,(#((println "foo")(println "bar") (fn [_] "blah") ))
21:16clojurebotjava.lang.NullPointerException
21:16itistodaynope
21:16itistodaysee
21:17itistodayat least i think there shouldn't be a nil anywhere there
21:17qbgprintln returns nil
21:17itistodayqbg: the last thing that's returned is a function
21:18itistoday(fn [_] "blah") no?
21:18qbgNo
21:18itistodaythen why is nil returned?
21:18qbgYou are trying to call the function (println "foo"), which is nil
21:18itistodayoh
21:18itistodayi see
21:18itistodaythanks :-p
21:25itistoday,(letfn [(f [] (.start (Thread. #(do (Thread/sleep 10) (f)))))] (f))
21:25clojurebotnil
21:25itistoday,(letfn [(f [] (.start (Thread. #(do (Thread/sleep 1) (f)))))] (f))
21:25clojurebotnil
21:26itistoday,(letfn [(f [] (.start (Thread. #(do (f)))))] (f))
21:26clojurebotnil
21:26itistodayclojurebot: you should be dead
21:26clojurebotI don't understand.
21:28itistodaymust be the compiler
21:30itistoday,(letfn [(f [] (.start (Thread. #(dotimes [_ 100] (Thread/sleep 100) (println "foo") (f)))))] (f))
21:30clojurebotnil
21:30itistoday,(letfn [(f [] (.start (Thread. #(dotimes [_ 10000] (Thread/sleep 10) (println "foo") (f)))))] (f))
21:30clojurebotnil
21:30qbgWhy try to kill clojurebot?
21:31itistodayfun?
21:31clojurebothttp://jackcoughonsoftware.blogspot.com/2009/05/teaching-functional-programming-to-kids.html
21:31itistodayi mean, big props to hiredman, this guy is tough
21:31qbgAt least try a fork bomb with threads
21:31itistodayi don't remember how to fork in java....
21:32itistodaythat's essentially what i'm doing though
21:32itistodaywith threads
21:32itistodayis it not?
21:32itistoday,(letfn [(f [] (.start (Thread. #(dotimes [_ 1e9] (println "foo") (f)))))] (f))
21:32clojurebotnil
21:32itistodaythat should kill him
21:34cais2002itistoday, I guess the bot starts a new thread or process to run ur command or run it in some way that does not break the main process
21:34qbg,(delay (println "Foo"))
21:34clojurebotFoo #<Delay@163a5f9: nil>
21:34itistodayyeah this would be easier if i looked at its source :-p
21:35qbg,(delay (dotimes [_ 100] (print "-")))
21:35clojurebot----------------------------------------------------------------------------------------------------#<Delay@1d7c125: nil>
21:35qbg,*out*
21:35clojurebot#<StringWriter >
21:36itistodaywhy does that print a bunch of -'s?
21:37itistodayi thought it doesn't execute the body unless forced
21:37qbgBecause printing it forces it
21:37itistodayi don't understand, the print is inside the delay
21:37itistodaywhy is it evaluated?
21:38qbg(by it I refer to the return value)
21:38itistodayoh, you mean because it's a repl?
21:38itistodayyeah i think that's it
21:38itistoday(def x (delay (dotimes [_ 100] (print "-"))))
21:38itistodaydoesn't print anything
21:38qbgForcing delays to print them is a bit dubious
21:39qbgitistoday: That is because def doesn't return the delay
21:39qbgSo the repl won't be printing it
21:39itistodayright, def returns a var, correct?
21:39qbgCorrect
21:40itistodayk, cool
21:40qbgDebugging your lazy functional languages that uses delays as thunks is a bit tedious
21:40qbg*language
21:41cemerickdelays aren't thunks
21:41qbgThey do what I want, though
21:43cemerickwell, ok, but they're not thunks. You could easily write an IDeref implementation that works like a delay but doesn't print its value.
21:43qbgTrue
21:44itistodaycemerick: my vocab is shaky here, what's the difference between a thunk and a delay?
21:47itistodayclojurebot is gone :-D
21:47itistoday,(+ 1 1)
21:47itistodaydid someone take him down or did I succeed in killing him?
21:48itistodayhiredman: ?
21:49cemerickitistoday: hrm, looks like it's not so clear, at least as far as wikipedia is concerned. I've always understood thunks to be invokable, whereas delays require a special force operation.
21:50itistodaycemerick: i'd say that makes delays invokable via force? eh?
21:51itistodaysexpbot: help
21:51sexpbotitistoday: I can't help you, I'm afraid. You can only help yourself.
21:51cemerickBy invokable, I mean usable in function position, e.g. (some-delay)
21:51cemerick(which they used to be capable of, before 1.1)
21:52itistodayyeah i think the concept of thunks (from what i read on wikipedia) applies to the idea of delays though (if you ignore the lack of needing a function)
21:52itistodaythat was actually a question
21:52itistodaystated for some reason a statement
21:52itistoday!(+ 1 1)
21:53itistodaywhat's the syntax for sexpbot's eval?
21:53qbg$(+ 1 1)
21:53sexpbot=> 2
21:53itistodayah, k
21:53itistodaywe still have one bot that works
21:53itistodayalthough i'm tempted to bring this one down too... i'll restrain myself though
21:53itistodayif clojurebot comes back online though, sexpbot ... watch out
21:53cheluis(+ 1 1)
21:54qbg$(not= 'clojurebot 'kenny)
21:54sexpbot=> true
21:54itistodaylol
21:55fbru02hey guys , I'm doing a presentation in front of a group of rubysts , and I have a question, when is a good idean in clojure to unit test your code?
21:57itistodayfbru02: idean? you mean idea?
21:57fbru02itistoday: yes
21:57itistodayisn't that more of a general question? not really clojure related?
21:58qbgI guess it depends on how you feel about unit testing
21:58fbru02i como from a haskell background and we did more of quickcheck
21:59fbru02come
21:59itistodayfbru02: 'quickcheck'?
22:02fbru02itistoday: http://kotka.de/blog/2010/06/ClojureCheck_is_back.html
22:04itistodayfbru02: ah, cool, gotcha
22:05cheluishey, I was wonder if anybody here can help me... I an learning clojure, and so far, I like it very much, but I dont have any lisp background. Which is the best way to iterate over the chars of a string?
22:05qbgIterate how?
22:06itistodaycheluis: i'd do performance testing you .charAt() vs. sequences
22:06itistodays/you/with
22:06itistodays/you/with/
22:06sexpbots/with/with
22:06qbg,(reduce #(+ %1 (int %2)) 0 "Hello, world!")
22:06itistodayqbg: i kill him, remember?
22:06itistoday$(reduce #(+ %1 (int %2)) 0 "Hello, world!")
22:06sexpbot=> 1161
22:06qbg$(reduce #(+ %1 (int %2)) 0 "Hello, world!")
22:06sexpbot=> 1161
22:07itistodayhehe
22:07cheluisie... given a string "hello" return "hlo"
22:07itistoday... substring?
22:08cheluisuh?
22:08itistodaythat's a very weird thing to want to do
22:08itistodaywhat exactly are you trying to do?
22:09itistodayis your goal to eliminate 'el'?
22:09itistodayor the 2nd and 3rd characters?
22:09qbg$(apply str (take-nth 2 "hello"))
22:09sexpbot=> "hlo"
22:09cheluisthat!
22:09itistoday:-)
22:09cheluisthanks
22:09cheluisI'm practicing with codingbat.com exercises... Implementing those exercise but in clojure
22:10cheluisit's a very very newb way of learning but well...
22:10cheluisat least its one
22:10cheluislemme try that
22:15itistoday$(java.net.InetAddress/getLocalHost)
22:15sexpbotjava.lang.SecurityException: Code did not pass sandbox guidelines: ()
22:18cheluishey thanks... =)
22:21itistoday$(-> "http://www.apple.com&quot; java.net.URL. .openStream java.io.InputStreamReader. java.io.BufferedReader. .readLine)
22:21sexpbotjava.lang.SecurityException: Code did not pass sandbox guidelines: ()
22:21itistodaysexpbot: :-\
22:21sexpbotCommand not found. No entiendo lo que estás diciendo.
22:22gstamp$(keep identity [1 2 nil 3])
22:22sexpbotjava.lang.SecurityException: Code did not pass sandbox guidelines: (#'clojure.core/keep)
22:22gstamphrrm
22:22itistoday$(+ 1 1)
22:22sexpbot=> 2
22:25rbergerOpscode cookbook for leiningen at http://cookbooks.opscode.com/cookbooks/leiningenfor what its worth. Just does the basic install via Opscode Chef
22:26qbgOT question: How do you unit test complex functions?
22:26rbergerhttp://cookbooks.opscode.com/cookbooks/leiningen
22:36arohnerqbg: by making them simple functions
22:36arohnerqbg: sorry to be snarky, but that's my preferred way
22:36arohner(making simple functions, not being snarky)
22:36qbgarohner: By complex I mean that it takes or produces complex input/output
22:37arohnerqbg: side effects, or complex datastructures as input/output?
22:37qbgdata structures
22:37itistoday$(.start (Thread. #(println "foo")))
22:37sexpbotjava.lang.SecurityException: Code did not pass sandbox guidelines: ()
22:38itistodayoh... great. sexpbot is impenetrable.
22:38qbgor just complex data
22:38arohnerqbg: I've been looking for a library to do complex validations. I haven't seen anything thats better than the standard clojure functions
22:38arohner(map #(assert foo) vals)
22:38arohnerit makes me wonder wether such a thing is possible
22:39qbgRelevant: http://blog.objectmentor.com/articles/2010/06/03/tdd-in-clojure
22:41qbgThat article leaves me unsatisfied
22:41arohnerqbg: yeah, and I don't find that final test particularly useful
22:43qbgHalf of the reason why I test almost nothing is because I can't see how to test it
22:43qbgUnit test, that is
22:52itistoday$(send-off (agent {:x *out*}) (fn [x] (println "foo!!")))
22:52sexpbotjava.lang.SecurityException: Code did not pass sandbox guidelines: (#'clojure.core/send-off #'clojure.core/agent)
22:53itistodayyeah
22:57itistoday$@(future (+ 1 1))
22:57sexpbotCommand not found. No entiendo lo que estás diciendo.
22:57itistoday$(deref (future (+ 1 1)))
22:57sexpbotjava.lang.SecurityException: Code did not pass sandbox guidelines: (#'clojure.core/future-call)
23:35cais2002what's the difference btw (defn ^String foo [] 'foo) and (defn #^String foo [] 'foo)
23:42ysphcais2002: i believe the meta macro has been shortened to ^ in 1.2, but i'm not positive
23:43ysph"The ^ reader macro has been deprecated as a shortcut for meta in the hopes that it can eventually replace the #^ reader macro."
23:43ysph
23:43cais2002is ^type-name the way to do type hint for clojure defined types?
23:44ysphthat should work for 1.2, yes
23:45cais2002ysph: r u saying that it's deprecated but still supported in 1.2?
23:46ysphno, it is deprecated as a shortcut for meta, so that it may become the reader macro instead
23:46ysphthe way that is worded is confusing
23:53cais2002ah, i c. so we are encouraged to use (meta xxx) for meta and keep ^ for the old #^ ?
23:53itistodaycais2002: yes