#clojure logs

2015-08-19

00:00justin_smithof course the full string was too long
00:00TEttinger,(count (->>[[8592 8703][9027 9032][9036 9037][9039 9040][9043 9044][9046 9047][9166][9650][9654][9660][9664][9735 9736][10132][10136 10159][10161 10174][10224 10239][10496 10538][10541 10569][10578 10619][11008 11025]](mapcat #(apply(fn([x][x])([x y](range x (inc y))))%))(map char)(apply str)))
00:00clojurebot320
00:01TEttinger320 unicode chars, yep
00:01TEttinger(char 10160)
00:01TEttinger,(char 10159)
00:01clojurebot\➯
00:01TEttinger,(char 10160)
00:01clojurebot\➰
00:02TEttingerjustin_smith: what criteria did you use to get the arrows?
00:02TEttingerthe big page of links?
00:03justin_smith,(def ddr(fn[](->>[[8592 8703][9027 9032][9036 9037][9039 9040][9043 9044][9046 9047][9166][9650][9654][9660][9664][9735 9736][10132][10136 10159][10161 10174][10224 10239][10496 10538][10541 10569][10578 10619][11008 11025]](mapcat #(apply(fn([x][x])([x y](range x(inc y))))%))(map(comp symbol str char))rand-nth)))
00:03clojurebot#'sandbox/ddr
00:03justin_smithwoo~ it fits
00:03justin_smith,(ddr)
00:03clojurebot
00:03justin_smith,(ddr)
00:03clojurebot
00:03justin_smithTEttinger: yeah, I just grabbed all "arrows" from that big page of links
00:04justin_smith,(apply str (repeatedly 1000 ddr))
00:04clojurebot"⤳⇍⬅⍖↣⤊⇆⇪➽⇸⥖➱↬↑⥃⥕→↱⬅⇌⥙⍇⤛⟶⇞⟹➲↩↪↰⇩➵⥭↝↮⟺↿⤮⬏←⥀⥹⤎⤁➬↼⥃⤴⥫➯➨⤳↽⤎⤭↧⥧⤏⥀↓⇬⥲⥈⤼⇈⇣⤿⟵↢⤅⇳⬅⇚⤖⥘⇏⍌↔⟷⬂⤍⥦⥅⤃⟷↿⤖↛⬍⇏↢⇩⥮⇣⥉⤄⬀↶↲⬆⍖⍔↿↶⤖◀⤗⥰⍈⤕⇔⥇➲⇂⤇⇁⥛▶➹↕↘⬐⍃⬀⤈⇡⥛⤻⍅⤲⇥⤙➽⥒↿⥓➡⇑▲↩➱⟵⇹⇞↗�
00:06hfaafbvery nice
00:07Bronsaplease stop
00:21TEttingerBronsa: is there an off-topic channel to use?
00:23BronsaTEttinger dunno
00:24BronsaTEttinger I don't actually mind off-topic discussions, sorry if that was what you understood
00:25BronsaTEttinger I was just getting my client filled with annoying escaped chars :)
00:25justin_smithoh yeah, the downside of utf8
00:30TEttingerjustin_smith: got the defn down to 147 chars
00:30TEttingerI've been golfing
00:30justin_smithmaybe refheap is a better place to share this
00:30TEttinger~pastebin
00:30clojurebotpastebin how about refheap? https://www.refheap.com/
00:32TEttingerhttps://www.refheap.com/108464
00:34justin_smithTEttinger: is (range(int x)(int y)) a bug?
00:34justin_smithor did you already inc the high end?
00:34TEttingerit's converting them to chars
00:34TEttingerand yes I already inced
00:34justin_smithahh, right
00:34justin_smithsaves some chars
00:34TEttingererr
00:34TEttingerwait
00:34TEttingermaybe not...
00:34justin_smithyeah I suspected...
00:35justin_smithbecause otherwise we would see a bunch of non-arrows in that string
00:36TEttingergood catch https://www.refheap.com/108465
00:37justin_smithTEttinger: it's even more cryptic now - harder to tell what those symbols might mean
01:17jeayeHow can I type hint an array of a non-primitive type?
01:19justin_smith,(type (into-array ["foo"]))
01:19clojurebot[Ljava.lang.String;
01:19justin_smithin that case you would use the hint ^"[Ljava.lang.String;"
01:19amalloy^"[Ljava.lang.String;"
01:19amalloywhere [Ljava.lang.String; is the JVM's internal name for the class representing an array of strings
01:19amalloy[[ if it's a 2d array, etc
01:19justin_smithfor obvious reasons that hint won't work outside a string
01:20jeayeInteresting. Does it need to be fully scoped, regardless of my usings?
03:29OlajydHi,TEttingr
03:29OlajydHi, TEttinger :)
03:31TEttingerhey Olajyd
03:31TEttingerhow are your regex adventures going?
03:32OlajydI had to sit down and learn it
03:33OlajydI’ll send paste the code I cam up with so you can help me review it and see if i need to optmize it
03:35OlajydTEttinger: here is the sample code on refheap https://www.refheap.com/108469
03:43TEttingerOlajyd: this is kinda an odd thing related to how characters are actually stored, but [A-z] will actually match more than you probably want.
03:43TEttingeralso, re-pattern is common enough that there's a shortcut, #"[A-Za-z]+" for example
03:44TEttinger,(re-find #"[A-z]" "_")
03:44OlajydTEttinger, I wanted it to catch botth upper and lower cases
03:44clojurebot"_"
03:44TEttingerand you can, just with two ranges
03:44Olajydoh ok
03:44TEttingerA-z will match "ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz"
03:44TEttingerthere's a \\ in there, it's really just the backslash
03:45TEttinger,(re-find #"[A-Za-z]" "_")
03:45clojurebotnil
03:45TEttinger,(re-find #"[A-Za-z]" "Alphabet")
03:45clojurebot"A"
03:45pepijndevosWhat is the most simple, braindead way to build a CLJS-only single-page app? No Clojure server.
03:45TEttinger,(re-find #"[A-Za-z]" "the Alphabet")
03:45clojurebot"t"
03:45OlajydThanks TEttinger
03:46TEttingerno prob, there was something else, let me try to remember it
03:47OlajydTEttinger, I also have a another function that’ll handle delimiters, I’ll just post it on refheap so you can review it, i actually have some questions I wasnt clear about
03:49OlajydTEttinger, here’s the link https://www.refheap.com/108470
03:51OlajydTEttinger is there anyway to handle delimiters such as “*”, “\” “^” without shooting myself on the leg :)
03:51gilliardpepijndevos: have you looked at https://github.com/clojure/clojurescript/wiki/Quick-Start ?
03:51TEttingeractually, yes
03:52pepijndevosgilliard, not recently.
03:52TEttinger,(doc clojure.string/split)
03:52clojurebot"([s re] [s re limit]); Splits string on a regular expression. Optional argument limit is the maximum number of splits. Not lazy. Returns vector of the splits."
03:52TEttingerhm.
03:52pepijndevosBack when it was actually hard to get cljs running, I glanced over it and dismissed it.
03:55gilliardpepijndevos: that's the most stripped-down doc I know of.
03:57pepijndevoshah, lein new figwheel is actually pretty braindead, and it generates a static html directory. Sweet.
03:57gilliardnice :)
04:03OlajydTEttinger, I’m sorry I got diconnected.. any suggestions?
04:03TEttingerOlajyd: http://clojuredocs.org/clojure.string/re-quote-replacement
04:03TEttinger,(re-pattern (re-quote-replacement "^"))
04:03clojurebot#error {\n :cause "Unable to resolve symbol: re-quote-replacement in this context"\n :via\n [{:type clojure.lang.Compiler$CompilerException\n :message "java.lang.RuntimeException: Unable to resolve symbol: re-quote-replacement in this context, compiling:(NO_SOURCE_PATH:0:0)"\n :at [clojure.lang.Compiler analyze "Compiler.java" 6704]}\n {:type java.lang.RuntimeException\n :message "Unable to...
04:03TEttinger,(re-pattern (clojure.string/re-quote-replacement "^"))
04:03clojurebot#"^"
04:03TEttinger,(re-pattern (clojure.string/re-quote-replacement "*"))
04:03clojurebot#error {\n :cause "denied"\n :via\n [{:type java.lang.ExceptionInInitializerError\n :message nil\n :at [java.util.regex.Pattern error "Pattern.java" 1924]}\n {:type java.lang.SecurityException\n :message "denied"\n :at [clojurebot.sandbox$enable_security_manager$fn__835 invoke "sandbox.clj" 69]}]\n :trace\n [[clojurebot.sandbox$enable_security_manager$fn__835 invoke "sandbox.clj" 69]\n [...
04:03TEttingeruh
04:04TEttingerthat's new
04:04Olajydhahah :)
04:04TEttinger,(re-pattern (clojure.string/re-quote-replacement "[*]"))
04:04clojurebot#"[*]"
04:04TEttingermight be better to use (str "[" delim "]") instead of the plain string as the arg
04:06OlajydTEttinger, so something like (clojure.string/split “string” #”[/]”) would work?
04:06TEttingerlet's see...
04:07Olajydor something like (clojure.string/split “string” #”[\]”) would work too?
04:07TEttinger,(clojure.string/split "str/ing" #"[/]")
04:07clojurebot["str" "ing"]
04:07TEttinger,(clojure.string/split "str\ing" #"[\]") ; guessing this will fail because it thinks the backslash is escaping the ]
04:07clojurebot#<RuntimeException java.lang.RuntimeException: Unsupported escape character: \i>
04:07Olajyd,(clojure.string/split “s*tring” #”[*]”)
04:07clojurebot#<ArrayIndexOutOfBoundsException java.lang.ArrayIndexOutOfBoundsException: 8221>
04:07TEttingeroh even before
04:08TEttinger,(clojure.string/split "str*ing" (re-pattern (clojure.string/re-quote-replacement "[*]"))) ; guessing this will fail because it thinks the backslash is escaping the ]
04:08clojurebot["str" "ing"]
04:08gilliard,(clojure.string/split "s*tring" #"[\\*]")
04:08clojurebot["s" "tring"]
04:08TEttingerleft in the comment, it wasn't supposed to be there
04:08TEttingeryep!
04:09gilliardmoar backslashes!
04:09TEttingeractually might not need the \
04:09TEttinger,(clojure.string/split "str*ing" #"[\*]")
04:09clojurebot["str" "ing"]
04:10TEttingerso there's some problem with [*] where it goes nuts, but if * is after a backslash or even an escaped backslash it's fine
04:10TEttinger,(clojure.string/split "str\\ing" #"[\\*]")
04:10clojurebot["str" "ing"]
04:11Olajyd,(clojure.string/split “s*tring” #”[*]”)
04:11OlajydHi, gilliard
04:11Olajyd,(clojure.string/split "str\ing" #”[\\]”)
04:11clojurebot#<ArrayIndexOutOfBoundsException java.lang.ArrayIndexOutOfBoundsException: 8221>
04:11Olajydhmm
04:11clojurebot#<RuntimeException java.lang.RuntimeException: Unsupported escape character: \i>
04:11gilliardThat regex reader macro is a bit magic isn't it? "\*" isn't a valid string.
04:12TEttingergilliard, yep
04:13TEttingerOlajyd: the string you're matching on will need \\
04:13TEttinger,(clojure.string/split "str\\ing" #"[\\]")
04:13clojurebot["str" "ing"]
04:13OlajydTEttinger, hm
04:13TEttingerthat's how you enter and how it sorta prints backslashes
04:13TEttinger,(pr "hey\\world")
04:13clojurebot"hey\\world"
04:14TEttinger,(print "hey\\world")
04:14clojurebothey\world
04:14TEttinger,(count "\\")
04:14clojurebot1
04:14Olajyd,(clojure.string/split "str/ing" #”[\/]”)
04:14clojurebot#<ArrayIndexOutOfBoundsException java.lang.ArrayIndexOutOfBoundsException: 8221>
04:14TEttingerthe \\ is an escape for the backslash
04:14TEttingeroh!
04:14TEttingerthat's because you are using what some IRC clients call "smart quotes"
04:15Olajydok
04:15TEttinger,"”"
04:15clojurebot"”"
04:15TEttingersee how the quotes on the outside aren't closed by the one on the inside?
04:15Olajydyea gotcha
04:17TEttinger,(clojure.string/split "str/ing" #"[\/]")
04:17clojurebot["str" "ing"]
04:17TEttingeryour code is good
04:19OlajydTEttinger a more robust solution is therfore to use something like (str “[\” delim "]") ?
04:19TEttingernot exactly
04:20Olajydoh
04:20TEttingernot all chars need to be escaped, and some, like \n , actually mean something else (that's a newline)
04:20TEttingerthat's what clojure.string/re-quote-replacement is for
04:21TEttinger,(clojure.string/split "hello\\world" (re-pattern (clojure.string/re-quote-replacement "\\")))
04:21clojurebot["hello" "world"]
04:21TEttinger,(clojure.string/split "hello^world" (re-pattern (clojure.string/re-quote-replacement "^")))
04:21clojurebot["hello^world"]
04:21TEttingerhm!
04:22TEttinger,(clojure.string/split "hello^world" (re-pattern (clojure.string/re-quote-replacement (str "[" "^" "]"))))
04:22clojurebot#error {\n :cause "Could not initialize class java.util.regex.PatternSyntaxException"\n :via\n [{:type java.lang.NoClassDefFoundError\n :message "Could not initialize class java.util.regex.PatternSyntaxException"\n :at [java.util.regex.Pattern error "Pattern.java" 1924]}]\n :trace\n [[java.util.regex.Pattern error "Pattern.java" 1924]\n [java.util.regex.Pattern clazz "Pattern.java" 2493]\n [...
04:22TEttingerhm
04:22TEttingerI don't know why that fn doesn't escape ^
04:23OlajydTEttinger, lol , I’m going with the assumption that hopefully \n and the likes are not going to be present in the string
04:25TEttinger,(let [delim "^"] (clojure.string/split "hello^world" (re-pattern (str "[" (->> delim first int (Integer/toHexString) (str "\\u")) "]"))))
04:26clojurebot#error {\n :cause "Could not initialize class java.util.regex.PatternSyntaxException"\n :via\n [{:type java.lang.NoClassDefFoundError\n :message "Could not initialize class java.util.regex.PatternSyntaxException"\n :at [java.util.regex.Pattern error "Pattern.java" 1924]}]\n :trace\n [[java.util.regex.Pattern error "Pattern.java" 1924]\n [java.util.regex.Pattern uxxxx "Pattern.java" 3182]\n [...
04:26TEttingerwoah
04:26TEttinger,(let [delim "^"] (str "[" (->> delim first int (Integer/toHexString) (str "\\u")) "]"))
04:26clojurebot"[\\u5e]"
04:26TEttingerah
04:27TEttinger,(let [delim "^"] (clojure.string/split "hello^world" (re-pattern (str "[" (->> delim first int (format "%04x") (str "\\u")) "]"))))
04:27clojurebot["hello" "world"]
04:27TEttinger,(let [delim "^"] (clojure.string/split "hello^world" (re-pattern (str "[" (->> delim first int (format "%04x") (str "\\u")) "]")))) ; Olajyd, this is uh kinda crazy but works
04:27clojurebot["hello" "world"]
04:28luxbockgfredericks: I tried copying your `bounded-int` from test.chuck and creating my own version of `gen/elements` with it, but it's not quite doing what I need, though I suspect what I need might be quite specific
04:28Olajydwow TEttinger :)
04:28TEttinger,(for [delim ["^" "-" "*" "\\" "?" "]"]] (clojure.string/split (str "hello" delim "world") (re-pattern (str "[" (->> delim first int (format "%04x") (str "\\u")) "]")))) ; Olajyd, this is uh kinda crazy but works
04:28clojurebot(["hello" "world"] ["hello" "world"] ["hello" "world"] ["hello" "world"] ["hello" "world"] ...)
04:29TEttinger,(for [delim ["?" "]" "[" "{"]] (clojure.string/split (str "hello" delim "world") (re-pattern (str "[" (->> delim first int (format "%04x") (str "\\u")) "]")))) ; Olajyd, this is uh kinda crazy but works
04:29clojurebot(["hello" "world"] ["hello" "world"] ["hello" "world"] ["hello" "world"])
04:29luxbockgfredericks: I haven't looked at the recursive generators, but I suspect that I don't need them, because the size of the trees that I build basically depend entirely on one property of the rules that are used, and one property of the root-node
04:29pepijndevosWhat the hell. Where is my xhr-connection? It doesn't seem to be inside clojure.browser.net
04:30Olajydok thanks TEttinger, :)
04:31Olajydwill find a way to integrate it to the function, get-last-part,
04:31Olajydgilliard, any suggestions?
04:31gilliard,(doc clojure.string/re-quote-replacement)
04:31clojurebot"([replacement]); Given a replacement string that you wish to be a literal replacement for a pattern match in replace or replace-first, do the necessary escaping of special characters in the replacement."
04:31TEttingerOlajyd: what that does is it gets the first char out of the delim, gets the numeric code that represents it (by calling int), then does a format call which is sorta a voodoo function, it does a lot but here it makes a zero-padded 4 digit hex string, sticks "\u" before it... and you get a valid escaped character that will never be special
04:31luxbockgfredericks: so I can just do (gen/fmap (partial apply draw-my-tree-fn) (gen/tuple rule-generator root-node-generator))
04:31gilliard^^ that's not the same as what we want. But I don't have any other suggestions atm, sorry.
04:32TEttingeroh and it doesn't need the [ and ] padding anymore
04:32TEttinger,(let [delim "^"] (clojure.string/split "hello^world" (re-pattern (->> delim first int (format "%04x") (str "\\u")))))
04:32clojurebot["hello" "world"]
04:33luxbockto implement the growing property for my root-nodes, I really just need a generator that when given [:foo :bar :baz], the typical sample of it would look like (:foo :foo :bar :foo :bar :baz :bar :foo :baz), i.e. it would begin by favoring the earlier elements
04:34luxbockI tried to read through the clojure.test.check.generators code but it's a bit beyond my level to understand quickly
04:35luxbockif there's some easy trick to achieve this type of generator I'd love to find out, if not then it's not a very big deal :)
04:35luxbockgfredericks: thanks for the help in any case
04:36pepijndevosSeriously, the function is right here, https://github.com/clojure/clojurescript/blob/master/src/main/cljs/clojure/browser/net.cljs#L81 but when I use it, it's not there.
04:38pepijndevoshuh, it is, but not on the repl...
04:38TEttingermaybe because the repl isn't browser-based? I don't use CLJS though
04:38OlajydTEttinger, thanks! more problem solving coming your way ;) thanks everyone :)
04:39TEttingerwoohoo
04:49pepijndevosI'm using figwheel browser repl
04:51spaceplukhi, is there any good wrapper for guava caches?
04:55pepijndevosOuch... figwheel doesn't deal with case-sensitive filesystems it seems.
05:24dabdthoughts in this language? https://github.com/LuxLang/lux
05:25dabdit seems like a great idea: a statically typed Lisp with a powerful module system
05:25dabdapparently the compiler is written in Clojure
05:36Olajydwhat function can I use to Print "Hello World" N times
05:36jeayedabd: I'm also working on a statically typed lisp.
05:39jeaye,(dotimes [n 5] (print "Hello World"))
05:39clojurebotHello WorldHello WorldHello WorldHello WorldHello World
05:39jeayeOlajyd: ^
05:40Olajydwow jeaye
05:42jeayehm?
05:42Olajydthanks :)
05:42jeayesure
05:47sveridabd: I scrolled through the wiki a bit and disliked all of the reader macros. Apart from that, well, types is what clojure is lacking for me, so yea, it's interesting. It would be nice if there was clojure interop so you would not have to reinvent the whole clojure stack again :-)
05:53pepijndevosWaaa. I'm porting some Clojure code that loaded a json resource from file and put it in a var. Now in Clojurescript I want to have the same thing, but it's of course all callbacks.
05:53pepijndevosI thought I know, I'll use a promise, but there is no such thing. What am I supposed to do?
05:55pepijndevosShould I use an atom, or alter-var-root or some core.async thing?
05:56tcrayford____pepijndevos: don't store state in vars (for the most part). I'd use an atom or core.async, depending on what you're doing
05:56tcrayford____(core.async is more about "communicate this value right now to a loada downstream things, an atom is more about "hold this thing and let me update it atomically")
05:57pepijndevosIt's not so much mutable state, it's just config things. Static data. I'm using it all over the place, so passing it around is a PITA>
05:58tcrayford____pepijndevos: I tend hard towards passing things around these days (see component in clojure land), but it's your program ;)
05:59dabdsveri: I didn't find much information about reader macros except for defsyntax #export
06:14sm0keso if you have a (declare a) you can check it is bound by (bound? #'a) or (bound (var a))
06:15sm0kebut if i pass it to a function (defn foo [b] (bound? (var b)))
06:15sm0keit throw error
06:15sm0ke,(do (declare a) (bound? (var a)))
06:15clojurebotfalse
06:16sm0ke,(do (declare a) (#(bound? (var %)) a))
06:16clojurebot#error {\n :cause "Unable to resolve var: p1__49# in this context"\n :via\n [{:type clojure.lang.Compiler$CompilerException\n :message "java.lang.RuntimeException: Unable to resolve var: p1__49# in this context, compiling:(NO_SOURCE_PATH:0:0)"\n :at [clojure.lang.Compiler analyzeSeq "Compiler.java" 6891]}\n {:type java.lang.RuntimeException\n :message "Unable to resolve var: p1__49# in this...
06:33deadghosthow do you keep track of clojure news/developments
06:33deadghostrss feeds or what?
06:34sm0keis normally find it on #clojure twitter
06:34sm0keor HN
06:34sm0keI*
06:49gilliardTEttinger2 Olajyd: Was it j.u.r.Pattern/quote we needed earlier?
06:49gilliard,(clojure.string/split "Hello^WORLD" (re-pattern (java.util.regex.Pattern/quote "^")))
06:49clojurebot["Hello" "WORLD"]
07:28luxbockthere's no core-function for catching exceptions and returning nil right?
07:28luxbockjust got bit by this: ##((sorted-map-by > 1 :foo) :bar)
07:29luxbockI suppose it would have to be a macro
07:59cenzhehi all. Is it possible to call gen-class with values that can only determined at runtime?
07:59cenzhebe determined
08:00conceptHello all, I already know Haskell, how much new concepts will clojure introduce ? Is learning Clojure after Haskell a good idea?
08:07Kneivaconcept: Well, they are both lazy functional languages. There are some new concepts. Clojure has less syntax and it is lisp so that takes a while to get used to unless you already know some lisp. I moved to Clojure after studying Haskell since I do a lot of stuff on the JVM anyways.
08:12conceptKneiva: is there are similar concepts like functors ? monads? applicatives? or is the focus on macros?
08:14scottjconcept: none of those concepts are explicitly mentioned in clojure itself, and macros are part of clojure but not the focus
08:14schmirscottj: don't tell me I have used monads without noticing :)
08:15Kneivaschmir: You most likely have. =)
08:15conceptYou most likely did
08:16tdammersyou almost certainly did
08:16conceptso what is a good starting point, book/tutorial/video etc to learn Clojure, I already have good experience with haskell?
08:16tdammers(monad the phenomenon, not monad the explicit language construct)
08:16scottjconcept: clojurebook.com
08:16scottjconcept: or read everything on clojure.org also works
08:17conceptscottj: thanks
08:17schmirdamn it
08:18scottjfor tutorial there's braveclojure.com and for videos there are several charming old ones of Rich explaining the language
08:19conceptAnother queston, how does Clojure compare to other Lisp dialects such as Scheme and Racket ?
08:20gilliardrunning on the jvm is a pretty big difference.
08:20scottjconcept: http://clojure.org/lisps
08:27clgvI have the following problem with clojure.java.jdbc: In a transaction I want to insert data into two tables (jdbc/with-transaction [t-conn db] (jdbc/insert! t-conn :table1 ...) (jdbc/insert! t-conn :table2 ...)) - this fails since the second insert just hangs
08:28clgvah right, the database is SQLITE. so what might be going wrong there?
08:28clgvI have no exception or error message to work with...
08:29schmirlooks like a deadlock
08:30clgvthe whole thing happens in the same thread within the same function
08:32schmirclgv: https://www.sqlite.org/lang_transaction.html: "Transactions created using BEGIN...COMMIT do not nest"
08:33clgvschmir: I do not want to nest any transactions - I just want to use the single one. I tried :transaction? false in jdbc/insert! - but no difference
08:35schmiroh sorry...misread that and I don't have any explanation for such behaviour
08:36schmirare you sure that you don't resuse the 'db' connection instead of t-conn?
08:36schmirs/resuse/reuse/
08:56troydmcan anyone suggest good parsing library for Clojure, something close to attoparsec in Haskell (parser combinator library)?
08:57tcrayford____instaparse is decent
08:57tcrayford____my prod app (http://yellerapp.com) uses it and is happy
08:58tdammershttps://github.com/engelberg/instaparse
08:58tcrayford____it's not parser combinators like attoparsec or parsec - you define a CFG in a string (because iirc parser combinators are much harder to do in strict languages like clojure)
08:58tdammersit's also more limited in terms of what it outputs, compared to (atto-)parsec
08:59tdammershttps://github.com/engelberg/instaparse#transforming-the-tree <- this explains things a bit
08:59tdammersbut it's still a lot clumsier than how you'd make a parser output exactly what you want in parsec
09:00hyPiRionIf you need to do stream parsing or have a lot of input, Instaparse is a bad fit. Otherwise it's very good.
09:04clgvschmir: yeah
09:05troydmhyPiRion: I need to parse lots of Perl scripts
09:06schmirclgv: does it work without the transaction?
09:06tcrayford____troydm: a reminder that the only working parser for perl is the perl parser itself, and iirc perl's parsing is *really* messed up
09:07troydmtcrayford____: yeah I know, I guess not fully complaint parsing but more like something that would be able to parse simple scripts
09:08tcrayford____troydm: http://www.perlmonks.org/?node_id=663393 may be of relevance as well ;)
09:08tcrayford____oh, ok
09:08hyPiRiontroydm: If you can encode it in instaparse, go ahead. It shouldn't be an issue with respect to perf.
09:09troydmhyPiRion: I guess i'll need a lot of custom parsing
09:09troydmhyPiRion: is instaparse flexible in that sense? or it's not good for this kind of task
09:10hyPiRionThat really depends on what you mean by custom parsing. I haven't used perl, so I can't say how bad it is to do it. But if you can encode as a context-free grammar, then it's fine.
09:10troydmhyPiRion: basicly I need to parse lots of Perl scripts, recognize some common constructions of code and output the textual description of the constructs used in perl script
09:15pepijndevosWhat is the simplest way in Cljs to run some CPU intensive code without blocking everything?
09:16crocketCan leiningen handle java source files with clojure source files in the same directory?
09:19clgvschmir: I'll try
09:20clgvpepijndevos: core.async plus some nonsense numeric computation per item that goes through the channel?
09:22pepijndevosclgv?? I have a numerical computation, I just want to run it without blocking everything.
09:23clgvpepijndevos: can you decompose it into smaller parts? map-reduce?
09:24oddcullypepijndevos: have you considered web workers?
09:24pepijndevosyea, It produces a lazy seq, and I want to keep dropping until it reaches a certain point.
09:25pepijndevosso maybe setTimeout(step, 0) would do.
09:25clgvpepijndevos: is it that simulated annealing algorithm?
09:25pepijndevosyea
09:26clgvand it must be run on the frontend (cljs)?
09:26pepijndevosyea
09:28crocketIs leiningen the only game in town?
09:33BobSchackcrocket: There's also boot http://boot-clj.com/
09:39crocketBoot
09:44crocketUsing clojure implementations of protocols in java is cumbersome.
09:54clgvschmir: found it, some innocent looking function made a reading db query :/
09:56clgvI hate the "builds are programs" philosophy. I suffered from a third-party project using some python build script that involved building c++ code as well - you had to add printlns or interpret the source to actually get to know what files are actually compiled
09:57clgv(inc leiningen)
09:57clgv;)
10:22sdegutisWhat's a stupefying technique for getting the first element in an infinite sequence that satisfies a condition and stopping at that point, returning the satisfying element?
10:24sdegutis##(->> (range) (filter even?) (first))
10:24sdegutis,(->> (range) (filter even?) (first))
10:24clojurebot0
10:24sdegutislazybot is dead!!!
10:24sdegutis&(->> (range) (filter even?) (first))
10:24sdegutis,(->> (range) (filter odd?) (first))
10:24clojurebot1
10:25matthavener,(->> (range) (some odd?))
10:25clojurebottrue
10:25matthaveneraww odd? returns boolean
10:25pepijndevosfirst drop while?
10:27gilliardfnext partition-by?
10:44sdegutis,(->> (range) (filter odd?) (first))
10:44clojurebot1
10:44sdegutis,(->> (range) (some odd?))
10:44clojurebottrue
10:44sdegutisOh right.
10:48gfredericksluxbock: when you tried to create gen/elements used bounded-int, was the problem that it still seemed evenly distributed?
10:56noncomwhat is the common approach for creating typical groups of control elements in seesaw? say, i have a group of a text input, a button, a slider and a couple of labels, they control values of, say, 2 atoms. is there any preferred way of creating such a control group for various atoms?
10:56noncomi think what i am asking about is some higher-level grouping of elements..
10:57sdegutisI have not used seesaw.
10:58clgvnoncom: you usually choose one of the layourmanagers
10:59noncomyeah, i know: that's what goes for the layout, but...
10:59noncomsee: http://joxi.ru/1A5b5BZFXWbqrE
10:59noncomi just have tonns of repeating code
11:00noncomdoes not look right... although there may be no other way around..
11:00noncomexcept for maybe generalizing this into a separate function..
11:02clgvnoncom: the bare minimum would be a declarative description as clojure map
11:02noncomah, right, so i could create a builder around seesaw, which would take a declarative map and go with it create elements and setup connections, right?
11:03clgvsure, if it's worth the effort
11:03clgvnoncom: those bindings are pretty noisy there. maybe that can be simplified?
11:03justin_smithnoncom: it seems like you could have a function that returns one of those groups (k 1, k 2, bpm, etc.) in a hash-map
11:03justin_smithwith sizes and positions as an argument to the function
11:04sdegutisIs there any interest in a testing framework that uses Java 8's java.nio.file.WatchService ?
11:04noncomyeah.. the combination of what you both are saying is what could be the solution
11:04sdegutisSeeing as how Clojure 1.7 now uses Java 8 and all...
11:05justin_smithsdegutis: I've been using clojure with java 8 for ages, this has nothing to do with 1.7 does it?
11:05sdegutisI'm very interested in it personally and will be writing one. I only ask to see if anyone would like it to be made public.
11:05sdegutisjustin_smith: I thought some recent version of Clojure required Java 8?
11:05justin_smithno
11:05sdegutisMaybe I'm mistaken. Either way, I'm writing this dang thing.
11:05sdegutisSo tired of my test suite polling my file system. It's killing my SSD.
11:05justin_smith1.6 is still the minimum, might be jumping to 1.7 eventually
11:05hyPiRionsdegutis: they are considering removing 1.6 support after 1.8, but it's not set in stone yet
11:05sdegutisAH.
11:05sdegutis*Ah.
11:06justin_smithit's hard to require anything after 1.6, ubuntu and osx are stuck on that version last I heard
11:06noncomwon't this crush the enterprise world which is still on 1.5?
11:06justin_smithhaha
11:06puredangerI have seen 0 complaints about losing support for Java 1.5 (in Clojure 1.6)
11:07puredangerClojure 1.6, 1.7, 1.8 will support Java 1.6+
11:07sdegutisjustin_smith: I'm on OS X and using Java 8 according to `lein repl`
11:07BronsaIntelliJ requires 1.6
11:07justin_smithdid it come with that out of the box? of course you can use java 8 anywhere if you make the effort
11:07sdegutisI think I installed it myself at some point?
11:08sdegutisI don't recall specifically wanting the latest version though.
11:08sdegutisOooh I know why.
11:08noncomit was almost surely you
11:08justin_smithyeah, I'm just saying there is friction about using anything newer than the system default
11:08justin_smithnewer versions of the jvm are easy to install, so it's a kind of silly friction
11:08sdegutisWhen I installed OS X 10.10, and installed Leiningen, and ran `lein` the first time to set it up, it popped up a message box saying "You need to install Java yourself" and gave me a link to the JDK download page.
11:09noncomthis explains everything
11:09sdegutisSo I just clicked the topmost link that was for "Mac" OS X. (APPLE DOESNT CALL IT THAT ANYMORE ORACLE GET WITH THE PROGRAM)
11:09sdegutisAnd it happened to be Java 8 JDK.
11:09sveriThe business I am working for delivers its packaged JVM and we explicitly do not support OSX, but Solaris for instance :D
11:09sdegutisHa.
11:09sdegutisSo this implies that most OS X users are probably using Java 8.
11:10sdegutisBut a minority of people in here use OS X.
11:11sdegutisSo... any interest in a testing framework that uses WatchService?
11:11sdegutisAll current ones just poll the system.
11:11sdegutis(file system)
11:12noncommaybe you better ask the google group
11:12noncombut why not make it and make it public? the interest will discover itself
11:14sdegutisnoncom: I've made a dozen tools and made them public, going through a lot of effort to document it, that I never would have done if it were private only, and none saw any kind of community pick-up
11:14sdegutis*dozen Clojure libs
11:14sdegutisI'd hate to waste my time because there may potentially be interest when there's really not.
11:14justin_smithmake something someone wants to use next time, duh
11:14noncomeh :( i have a somewhat similar story, man... not so much with clojure though :)
11:15noncombut i thought i just like to have it documented and stuff just for myself
11:15sdegutis:)
11:15noncomsometimes OCD simplifies things...
11:15sdegutis:)
11:15Bronsasdegutis: I only see 3 clojure repos on your github
11:15sdegutisAnyone know where that list is of Clojure testing libs and plugins?
11:16sdegutisBronsa: I integrated most of them into our private app since nobody wanted them.
11:16Bronsanone of which have any docstring
11:16sdegutisBronsa: The ones still up there are probably more recent and I just haven't gotten around to removing the github repos
11:16Bronsasdegutis: what's the point of removing github repos? I don't understand
11:17sdegutisBronsa: OCD
11:17sdegutisI don't like having things lying around that aren't in use. It's just really irksome to me. So I either make something I use and keep it up, or get rid of it.
11:17sdegutisThe only exception being mjolnir, which I keep only because it's got way many github stars, and that could be useful for something some day
11:18Bronsathen you shouldn't complain that nobody uses your lib if you delete them
11:18sdegutisFound it https://github.com/technomancy/leiningen/wiki/Plugins
11:18sdegutisBronsa: Not if I've left it up for a year or two and plugged it a few times already.
11:21sdegutisWhen making Clojure libs, you either got to be first, or be famous. Otherwise your lib won't ever gain traction.
11:21sdegutisweavejester was both, which is why his libs got so popular, even his newer ones -- the mere mention of the on the mailing list gets lots of instant attention
11:21sdegutisMarick was first when he made Midje, which is why it's got more awareness and support than Speclj
11:22justin_smithwhat about data.json/cheshire
11:22sdegutisCompojure was first, so even though it's got a lot of downsides and bad designs, people still recommend it because it's now the de-facto standard
11:22sdegutisjustin_smith: nobody uses that
11:23justin_smithsdegutis: those are two different libs
11:23justin_smiththe newer one, made by the less famous guy, is more popular
11:23sdegutisjustin_smith: that still counts as "first" though because the real first one sucked bad enough that everyone wanted a replacement
11:23sdegutisso it was a race to make one.
11:23sdegutissimilarly to clojure.test, which some people can't accept, thus they picked Expectations in its place
11:25Bronsasdegutis: lots of opinions thrown as facts, as usual
11:25sdegutisyep, talking out my butt
11:25sdegutisjust /ignore me
11:25sdegutisi have nothing useful or informative to say
11:26Bronsathat's good you're aware of that
11:26ucbfor the erlang hackers in here (or people generally interested in useless but potentially cool stuff): https://github.com/ulises/sliver/blob/pulsar-examples/reg_ping.erl + https://github.com/ulises/sliver/blob/pulsar-examples/src/sliver/core.clj
11:27sdegutisBronsa: im serious. type /ignore sdegutis
11:27scottjcompojure is the defacto standard because it has been maintained for seven years and redesigned when something better came along (ring).
11:27Bronsascottj: don't even bother
11:27sdegutisscottj: the way it's designed is kind of weird.
11:27sdegutisscottj: for example I'd much rather destructure params myself...
11:28sdegutisIf you have a middleware that assoc's the db and current user, you have to do crap like this: (POST "/foo/:bar" [bar {:keys [db user]}] ...)
11:29sdegutisIt gets ugly quick.
11:29sdegutisOh wait, what am I doing.. scottj, Bronsa is right, just ignore me. It's a complete waste of time to listen to me or seriously consider anything I say. I'm a complete moron and probably intentionally trolling.
11:35Bronsasdegutis: that's the impression you make, yeah
11:35t0byNot sure about the second, but seeing these exchanges I wouldn't rule out #1.
11:35sdegutisok
11:36sverisdegutis: sounds like you had a bad day
11:36sverimaybe with your girlfriend?
11:36sdegutishaha
11:36sdegutisjust trying to figure out how to find duplicate values in datomic
11:36sdegutisand only paying half attention to Bronsa's insults
11:37sdegutisbut heck i dont mind being insulted, what do i gain for having a good reputation? being like Bronsa? no thanks.
11:37sdegutisso yeah im a jerk and moron and troll. so be it.
11:37sdegutisoh right :with!
12:28clgvjustin_smith: ubuntu and most modern linux distributions shipp java 7 afaik.
12:32justin_smithmust have happened more recently than the release of whatever images my ops guy uses
12:33justin_smith(not to mention my own box, which is aging)
12:33justin_smithwe've specifically had issues in my team with java modules getting built for 1.7 then breaking on prod for that reason
12:39eguneyswhat's wrong with this code http://pastebin.com/qLyV7Rtu
12:41justin_smiththe indentation is a bit off, but it looks fine
12:41eguneysit doesn't work
12:41eguneyss c t doesn't get destructured
12:41justin_smithOK, what does test-address look like?
12:41eguneysit's a map {:street-address "123 .." }
12:42justin_smitheguneys: your destructuring is guaranteed to grab the keys :s :c and :t from test-address. If test-address does not contain those keys, fix your destructuring or your data.
12:43eguneysoh I have to use actual key names like street-address
12:43justin_smithright, destructuring isn't magic
12:43eguneysok thanks
12:46sdegutisBtw Datomic is way cooler lately.
12:50spieden-pull function in queries is great
12:53sdegutisWait, *in* queries?
12:53sdegutisOr do you mean as opposed to d/q?
12:54sdegutisspieden-: That's actually a feature I don't really understand the purpose of. When you get a user by (d/entity db (d/entity db [:user/email user-email])), you can then get anything lazily from it in map-form, like (:user/name user) or even (-> user (:user/account) (:account/balance)) and it works fine.
12:55amalloyjustin_smith: it wouldn't necessarily have to be magic: eguneys probably imagined it pulled values from the map "in order"
12:57sdegutisSpeak of which what's the point of hash-ordered-coll?
12:59Bronsatry to read the docstring
13:05sdegutis(doc hash-ordered-coll)
13:05clojurebot"([coll]); Returns the hash code, consistent with =, for an external ordered collection implementing Iterable. See http://clojure.org/data_structures#hash for full algorithms."
13:05sdegutisBronsa: I thought you had me on /ignore bro what gives
13:05sdegutisBronsa: yeah I read that earlier, still not getting it
13:15justin_smithamalloy: oh, that would be the more parsimonous misunderstanding, yeah
13:22justin_smithoh, the word is parsimonious, sorry
13:22sdegutisFinally gonna read transducers.html and see what the big deal is.
13:32spieden-sdegutis: true, but that makes the data dependencies of your code a bit opaque. if you pull everything you need up front they're clear. also when querying directly from the front-end as dnolen described in his omnext talk the lazy map isn't an option.
13:32sdegutisspieden-: ah touche
13:32sdegutisdnolen's in the dynamic-bridge camp, but there's way too much security risk there for it to be practical for our purposes
13:33sdegutisevery single thing that comes from the front-end to the back-end needs to be inspected first to make sure it's a valid request, which is completely skipped when doing it "magically"
13:33spieden-right now i like mediated "free query" from the front-end for reads and for writes something like command objects/values
13:34spieden-sdegutis: queries are just data you can inspect like anything else, right? also you can run them against a dbval that constrained to just what the user is allowed to see via filtering
13:35spieden-anyway, the endless REST URI hierarchies do get tiresome, heh
13:35sdegutisspieden-: I personally don't like exposing any implementation details beyond their absolutely necessary black-box entrance, such as how something is stored in a database
13:35spieden-sdegutis: yeah you definitely lose that
13:36spieden-cost is tighter coupling between front-end code and storage model =\
13:36sdegutisspieden-: the style of coding I've started changing to is to not allow datomic attribute-names to escape past the implemenetation source file they absolutely must be in -- all tests and consumers of such functions use public functions which then may use these
13:36sdegutisfor example, (features.user/email user) will get the email address, even though it's just defined right now as (def email :user/email)
13:37spieden-ah cool, so everything's aliased
13:37sdegutisbasically yeah
13:37sdegutisSo for example this allows me to change from Entity to Pull API pretty easily
13:37sdegutisunfortunately I only started this a month ago or so, and only on a small portion of our codebase
13:37spieden-have to admit i like the idea of hitting "find usages" on a datomic attribute keyword and seeing everything that reads it, though =)
13:38sdegutisso there's still things like :user/email sitting in some Hiccup view files :'(
13:38sdegutisspieden- !!!
13:38sdegutiswhat's that??
13:38sdegutisoooh right
13:38spieden-(cursive)
13:38sdegutisyeah you can still do that on a function with a smart enough editor
13:38spieden-or whatever editor
13:38sdegutiswhich i dont have (dear emacs you suck)
13:39spieden-true, but with a keyword it even goes into the client-side cljs code i guess
13:40sdegutisah
13:41sdegutisit's a trade off, one that freaks me the heck out nowadays
13:41spieden-yeah, indirection vs data migrations i guess
13:41oddcullywhich brings us basically back to what magic destructuring is with {:keys [inventory-item/stock]...} playing really nice dat(omic|ascript) stuff
13:41sdegutisactually mostly because it makes changes much much harder
13:42sdegutistechnically you can dev a lot faster and easier by making use of lots of coincidences and magic and automatic stuff
13:42sdegutisbut you're much better off in the long-run if you make an official interface and hide as much implementation detail as possible
13:42sdegutislong-run meaning like, if you plan to code the same codebase full-time for many years
13:43spieden-yeah, in a larger team especially i guess
13:49spieden-stakes will finally be high when i can get clojure into my day job =)
13:49spieden-we'll see if my tune changes then
13:49akabanderMy day job approved Clojure for my piece of our massive project. I'm ecstatic and terrified at the same time.
13:50naga`i get paid to get clojure to be used in my company
13:50naga`:)
13:50akabanderBut they wanted me to play nice with the JVM, and I really hate working in Java, and this was my answer.
13:50spieden-nice
13:50naga`we sometimes have tough competition between node.js and clojure (in server side projects)
13:50naga`sometimes clojure wins because we need some fancy-pants db driver that's available in java
13:50akabanderIf I could do pure Clojure it would be perfect, it's figuring out the interop that's got me worried.
13:50spieden-i've been doing side stuff in clojure for a couple years
13:51spieden-akabander: it's the best i've seen
13:51akabanderI've heard it's good, I just haven't worked it in yet. I have the pure-Clojure API roughed out, but need to make calling into it easy for the Java people.
13:51spieden-akabander: trivial host interop was a big design goal i think
13:52spieden-akabander: i think that stuff has improved since i used it, but i've done the java-calling-clojure thing
13:53akabanderI'm going to do some googling, but I may drop in with questions for people who've been down the road before.
13:54naga`Problem is not with Java interop. Normally when you create some piece of code in Clojure to be called from Java, you'll tend to create uberjar that you'll put to the Java project's classpath. Then you'll have multiple points of dependency management (pom.xml in Java project and project.clj).
13:54naga`And that's *potentially* getting you into deep s*it in some cases.
13:54spieden-yeah i used maven only in the project where i did this
13:54spieden-which dealt with the clojure code fine
13:54naga`I mean, it's hard to manage even the pom.xml and if you do it the uberjar way then you'll potentially get same library in multiple versions to your classpath.
13:54naga`And who can say what classloader decides to load the lib?
13:55akabanderHmm, the Java folks are working in a Maven project, and I've been naively using lein for my pieces.
13:55naga`So I personally wouldn't use Clojure code from Java or then I'd pay attention to the dependency management stuff.
13:56akabandernaga`: I've already asked our deep-Java nerd for class loading details, and he basically waved his arms at me and said, "lalala I can't hear you."
13:56spieden-naga`: what if you just build a regular jar of the clojure code from maven?
13:56naga`akabander: that's because you'll need to dig deep sometimes to know who loads what. it's the bad side of jvm
13:56naga`I don't know if jigsaw will solve this kind of things?
13:56naga`I haven't yet looked into it
13:57akabanderI may be able to shift dependency management onto another team member, as cruel as that sounds, he has the background for it.
13:58spieden-akabander: if you produce a regular jar and a pom your artifact should be indistinguishable from those built from java code
14:01spieden-all clojar deps can be referenced from your pom, and you just configure clojure-maven-plugin to build your code
14:04akabanderspieden: Thanks, that will definitely get me started... Instead of teasing them with reports of functionality, I can give them stuff to use, should be fun.
14:04sdegutisAnyone here ditched paredit in favor of smartparents?
14:05sdegutisspieden-: I'm on a 1-person team (me) doing the same Clojure web app for 3 years straight full time, that's where my recommendation comes from.
14:07spieden-akabander: yeah they shouldn't know the difference beyond how much more efficient you are =)
14:07spieden-akabander: you'll just be providing interfaces and implementations like they're used to i think
14:08spieden-sdegutis: cool -- i'm trying to land a similar gig
14:08sdegutisbest of luck
14:10akabanderThanks spieden, that's the idea. I want to make them jealous of my Clojure use, not annoyed.
14:10arkhsdegutis: 2.25 years part-time for me : )
14:10sdegutisarkh: sweet
14:12justin_smithakabander: spieden-: for seamless collaboration, you probably want regular java interfaces as the common ground - these are easy to make even if you want to focus on writing clojure code, and very easy to use from both sides of the divide.
14:16akabanderThanks for the tip, justin, will add that to my notes
14:20expezdid lein gpg break in 2.5.2?
14:21expezIt now prompts me for a pw during deployment to clojars and cant sign the artifact
14:22expezhttps://github.com/technomancy/leiningen/issues/1952 indeed :(
14:41amalloyexpez: i just commented on that issue: it still works for me. do you have different versions of any of the stuff needed? perhaps there is some incompatibility between 2.5.2 and a particular version of gpg or something
14:47expezamalloy: I have gpg 2.1.6, and I run on linux. The issue creator was on osx IIRC.
14:58tmtwdhow do I load the current file with cider?
14:59tmtwdor the current buffer rather?
14:59expeztmtwd: C-c C-k
16:29xzilendis there a way to use a closure with a defn'd function? eg., have 'db' available in register fn: https://gist.github.com/adairdavid/ba9b80122cbf044bd0f6
19:40srrubyI'm learning AWS SQS. Can anyone recommend a sample exercise to test my ability to program SQS in Clojure? I'm imagining trying something like aggregating live twitter feeds.
19:41arkhI haven't used it but it looks like your best bet is Bandalore: https://github.com/cemerick/bandalore
19:43arkhif you're not familiar with him, cemerick writes good libraries
19:44srrubyarkh: Thanks. Yes I looked at it.
19:45srrubyI'm trying to see what I can use as a big data source.
19:47arkhsrruby: sorry, I misunderstood
19:47srrubynp
22:10freudsfeud/LEAVE
22:16crocketDoes a boot repl start up faster than lein repl?
23:07belakWhat are good first projects to do with clojure? I'm interested in learning it, but I'm not too familiar with what its strengths are or what it's usually used for
23:08futurobelak: what interests do you currently have?
23:08futurothe best projects are ones that scratch your own itch
23:08futurogenerally speaking
23:09TEttingerI think a lot of people here use clojure (JVM) for web app backends, and some also or instead use clojurescript for web app client-side behavior
23:09belakMy only other current project is an IRC bot, but I've been interested in a tiny package manager, or some sort of config management... I'd do a web app, but I'm not sure what
23:10futurothe config managements project would give you experience with I/O, printing, dependency handling, and some other things
23:10futuroperhaps interfacing with the cli
23:10futurowhich are all beneficial
23:10futurobeneficial to learn*
23:11TEttingerin my experience, clojure is really really good at handling data that would be considered complex in a language like Java. a clojure map, created with the {} sort of literal, is basically the same as a JS object in general properties, but clojure can treat a map or just about any collection as a seq, and most collection-based functions in clojure operate on seqs
23:12TEttingerso you have a lot of flexibility with converting around between types
23:15futuroits focus on data immutability, and it's functional nature, make it easier to reason about as well
23:15TEttingerbelak: I've written some tiny apps before for family stuff. my grandma had a number of really challenging dietary restrictions, so I wrote a little GUI app using the Seesaw lib that looked up foods in an offline copy of the USDA database, sorted by magnesium, phosphorus, and potassium (the stuff she had to avoid)
23:15futuroas opposed to systems which do not have these properties
23:15TEttingerit was uh much faster and smaller than writing it in Java, and i didn't need a GUI to make the GUI
23:16belakI think my first C app was a simple todo app
23:16belakMight be worth doing something like that again