#clojure log - Jul 06 2010

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

0:00 cais2002: there is ubuntu in my computer and the deployment is ubuntu, too.. just that win is still my main platform for other daily activities and I some time seem to like to torture myself just to test the true protability of java..

0:02 Blackfoot: cais2002: ctrl+u kills to the beginning of a line, again not sure if it works in windows though

0:03 itistoday: Blackfoot: didn't know that, thanks for mentioning it

0:04 technomancy: ctrl-u is the prefix arg; it's not actually a command.

0:04 itistoday: technomancy: that's in emacs though

0:04 cais2002: Blackfoot, neither.. anyway, I decide to do ENTER + ^Z + ENTER to clear a partial line..

0:04 itistoday: this is for the terminal

0:04 technomancy: oh, duh.

0:05 cais2002: but thanks for the ^u tip..

0:05 technomancy: like an rlwrap thing, then?

0:05 itistoday: technomancy: yeah

0:05 technomancy: btw, i think i figured out what with-local-vars is for

0:05 technomancy: so with (binding [a b] .. ) you can use set! to set a

0:06 but you can't do that if 'a' isn't defined beforehand as a var

0:06 so if you want to perform local mutable setting

0:06 you'd use with-local-vars if you weren't manipulating an existing var

0:07 technomancy: oh sure... that would be another difference between the two

0:07 still not sure if there's any good reason to set locals to begin with though

0:08 itistoday: why not?

0:08 it could be useful for performance

0:08 technomancy: theoretically possible, but I think transients probably cover that better

0:09 itistoday: yeah i see it exactly in the domain of transients, but those can only be used on collections

0:09 i'm guessing though that with recur/loop/reduce it's probably a rare situation where you'd need with-local-vars though

0:10 technomancy: right, but if it happens over and over again (enough to make a difference for perf), it is probably going to involve a collection.

0:11 itistoday: indeed... i'm glad though that it's there as an option, albeit unlikely ever to be necessary

0:11 (and to know what it's for)

0:17 Blackfoot: is there an opposite of (dissoc) that only keeps the given keys

0:18 tomoj: not quite

0:18 but there's select-keys

0:18 ,(select-keys {:foo 3 :bar 4 :baz 5} [:foo :baz])

0:18 clojurebot: {:baz 5, :foo 3}

0:19 Blackfoot: yes that is perfect thanks

0:19 arohner: in a maven multi-module project, is there a magic command to bump all of the version numbers?

0:20 itistoday: arohner: if no one answers here there's also a #maven channel

0:20 arohner: itistoday: oh right, thanks

0:20 tomoj: maybe maven-release-plugin has something?

0:21 oh it says you will be prompted for the version number for each module

0:21 unless submodules always have the same version as the parent

0:21 http://maven.apache.org/plugins/maven-release-plugin/examples/prepare-release.html

0:25 arohner: tomoj: thanks

0:26 Bahman: Hi all!

0:29 arohner: Bahman: hi

0:40 itistoday: what are some functions for finding a symbol in a list?

0:40 (its index, or replacing it with another symbol)

0:41 tomoj: ,(replace '{bar baz} '(foo bar))

0:41 clojurebot: (foo baz)

0:42 itistoday: tomoj: thanks, any others like it? perhaps something in contrib?

0:43 technomancy: itistoday: there's (some #{2} [1 2 3])

0:44 itistoday: what about pattern matching type stuff?

0:44 technomancy: (one of the few places Clojure inherits from CL's heritage of poor naming to its detriment)

1:07 Bahman: Are there any MongoDB connectors other than CongoMongo?

1:07 Last activity in CongoMongo dates back to Feb. Wondering if it's sort of inactive?

1:11 mudge: chouser: awesome, thanks, and thanks

1:12 itistoday, I don't get it, what is ICH BIN EIN NERD ?

1:13 itistoday: mudge: see the 2nd youtube link, it has more context: http://www.youtube.com/watch?v=3C4PqyH6Ga4

1:13 just a quote from a show

1:13 a funny basterdization of the kennedy speech in berlin

1:13 gotta run (literally)

1:15 mudge: okay, it is funny

1:17 Bahman: Sorry got DC. Any ideas regarding the MongoDB question?

1:32 mudge: hey, what's your guy's favorite clojure book?

1:34 Raynes: The Joy of Clojure is awesome.

1:35 mudge: cool, what makes it awesome?

1:37 Raynes: It's very detailed, for one. The book teaches me things I need to know that aren't even directly related to Clojure, such as with the brief introduction to big o notation.

1:38 mudge: cool

1:41 SandGorgon: hi guys.. first time clojure user here. I'm starting out with bcarper's cown-blog (http://github.com/briancarper/cow-blog) . I dont understand the meaning of "Look at (and run) blog.db.postgres.clj/init-db-postgres to create the tables in your database." how do I run that method ?

1:44 fuchsd: Is there a good discussion somewhere of when to use def vs when to use let?

1:55 vu3rdd: Raynes: hope you got a link to the pdf

1:55 Raynes: vu3rdd: I gave up. I can't figure out what email I signed up with to get into the account section.

1:55 :p

1:55 I'll work on it later.

1:56 vu3rdd: Raynes: Oh.. ok.

2:32 SandGorgon: why does leiningen need to pull in JARS from clojars ? why cant it pull clojure source code and put in the appropriate location in my file structure. Bundling clj libraries as jars makes sense if you have a non-free libary, but for most of the stuff out there, it should be pure clojure all the way down

2:33 I can also understand it for deployment - not for development

2:35 tomoj: clojure's source code is in the jars..

2:36 exploding the jar and dropping core.clj and friends into your project would be crazy

2:36 and anyway much of clojure is java

2:42 SandGorgon: tomoj, why would it be crazy ? most of ruby gems are exploded as ruby code .. would it not be very helpful if you are debugging or so ?

2:44 Raynes: It's cleaner to keep them packaged as jars. The source code is in there, so why pull it out and clutter everything up?

2:44 I don't see how it would be helpful for debugging.

2:46 SandGorgon: Raynes, I understand what you mean, but it could simply be stored as separate directories in the "lib" subdirectory of a project - just like each jar dependency is a separate file. it would be no more cluttered that it already is.

2:46 Raynes: But *why* would you want this?

2:47 tomoj: it wouldn't be helpful at all to me for debugging

2:47 SandGorgon: Raynes, the issue is if you figure out that you need to bugfix one of the dependency you are using - it would be easier if all of them were in clj format .. we have had issues where we saw we could simply modify our GEM dependencies and get on with life

2:48 tomoj: that doesn't work

2:48 SandGorgon: deployment ,of course, would be as a jar

2:48 tomoj: unless you store all your dependencies in your source repo

2:48 Raynes: That would kill the point of dependency management.

2:51 SandGorgon: tomoj, i'm not sure i understand... lein pulls in all dependencies in your CURRENT project directory. another similar project - liebke/cljr pulls in dependencies in a shared folder in your home directory. That would mean you no longer store your dependencies in your source repo. Besides I'm not asking for storing dependencies in the repo... just that they be be pulledin and managed as source

2:52 note that my thought is only for those jars that are written as clojure .. not java-written jars

2:58 Chousuke: SandGorgon: handling source would require a lot of code I think

3:00 though if there's a maven plugin, maybe not.

3:00 zmila: i don't want to bother with source code of the libs i use. just have jars.

3:04 bortreb: if you change the source code for a library you use, then you no longer depend on that library -- you depend on your own special version of that library. That source should then be kept under your own version control, etc, and would not rightly be part of a dependency manager like leinengen.

3:05 so while there's nothing stopping you from exploding a jar and dealing with the source in that way, why should it be an option for leinengen?

3:13 tomoj: SandGorgon: so you want leiningen to download the source files for clojure exploded into some directory and have multiple individual projects refer to this source?

3:16 SandGorgon: tomoj, I am not really focusing on single vs multiple directories - just that having clj source zipped up and calling it a JAR file seems to be hold-up of the J2EE era. I just really hope that if my project has a dependency which a clojure project, then it is pulled in, used and maintained as such. that's all

3:17 tomoj: it basically is

3:17 the jars lein creates have their project.cljs for instance

3:18 why does it matter whether it's stored on disk in a jar or exploded?

3:18 as it happens the jar format is incredibly convenient

3:23 it is practically convenient to respect our host :)

3:27 cais2002: ,(defn f [x] x+1)

3:27 clojurebot: DENIED

3:27 cais2002: ,(def f 1)

3:27 clojurebot: DENIED

3:27 replaca: cais2002: clojurebot doesn't allow def

3:28 mudge: why not

3:28 cais2002: yeah, seems so

3:28 any idea who wrote clojurebot?

3:28 replaca: cais2002: hiredman

3:29 mudge: it's a secure sandbox

3:29 cais2002: is it an ad-hoc sandbox or something built-in from clj?

3:30 Raynes: mudge: If you def things, those things are kept in memory. Eventually, you run out of memory.

3:30 mudge: neat

3:30 replaca: cais2002: he found some java sandbox code somewhere and adapted/wrapped it.

3:31 mudge: replaca: why not just give clojurebot a memory limit? so then it can def things without taking too much memory

3:31 cais2002: nice

3:31 Raynes: mudge: Because it isn't that simple.

3:31 cais2002: http://github.com/hiredman/clojurebot/blob/master/src/hiredman/sandbox.clj

3:31 replaca: mudge: question for hiredman. I haven't thought about the ramifications of def.

3:32 mudge: okay

3:32 Raynes: sexpbot is another bot (mine) that does sandboxed Clojure evaluation. It uses clj-sandbox, Licenser's more generalized Clojure sandboxing library.

3:32 $google clj-sandbox

3:32 sexpbot: First out of 133 results is: Licenser's clj-sandbox at master - GitHub

3:32 Licenser: Someone said my name?

3:32 sexpbot: http://github.com/Licenser/clj-sandbox

3:32 replaca: mudge: but it's java. It already has a memory limit.

3:33 Licenser: Java has no simple way to limit memory aside from for the entire process

3:33 Raynes: On Licenser and I's http://try-clojure.org site, we use clj-sandbox like sexpbot does. Licenser added some hackery to allow def, so you might want to ask him about that stuff.

3:35 cais2002: Raynes, thanks for the info

3:36 Licenser: mudge: to explain, yes it would be possible to give the bots a meory limit, and both have. But this would only protect the server behind the bot not the bot itself. It would still be possible to make it un responsive by filling it's memory

3:36 mudge: yea

3:36 Licenser: and neither java nor clojure give you a real way to calculate memory usage

3:36 mudge: hmmm

3:37 Licenser: mudge: if I am wrong please please tell me how it works :P but sadly I'm rarely wrong

3:37 mudge: well that's good

3:37 maybe clojurebot could automatically be restarted every once in awhile

3:37 Raynes: That would be tedious and not worth the effort for both bots.

3:38 It still wouldn't solve the problem.

3:38 Licenser: mudge: no good solution

3:38 Raynes: You'd have to restart every 30 seconds, :p

3:38 Licenser: and that would anihilate the gain of having def since after a restart itd be gone anyway ;)

3:38 mudge: but having the bot being able to def things is such awesome capability for a bot, maybe give a little or put some effort into a solution

3:39 Raynes: I don't think it's important.

3:39 You can always use let or letfn.

3:39 mudge: sure, its not important, just fun

3:42 oh yea, let is good stuff

3:49 cais2002: ,(eval '(+ 1 2))

3:49 clojurebot: DENIED

3:51 Lajla: ,(+)

3:51 clojurebot: 0

3:51 Lajla: ,car

3:51 clojurebot: java.lang.Exception: Unable to resolve symbol: car in this context

3:51 Lajla: ,(car 1)

3:51 clojurebot: java.lang.Exception: Unable to resolve symbol: car in this context

3:51 Lajla: No volkswagens?

3:51 $(car 1)

3:51 sexpbot: java.lang.Exception: Unable to resolve symbol: car in this context

3:52 _2x2l: theres no car or cdr in clojure

3:52 use first, rest

3:52 mudge: , (+ 5 6)

3:52 clojurebot: 11

3:52 mudge: that was fun

4:11 LauJensen: Morning guys

4:13 Bahman: Hello LauJensen!

4:13 mudge: morning!

4:18 esj: Morning gentlemen.

4:18 mudge: morning esj

4:18 (morning clojurebot)

4:19 ,(morning clojurebot)

4:19 clojurebot: java.lang.Exception: Unable to resolve symbol: morning in this context

4:19 mudge: hmm... that should be rectified

4:21 esj: ,morning

4:21 clojurebot: java.lang.Exception: Unable to resolve symbol: morning in this context

4:21 esj: $morning

4:21 sexpbot: Command not found. No entiendo lo que estás diciendo.

4:22 esj: Raynes: feel like teaching your bot some manners :P

4:23 zmila: (def morning :morning)

4:23 ,(def morning :morning)

4:23 clojurebot: DENIED

4:23 esj: now its just being rude !

4:31 Raynes: esj: He's a sexpbot, not a mannerbot. ;p

4:31 esj: in my day, manners were very sexp

4:31 Raynes: Get on my lawn.

4:31 esj: kidbots these days

4:32 Raynes: Adultbots just don't understna.d

4:32 understand.*

4:33 mudge: haha

4:35 I wonder how big the clojure community is compared to the ruby community and the python community and the haskell community and the java community

4:35 clojure is the smallest, right?

4:35 Raynes: Good question. I'd guess much smaller than all of those due primarily to age.

4:35 mudge: yea

4:36 Raynes: It would be nice to see real numbers, but I can't think I of a good way to measure anything like that.

4:36 mudge: i love that clojure is a way for java programmers to get into lisp and functional programming and get it into work

4:37 i'd love to hear stories about how employees started using clojure in their work projects, and how they managed to do that and such

4:37 maybe i'll post a question on stackoverflow asking if anyone has any such interesting experience

4:38 or maybe hacker news would be a better place to ask such a question

4:39 Raynes: Probably.

4:39 Or the Clojure mailing list.

4:39 mudge: yea

4:39 maybe both?

4:39 Raynes: You could post the question on the mailing list than hackernewsify it.

4:39 mudge: yea!, was just thinking that

4:39 i think I'll do that

4:39 Raynes: :)

4:47 bortreb: ]

4:53 mudge: submitted, it will take a little while for the post to the mailing list to show up

4:53 entitled: Getting Clojure into the workplace, how do you do it?

8:47 * Raynes hopes http://www.assembla.com/spaces/clojure/tickets/315-add-support-for-running--main-namespace-from-clojure-main-without-aot gets merged in for Clojure 1.2 gets merged before 1.2

11:05 pedroteixeira: anyone knows if it's possible to generate a class with a type in the field, using defrecord?

11:05 (defrecord A [^String name]) (.getField A "name")

11:05 ,(defrecord A [^String name]) (.getField A "name")

11:05 clojurebot: DENIED

11:06 pedroteixeira: it seems all fields are generated as Object

11:18 arohner: pedroteixeira: that's not supported yet

11:19 pedroteixeira: it may come in a future release

11:20 pedroteixeira: arohner: ok, thanks. is there any way to read metadata from the record fields?

11:21 arohner: I don't think the fields themselves can contain metadata, but the record can, and the field values can

11:21 pedroteixeira: arohner: alright. will give it a try!

12:24 Licenser: :)

12:50 dsop: I wonder if it makes sense to propose an clojure interface for java's MessageDigest like this http://github.com/dsp/clojure-contrib/blob/master/src/main/clojure/clojure/contrib/crypto/digest.clj for contrib?

15:46 neotyk: Hi, is there something like suspend/resume sequence?

15:46 AWizzArd: neotyk: what would those fns do?

15:46 neotyk: something like: (get-when-ready seq callback)

15:46 AWizzArd: What would get-when-ready do?

15:47 Is [1 2 3 4 5] ready?

15:47 neotyk: so you register a callback that is triggered when there are more elements in seq

15:47 [1 2 3 4 5] is always ready

15:47 AWizzArd: You could think about using watchers.

15:47 seq seems to be a mutable object, maybe an atom or a ref. To those you can add watchers.

15:48 (find-doc "watch")

15:48 neotyk: ,(doc watch)

15:48 clojurebot: Pardon?

15:48 AWizzArd: Try find-doc.

15:48 In your repl.

15:48 neotyk: ,(find-doc "watch")

15:48 clojurebot: ------------------------- clojure.core/add-watch ([reference key fn]) Alpha - subject to change. Adds a watch function to an agent/atom/var/ref reference. The watch fn must be a fn of 4 args: a key, the reference, its old-state, its new-state. Whenever the reference's state might have been changed, any registered watches will have their functions called. The watch fn will be called synchronously, on the agent's thread if a

15:49 * neotyk mmkey, in my repl

15:49 neotyk: AWizzArd: that should be able to do the job

15:50 thanks, AWizzArd +1

15:50 AWizzArd: From what you said so far it looks very much like the thing you want.

15:51 neotyk: I want to be able to provide something like that for body of POST/PUT

15:52 so you can "deliver" values later

15:52 though promise is kind of one time thing

15:53 and prefer not to limit user imagination

15:55 vibrant: hello

16:01 is there any alternative to (doall that simply returns a lazy seq?

16:02 arohner: vibrant: the point of doall is to realize the items of a lazy seq. What would a doall that returns a lazy seq do?

16:03 neotyk: for?

16:03 clojurebot: for is not a loop

16:06 vibrant: neotyk; that's it, thanks.

16:06 and now i want to make a map from the result :)

16:13 AWizzArd: vibrant: perhaps you want to begin right away with reduce?

16:13 vibrant: AwizzArd; that's what I did in the meantime, thanks.

16:13 AWizzArd: k

16:54 amatos: I am doing a fairly large Swing application with Clojure. Because I have lots of modal dialogs, I need to have a reference to the main JFrame in most of my functions. Now I don't want to have to pass it around to every function, so I thought of making it global (with def), but that doesn't play well with gen-class right?

16:55 Because if I have gen-class in my namespace, and then a def, that def is visible at compile time, but not during run time when I run my main-

16:55 is this right?

16:56 arohner: amatos: no, the def will still be visible

16:56 amatos: ah ok

16:56 So is this what usually people do with swing applications?

16:58 arohner: amatos: I haven't done much with swing, but if you're going to create the value once, a def would work

16:58 amatos: ok

16:58 arohner: amatos: otherwise you can make a ref that contains the JFrame, and refer to it from a def, or the state on the gen-class

16:58 amatos: I am using the maven clojure plugin, and I have the impression the defs are evaluated when compiling the class

17:00 and that evaluation actually screws things a little bit, because I end up having side effects when compiling (like files being generated and so on) caused by the code inside those defs. It is not a big deal, but doesn't sound very clean to me

17:01 A ref might be a better idea then, since i can set it up inside main-.

17:02 arohner: amatos: do you have side effects at the top level, outside of a function body?

17:02 amatos: yes

17:02 arohner: amatos: that would cause things to happen at compile time

17:02 amatos: because my defs call constructors that then generate files and stuff

17:03 Nothing much I can do about it , because that is the way the Java API I am using is set up

17:03 So a ref might be a better idea

17:06 Actually, what about atoms? I could set them inside my main-, and then refer to them in my other functions. And then I wouldn't need any transactional stuff

17:06 would that work?

17:08 tomoj: it seems like a var would work fine

17:08 arohner: amatos: yes, that would work fine

17:09 amatos: so, sorry for my ignorance, but what happens if I do def inside my main-? And how is that different from doing def at the namespace level?

17:09 is that a var?

17:09 arohner: tomoj: what about the side effects at compile time?

17:09 amatos: yes, def creates vars

17:09 amatos: are those defs thread-local?

17:09 arohner: amatos: and it's possible, but "icky". re-defing is basically allowed only to make development easier

17:09 amatos: ah ok

17:10 arohner: amatos: no, they're normal, full fledged vars

17:10 amatos: hum...

17:10 yes, doesn't sound that clean as well.

17:11 So might be better to use an atom where I declare them to be nil at the top level, and then reset! them inside the main- function. That sounds somewhat better (although not much cleaner)

17:13 at least it is clear in the code that the values might change (although they change only once)

17:13 arohner: alter-var-root is another option

17:15 amatos: ok

17:15 tomoj: like (alter-var-root foo (constantly bar)) ? :/

17:15 amatos: :)

17:16 tomoj: a var and binding in -main would work, but that's probably "icky" as well?

17:16 amatos: Well, it seems of whatever solution I use, it is always going to be a bit icky

17:17 I am trying to understand why does the clojure compiler even bothers to evaluate the toplevel expressions inside that namespace, if the namespace is marked with gen-class, so only meant to be used for compilation?

17:18 tomoj: I suppose you can't move them out of toplevel eh

17:19 amatos: I can add them inside main-, but other functions need to refer to them. I guess that should work as long as I only call these functions after the defs inside main-

17:19 If I understood correctly, it doesn't make much difference if I do def at the toplevel or inside main-. They are still global within that namespace

17:20 arohner: amatos: right

17:20 tomoj: what I meant is, do you really need a var at all? :)

17:20 well clearly you don't really need one, but the question is whether the code would be uglier without them, I guess

17:21 amatos: Well, I am trying to avoid having functions with 6 or 7 parameters, where most of them don't actually change

17:21 tomoj: yeah :)

17:21 amatos: For most swing stuff, I need to pass the main window, I also have a configuration object that needs to be passed around, I use myDoggy so I need to pass a content manager around, and so on

17:22 most functions will require those 3, and their references don't change.

17:25 Well, I will think a little bit more about it. I am tempted to use atoms, defined to be nil at the toplevel, and then reset! inside main-. That seems to be the cleanest solution so far.

17:26 thanks everyone for the help

18:15 arkh: for vectors, are 'get' and 'nth' the same except nth can optionally throw an exception?

18:23 nvm - I should get in the habit of looking at the source

18:27 ninjudd: chouser: is clojure.java.shell/sh supposed to println the opts?

18:30 pedroteixeira: when using clojure.test, I get weird behaviour regarding java classes. e.g: (testing (do (defrecord R []) (new R) )) does not work.

18:31 removing the body from the testing function, the code works..

18:31 is this a bug in how things are getting resolved inside the testing macro?

18:53 tomoj: grrr

18:54 `mvn clojure:swank` seems to freeze all the resources

18:54 whether you change them in src/main/resources or in target (the latter would already be pretty inconvenient...), you don't see the updates

19:03 arohner: has anyone used the visualvm memory profiler, and got anything approaching realistic results?

19:04 my app is taking ~1GB, and the memory profiler only lists ~5MB in objects

19:13 chouser: ninjudd: no, it's not

19:13 there's already a patch to remove that, it just needs to be applied.

19:13 and perhaps reviewed. which perhaps I should do. :-/

19:14 ninjudd: chouser: ok, just making sure. i noticed it a while back, and figured it would go away eventually

20:15 lancepantz: i have a lazy sequence, that i'm iterating through and calling a function on only to see if an exception is thrown, how do i decide between dorun and doseq?

20:15 http://gist.github.com/466120

20:15 (it's a sql ResultSet)

20:18 pers: Hello all. I'm starting out with clojure and have a lot of experience with CL. I'm having some trouble writing clojure code. In finding the clojure way.

20:19 (when (or (= foo :asd) (= foo :qwe)) ...) works find in clojure but I would prefer somthing like CL's (when (member foo '(:asd :qwe)) ...). What is the proper way to do this type of check in clojure? Thank you.

20:20 s/fine/find/

20:21 tomoj: (when (#{:asd :qwe} foo) ...)

20:21 pers: thank you!

20:21 tomoj: ,(#{:asd :qwe} :qwe)

20:21 clojurebot: :qwe

20:22 tomoj: ,(#{:asd :qwe} :rty)

20:22 clojurebot: nil

20:43 mudgen: hello

20:43 hope everyone had a good clojurisc day.

20:46 pedroteixeira: any quick way to convert clojure map to java hashmap, and convert all keys as keyword to key as string? :)

20:52 found it: stringify-keys

21:44 cais2002: good morning guys, any idea what's the cause of this problem: Exception in thread "main" twitter.proxy$java.lang.Exception$0: . [] (NO_SOURCE_FILE:0)

21:55 qbg: cais2002: I think you would need to look at the stacktrace

21:58 cais2002: how do I get more info about the exception in repl?

21:59 qbg: The last exception is bound to *e

21:59 To print its stacktrace, do (.printStackTrace *e)

22:01 cais2002: ah, good, just saw that in the api.. let me try it out

22:21 jkkramer: is there a way to directly refer to enum names that are within a java class?

22:46 rhudson: jkkramer: The usual Class/FIELD syntax works

22:47 jkkramer: rhudson: i can't seem to get it to work

22:48 rhudson: i'm looking specifically at http://code.google.com/p/google-diff-match-patch/source/browse/trunk/java/name/fraser/neil/plaintext/diff_match_patch.java#123

22:49 rhudson: So Operation/INSERT

22:50 jkkramer: "no such namespace Operation"

22:51 rhudson: try name.fraser.neil.plaintext.diff_match_patch.Operation/INSERT

22:52 Sorry, without the diff_match_patch

22:53 sorry again, with it. (having trouble seeing the nesting)

22:53 jkkramer: class not found still. i know diff_match_patch is imported; i can instantiate the class and call its methods

22:54 rhudson: If it's imported, then diff_match_path.Operation/INSERT should work

22:54 jkkramer: it doesn't

22:55 i can use .name and check enum values string-wise, but that seemed roundabout

22:55 rhudson: You might have to (import '[name.fraser.neil.plaintext.diff_match_patch Operation])

23:00 jkkramer: (import 'name.fraser.neil.plaintext.diff_match_patch$Operation) is the magic invocation

23:00 rhudson: thanks for your help

23:00 rhudson: ah

Logging service provided by n01se.net