2014-07-13
| 00:05 | seancorfield | be nice to have some ops in here to kick/ban the spammers |
| 00:10 | seancorfield | looks like technomancy is on the channel access list but is not an op? |
| 00:24 | technomancy | I'm an op when I need to be an op. |
| 00:24 | technomancy | which as far as I can tell is not right now? |
| 00:25 | systemfault | Idiots tend to learn languages like PHP, C, Java… not Clojure. Been on the channel for months now, it’s an amazing community and I don’t remember seeing any OP |
| 00:31 | Zardoz | ls |
| 00:31 | lazybot | bin lib lib64 lost+found mnt proc run srv |
| 00:31 | @technomancy | oh, just got PM spam |
| 00:31 | Zardoz | that was definitely the wrong window :P |
| 00:32 | gfixler | Zardoz: but it worked! |
| 00:33 | gfixler | ls mnt |
| 00:33 | lazybot | etc home media opt proc run srv tmp |
| 00:33 | gfixler | ls mnt/home |
| 00:33 | lazybot | bin boot home lib lib64 lost+found opt proc root srv sys tmp var |
| 00:33 | Jaood | systemfault: what was your point? |
| 00:47 | andyf | Mostly a test message to see if spammers are around and what that looks like -- working on cheatsheet/Grimoire touchup enhancements |
| 00:53 | mthvedt | ls mnt/home/home |
| 00:53 | lazybot | boot dev etc home lib64 sbin srv tmp |
| 00:53 | mthvedt | ls mnt/home/home/home |
| 00:53 | lazybot | dev home lost+found opt proc root srv tmp |
| 00:53 | mthvedt | ls foo |
| 00:53 | lazybot | boot dev etc mnt proc run sys usr |
| 00:54 | technomancy | ls ignores its args is what you're trying to say, eh lazybbt? |
| 00:54 | lazybot | home lib64 opt run sys |
| 00:54 | technomancy | bot |
| 00:54 | technomancy | wait what? |
| 00:54 | mthvedt | sudo ls -R / |
| 00:57 | trptcolin | https://github.com/Raynes/lazybot/blob/04fd054199a3f9c862714b1e0430bb1c9cb57912/src/lazybot/plugins/unix_jokes.clj#L9-L16 |
| 01:04 | seancorfield | technomancy sorry... i went off to #freenode and was asking about staff and access list there... you'll see i posted to clojure-dev about it... |
| 01:05 | seancorfield | was that kikinii that you kicked/banned? |
| 01:05 | technomancy | yeah |
| 01:05 | technomancy | I'm not on clojure-dev any more |
| 01:05 | technomancy | another op would be a good idea |
| 01:07 | amalloy | technomancy: yeah, lazybot's response to ls is to randomly choose 5-10 of the directories in / and print them. it's fun watching people try to "hack" that |
| 01:08 | seancorfield | technomancy didn't realize you'd dropped off clojure-dev, sorry |
| 01:09 | seancorfield | after all, i'm freenode nearly 24x7 :) |
| 01:11 | seancorfield | i |
| 01:12 | seancorfield | i'm _on_ freenode nearly 24x7... |
| 01:12 | seancorfield | that's what i get for typing while watching R.I.P.D. ... :) |
| 01:16 | technomancy | I second amalloy, and as he's topped the karma list I think that counts as a third from lazybot |
| 01:16 | technomancy | motion passes |
| 01:16 | seancorfield | :) |
| 01:16 | technomancy | oh, I'm not authorized to change the access list |
| 01:16 | technomancy | welp |
| 01:16 | amalloy | oh man. guys. is there an acceptance speech? i'd like to thank my parents, and rich hickey |
| 01:17 | amalloy | but actually i have no idea how to use ops. i'm a very low-tech irc user |
| 01:17 | technomancy | amalloy: repeat after me: "Klaatu, verata niktu" |
| 01:18 | amalloy | i'm worried that phrase might summon aliens or something |
| 01:19 | Jaood | what's wrong with having one more op? seancorfield seems like a good candidate |
| 01:19 | technomancy | Jaood: I think that requires the power of a chouser-level thetan. |
| 01:20 | technomancy | chouser-level or higher, I mean |
| 01:20 | Jaood | we don't want him to slow down on java.jdbc anyways ;) |
| 01:21 | amalloy | i wonder if freenode ops would elevate technomancy, based on him being and op and no higher-powered ops having been in the channel for two weeks |
| 01:22 | technomancy | six months is enough time for freenode policy to consider a nick abandoned |
| 01:24 | Jaood | seancorfield vs amalloy on freenode |
| 01:24 | Jaood | 6 vs 3 years |
| 01:24 | Jaood | seancorfield wins |
| 01:25 | seancorfield | hehehe, well, freenode can't do much right now since our ops are all absent or expired :) |
| 01:25 | seancorfield | but hopefully the other ops will step in any not be expired? |
| 01:26 | nathan7 | oh hey |
| 01:26 | nathan7 | …nevermind that |
| 01:27 | seancorfield | and, Jaood thanx for the vote of confidence :) |
| 01:41 | hiredman | obviously we should only ever have one op at a time, with some kind of elaborate changing of the guard ceremony when who ever is an op goes offline |
| 01:44 | Jaood | seancorfield: :) |
| 01:45 | Jaood | the Clojure Programming book has the word "semantic" on every page :P |
| 01:54 | andyf | Test message to see if I still have nick andyf after the freenode effort to weed out the clonebots |
| 01:56 | Jaood | andyf: how we know its you? |
| 01:56 | andyf | Because I'm not advertising anything :) |
| 01:57 | Jaood | clever clone ;) |
| 01:58 | andyf | Apparently there is a musical piece titled "Return of the Clonebots" that someone has written, according to Google (not an ad or endorsement :-) |
| 03:41 | ivan | &(.getBytes "hello" "UTF-8") |
| 03:41 | lazybot | ⇒ #<byte[] [B@131c5291> |
| 03:43 | opqdonut | &(seq (.getBytes "hello" "UTF-8")) |
| 03:43 | lazybot | ⇒ (104 101 108 108 111) |
| 03:43 | ivan | thanks, that's much better |
| 03:52 | ivan | I really wish I could represent and compare bytestrings with the same convenience of Python 2 |
| 03:53 | ivan | right now I just wrote some software that breaks if file attrs are not UTF-8 |
| 04:18 | andyf | ivan: Sounds like something you may be able to write your own function for? Or does Python 2's bytestring comparison do something fancy that would be difficult to implement? |
| 04:21 | justin_smith | ivan: do you primarily care about the bytes (fixed size numbers) or the chars (which can have various encodings, and depending on encodings, various sizes) |
| 04:35 | ivan | andyf: yeah, it shouldn't be too hard, but return byte-arrays would annoy users who expect strings from my library |
| 04:35 | ivan | anyway I did it right and they'll have to use (map as-utf8 whatever) |
| 04:36 | ivan | justin_smith: I don't really understand |
| 04:38 | justin_smith | a jvm byte is 8 bits. a jvm char is natively 16 bits, but can have a variety of sizes in various supported string encodings. So do you care about the bytes, or the chars that the bytes represent? |
| 04:40 | ivan | I care about fidelity when dealing with the bytes that I get from POSIX APIs like listdir or llistxattr |
| 04:45 | justin_smith | a UNIX file name is just a sequence of bytes, the kernel knows nothing about encoding |
| 04:45 | ivan | Python 2 is particularly convenient because you get the punt on the encoding, put bytestrings in your source (without .getBytes or whatever), compare bytestrings |
| 04:46 | ivan | is #bin in edn a thing? I saw puget printing it (#bin base64stuff) and it's awful |
| 04:46 | justin_smith | I think if you want fidelity to the original bytes, you should treat them as bytes, and not as chars |
| 04:46 | ivan | doesn't look like it re: edn https://github.com/edn-format/edn/issues/59 |
| 04:47 | ivan | justin_smith: yeah, I did |
| 04:48 | ivan | https://www.refheap.com/5e86bbb357a521fb3bcb38baf/raw this took over an hour to figure out :-) |
| 04:48 | justin_smith | ivan: I think I was confused by your term "bytestring" - in the jvm byte and string are two different things |
| 04:48 | ivan | indeed |
| 05:10 | ivan | http://dev.clojure.org/jira/browse/CLJ-1025 it sure would be great to have this (printing \u escapes in a bytestring representation is misleading and wastes some space) |
| 06:47 | mschuene | |
| 06:47 | mschuene | [Sun Jul 13 2014] |
| 06:47 | mschuene | *** You have joined channel #clojure [12:37] |
| 06:47 | mschuene | *** Topic for #clojure: Clojure, the language http://clojure.org | Currently |
| 06:47 | mschuene | at 1.6.0; top analysts expect this to be followed by newer versions with |
| 06:47 | mschuene | still higher numbers: |
| 06:47 | mschuene | https://github.com/clojure/clojure/blob/master/changes.md | discussion: |
| 06:47 | mschuene | http://groups.google.com/group/clojure |
| 06:47 | mschuene | *** #clojure: topic set by |
| 06:47 | mschuene | technomancy!~user@ec2-54-244-178-65.us-west-2.compute.amazonaws.com, |
| 06:47 | mschuene | 2014-03-26 17:33:15 |
| 06:47 | mschuene | *** Users on #clojure: mschuene edlothiol jmc75 jml kwladyka vyorkin |
| 06:47 | mschuene | dark_element mengu afhammad programmancer dark4eg malbertife deadghost_ |
| 06:47 | mschuene | nooga bryanmaass borkdude Gonzih sillyotter deevus rtra annapawlicka |
| 06:47 | mschuene | tgkokk kovrik Ven worrelsik vendethiel- d0ky yotsov onthestairs ambrosebs |
| 06:47 | mschuene | Bronsa onr sputnikus telex danvet zeebrah xjiujiu telser io2 vurma |
| 06:48 | onr | :) |
| 06:54 | annapawlicka | i thought i was being summoned :) |
| 07:47 | wink | anyone got a rough minimal ram figure for a very basic ring web app? I'm at 190MB now, that's not too bad, but still... |
| 08:20 | onr | wink: that sounds really bad |
| 09:30 | tvanhens | is there any way to "fake" saving a local file? I know thats not the right term, but I can't think of exactly what it is. Basically I am using the jopbox api and want to save some data to dropbox but I don't want to store that data on the local filesystem at all. The jopbox api uploads the file from a local directory to dropbox. Since heroku does not allow saving to the local filesystem, this is not possible (also seems like a bad |
| 09:30 | tvanhens | solution). Is there any way to pass in an argument thats like a "fake" local file which contains the data I want to save? |
| 10:57 | kegund | Day 3 w/ clojure. How to proceed? Emacs is now fully tweaked. I need to process a few sets of large sceince data in various ways. Any libraries to know about before starting? |
| 12:22 | broquaint | kegund: incanter? |
| 12:58 | lambda | Running cider-jack-in in emacs/osx is spitting out errors that basic unix commands are not found in lein script. |
| 12:58 | lambda | lein is working fine on the command line. |
| 12:58 | lambda | like, rm not found, etc. |
| 12:58 | lambda | Anybody has any idea what’s wrong with my emacs? |
| 12:59 | lambda | Starting nREPL server... |
| 12:59 | lambda | error in process sentinel: nrepl-server-sentinel: Could not start nREPL server: /usr/local/bin/lein: line 9: whoami: command not found |
| 13:03 | TimMc | lambda: /usr/local/bin/lein... how did you install lein? |
| 13:04 | TimMc | (I'm not sure why that would make a difference, though...) |
| 13:04 | lambda | TimMc: Using the lein script from the website |
| 13:04 | lambda | lein -v shows me Leiningent 2.4.1 |
| 13:04 | lambda | That’s on the command line |
| 13:05 | lambda | I don’t know how emacs is running it, but it’s not finding basic unix commands like rm and basename |
| 13:05 | TimMc | My lein doesn't have a whoami command in it. I wonder if that's a spurious line attribution. |
| 13:06 | catern | lambda: try M-! whoami |
| 13:07 | lambda | I did cat /usr/local/bin/lein | grep whoami and it’s there in the script |
| 13:07 | lambda | /bin/bash: whoami: command not found |
| 13:07 | TimMc | Weird. Not in 2.4.2. |
| 13:08 | catern | lambda: that's what you get from emacs? |
| 13:08 | lambda | heh, my emacs has gone bonkers |
| 13:08 | lambda | yeah |
| 13:08 | TimMc | lambda: Are you *sure* that's the lein from the website? That's where you put it? |
| 13:08 | catern | ok, so your emacs doesn't have the correct PATH env variable |
| 13:08 | catern | you're starting it wrong or something, I don't know |
| 13:08 | TimMc | (And not the remnants of some distro install?) |
| 13:08 | catern | here's a nickel, get yourself a better operating system |
| 13:08 | lambda | I see. I use zsh in os x but emacs seems to be using bash |
| 13:09 | lambda | I use Ubuntu for most of the stuff and cider is running fine there. I just need some work to be done on osx also. |
| 13:09 | TimMc | catern: Haha, that's from Dilbert, right? |
| 13:09 | catern | TimMc: yes |
| 13:10 | catern | lambda: okay, you persuaded me to help you. how do you start emacs? |
| 13:10 | lambda | I use Alfred, which just runs Emacs.app |
| 13:10 | catern | try starting it from the commandline and see if it works that way |
| 13:11 | lambda | I tried that, no difference |
| 13:11 | lambda | I’ll try to find how to fix bash environment for emasc on os x |
| 13:11 | lambda | It doesn’t seem to use my bash_profile |
| 13:12 | catern | when you run bash, everything works, right? |
| 13:12 | lambda | On the command line everything works, yeah |
| 13:12 | lambda | But I use zsh |
| 13:12 | lambda | Though I have set the same paths for both bash and zsh, and lein works in bash also |
| 13:14 | catern | right, the problem is with Emacs, not lein |
| 13:14 | lambda | Yeah, seems so. Purcell seems to have written a plugin just for osx emacs: exec-path-from-shell |
| 13:14 | lambda | Going to try that |
| 13:18 | amalloy | lambda: have you gone through http://www.emacswiki.org/emacs/EmacsApp#toc2 ? |
| 13:19 | amalloy | osx emacs traditionally gives you a stupid PATH unless you ask for a good one |
| 13:19 | lambda | I have gone through it before but will go over it one more time |
| 13:19 | lambda | Thanks |
| 13:20 | lambda | The path is not getting set properly even if I start emacs from command line, like that wiki page suggests |
| 13:25 | TimMc | I'm still confused where it's getting whoami from. |
| 13:28 | lambda | TimMc: I checked, it’s the Homebrew version that’s installed on this osx. |
| 13:29 | Bird|otherbox | happy now? |
| 13:32 | catern | huh? |
| 13:41 | daGrevis | how can i get random element from a map? rand-nth doesn't work |
| 13:41 | justin_smith | ,(rand-nth (into [] {:a 0 :b 1})) |
| 13:42 | clojurebot | [:b 1] |
| 13:42 | justin_smith | that's one way |
| 13:42 | metellus | daGrevis: do you want a random key, value, or kv pair? |
| 13:42 | TEttinger | ,(rand-nth (values {:a 1 :b 2})) |
| 13:42 | clojurebot | #<CompilerException java.lang.RuntimeException: Unable to resolve symbol: values in this context, compiling:(NO_SOURCE_PATH:0:0)> |
| 13:42 | Luyt | daGrevis: Maybe make a seq of it first? |
| 13:42 | metellus | ,(rand-nth (seq {:a 1 :b 2 :c 3})) |
| 13:42 | clojurebot | [:b 2] |
| 13:42 | justin_smith | yeah, you could just call rand-nth of keys / vals |
| 13:42 | TEttinger | ,(rand-nth (vals {:a 1 :b 2})) |
| 13:42 | clojurebot | 1 |
| 13:45 | daGrevis | metellus, pair |
| 13:45 | daGrevis | thanks, it makes sense |
| 13:47 | daGrevis | now, can I somehow unpack pair and give key and value a meaningful names? |
| 13:47 | justin_smith | for the into vs. seq, a rule of thumb would be to use seq if you are going to do it once, into if you are going to do it more (into has a higher overhead for making the result, but much faster lookup) |
| 13:47 | justin_smith | ,((fn [[k v]] {:key k :value v}) (rand-nth (seq {:a 0 :b 1 :c 2}))) |
| 13:47 | clojurebot | {:key :a, :value 0} |
| 13:48 | justin_smith | destructuring works nicely |
| 13:50 | daGrevis | justin_smith, https://gist.github.com/5c508b8eeebcd9eb6fa6 |
| 13:50 | daGrevis | how can i apply destructing to let's, I was thinking |
| 13:50 | justin_smith | daGrevis: (let [[k v] pair ...]) |
| 13:50 | daGrevis | oh |
| 13:51 | justin_smith | ,(let [[k v] (rand-nth (seq {:a 0 :b 1 :c 2}))] {:key k :value v}) |
| 13:51 | clojurebot | {:key :b, :value 1} |
| 13:51 | justin_smith | destructuring in arglists and let is identical |
| 13:52 | justin_smith | daGrevis: also, let is sequential |
| 13:52 | justin_smith | you don't need nested let |
| 13:52 | justin_smith | that is, binding n+1 can refer to binding n (unlike in common lisp) |
| 13:53 | justin_smith | ,(let [a 0 b (inc a) c (inc b) d (inc b)] d) |
| 13:53 | clojurebot | 2 |
| 13:54 | justin_smith | err, meant to have d be inc c, but you get the idea I hope |
| 13:54 | daGrevis | i hope so too |
| 13:54 | daGrevis | thanks :) |
| 13:55 | daGrevis | ,(let [x 2 y (* x 2)]) |
| 13:55 | clojurebot | nil |
| 13:55 | justin_smith | you would need to return one of those values :) |
| 13:55 | daGrevis | ,(let [x 2 y (* x 2)] y) |
| 13:55 | clojurebot | 4 |
| 13:56 | daGrevis | ;) |
| 13:56 | daGrevis | so it makes this https://gist.github.com/2dc82333bb437558d4cb |
| 13:56 | justin_smith | looks about right |
| 13:57 | justin_smith | also, you could optionally break the seq and rand-nth calls into their own lines, depending on what results in clearst code in the end |
| 13:57 | justin_smith | but that's a preference thing, of course |
| 13:58 | daGrevis | yes i will probably do that, but first i want my tests to pass |
| 13:58 | daGrevis | by the way, do I structure my tests correctly? https://gist.github.com/f26f15c7ea495238c57d |
| 13:59 | justin_smith | daGrevis: if you only have one testing per is, you can also just use the optional second arg to is |
| 13:59 | justin_smith | instead of the wrapping testing form |
| 14:09 | daGrevis | so I have this test in which I need to mock rand-nth to always return known entry. how can I do that? |
| 14:10 | daGrevis | i mean, is it possible w/o 3rd party? |
| 14:11 | daGrevis | i found with-redefs |
| 14:41 | Fare | which test framework do you recommend for simple testing? |
| 14:41 | Fare | and what do you recommend as a mechanism for reporting errors to the end-user? |
| 14:44 | justin_smith | daGrevis: is passing it a collection with 1 element / all elements identical out of the question? |
| 14:45 | justin_smith | Fare: for the former, clojure.test, for the latter, it depends on how the end user interacts with your project |
| 14:49 | Fare | I don't know yet. For now, I'm interacting at the REPL |
| 14:50 | Fare | parsing files in python, and wondering what's the right way of architecting the display of syntax errors |
| 14:54 | mi6x3m | is it idiomatic to call a listener in clojure on-something |
| 14:54 | mi6x3m | on-select for instance |
| 15:15 | justin_smith | even better, you can use CSP via core.async so you don't even need to do things in terms of callbacks, but yeah on-foo is a decent naming scheme for listeners |
| 16:25 | mbac | off topic but listen to some techno while you hack clojure why not? http://www.mixify.com/michael-bacarella/live/omfg-sunday-wtf/ |
| 16:26 | justin_smith | mbac: fyi, though we are pretty lenient about off topic stuff here, there is a #clojure-offtopic channel |
| 16:29 | mbac | word |
| 16:58 | augustl | does it make sense to depend on clojure.jar for a non-Clojure project where I want to use the data structures (just invoke the Java API)? |
| 16:58 | augustl | or: does depending on Clojure have side-effects |
| 16:58 | augustl | ? |
| 17:10 | ivan | augustl: maybe you want https://github.com/krukow/clj-ds |
| 17:10 | amalloy | augustl: it's perfectly reasonable to depend on clojure.jar from a java-only project that wants immutable data structures |
| 17:12 | augustl | ivan, amalloy: since clj-ds is on 1.5 at the moment I'd prefer to just depend on Clojure itself :) |
| 17:42 | TimMc | augustl: If you do: https://github.com/timmc/johnny/commit/340a217e4554ca296351affbc20911aeb805d85a#diff-0 |
| 17:42 | TimMc | (since RT.init() prints to stderr and is a lie) |
| 17:43 | mi6x3m | can one execute if-let with multiple bindings? |
| 17:44 | mi6x3m | ,(if-let [x nil y 2] nil nil) |
| 17:44 | clojurebot | #<IllegalArgumentException java.lang.IllegalArgumentException: if-let requires exactly 2 forms in binding vector in sandbox:> |
| 17:44 | mi6x3m | there's my answer |
| 17:45 | mi6x3m | ,(macroexpand-1 '(if-let [x nil y 2] nil nil)) |
| 17:45 | clojurebot | #<IllegalArgumentException java.lang.IllegalArgumentException: if-let requires exactly 2 forms in binding vector in sandbox:> |
| 17:45 | TimMc | mi6x3m: Various people have written if-let+ or similar. |
| 17:45 | TimMc | mi6x3m: Here's my version: https://github.com/timmc/handy/blob/master/src/org/timmc/handy.clj#L6 |
| 17:45 | mi6x3m | TimMc: true, question is whether it makes sense to use one of those :) |
| 17:46 | mi6x3m | TimMc: let me see :) |
| 17:47 | mi6x3m | TimMc: is your lib lein'd ? |
| 17:47 | mi6x3m | i see yes :) |
| 17:49 | TimMc | Other folks have made different variants. (Code repetition vs. thunk for else clause.) |
| 17:56 | mi6x3m | TimMc: i settled for yours, works nicely :) |
| 19:04 | gfredericks | have there been any attempts at enabling (somehow) annotating functions with example input-output, primarily for documentation, with optional test integration? |
| 19:04 | gfredericks | every time I embed example calls to a function inside a docstring it makes me a little sad |
| 19:07 | nathan7 | gfredericks: you could make a prototype that works now |
| 19:08 | nathan7 | gfredericks: a macro that replaces your defn with a version that *reads* that data and builds a regular docstring out of it |
| 19:09 | nathan7 | gfredericks: keeping the original docstring as :your.prototype/doc |
| 19:11 | gfredericks | so write a macro to use instead of defn? |
| 19:11 | gfredericks | so many prospective features have that as the only rational path to realization...doesn't seem scalable. |
| 19:17 | technomancy | gfredericks: there should be a convention for metadata that's not a docstring but still relevant to display when docstrings are shown |
| 19:17 | technomancy | :doc/examples [...] or something |
| 19:20 | nathan7 | gfredericks: it's very popular for many languages |
| 19:20 | nathan7 | gfredericks: ES6 promises were developed entirely outside the language, as just programs |
| 19:21 | nathan7 | gfredericks: like, what is becoming ES6 promises now — Promises/A+ was the 'prototype' |
| 19:28 | gfredericks | technomancy: yeah I was thinking that; but also you'd have to suggest how to render it? |
| 19:29 | technomancy | I wonder if the ^:internal convention from lein has caught on elsewhere |
| 19:44 | kristof | Weren't we just talking about that a few weeks ago? |
| 20:08 | arrdem | technomancy: what does ^:internal buy you? just a warning to the user? it's not like the compier warns that you're crowbaring into an "implementation detail". |
| 20:08 | arrdem | *compiler |
| 20:13 | gfredericks | I keep trying to design a generic defn-macro-creator so that you can mix together whatever features you're interested in |
| 20:13 | gfredericks | I wonder if nrepl's middleware model could make that sane |
| 20:14 | mdeboard | a macro macro? |
| 20:16 | gfredericks | eh, sorta |
| 20:16 | gfredericks | not as impossible to wrangle as a literal macro-macro |
| 20:16 | mdeboard | `,`@'body |
| 20:16 | mdeboard | night terrors |
| 20:17 | gfredericks | you'd implement feature by providing a middleware that transforms the form |
| 20:23 | TimMc | gfredericks: Yeah, the various defn macros are particularly non-composable. |
| 20:32 | TimMc | Middleware is the least offensive idea I can think of. |
| 20:41 | technomancy | arrdem: it's a warning to the user, yeah |
| 20:52 | verma | hey everyone, I am trying to learn clojure macros, I am trying to write a macro that would run the given body in reverse, like (do-reverse (print "hello") (print ("world")) should print "worldhello" |
| 20:55 | arrdem | verma: well your second print will try to call a string as a function which doesn't work.. |
| 20:55 | gfredericks | TimMc: that's a good description |
| 20:56 | verma | arrdem, sorry mistyped that |
| 20:56 | arrdem | verma: but such a thing is pretty easy. you just need a macro that splices the reverse of its arguments into a do form. I'd read up on macro splicing in clojure, the do special form and variadic functions. |
| 20:56 | verma | it is (print "world") |
| 20:56 | arrdem | verma: or I can just give you the answer now #spoilers |
| 20:57 | verma | arrdem I am trying to splice unquuote-splice the reverse, but its not working :( |
| 20:57 | verma | arrdem ~@(reverse body) |
| 20:57 | justin_smith | ,(do (defmacro do-reverse [& body] (cons 'do (reverse body))) (do-reverse (print "hello") (print "world"))) |
| 20:58 | clojurebot | worldhello |
| 20:58 | justin_smith | no need for syntax quote here |
| 20:58 | arrdem | justin_smith: eh... I'd write it as (defmacro do-reverse [& body] `(do ~@(reverse body))) rather than using cons but it gets you the same place. |
| 20:58 | verma | arrdem, justin_smith oh shit! :) |
| 20:58 | arrdem | SPOILERZ |
| 20:59 | verma | code is data is code is fucking hard for my brain :( |
| 20:59 | justin_smith | arrdem: my thought was, as a beginner it's helpful to explicitly work with the form, and then use the magic once it makes more sense |
| 20:59 | gfredericks | (apply concat (list (list (quote do)) (cond->> body true (reverse)))) |
| 20:59 | arrdem | justin_smith: meh they'll learn the macro syntax eventually if they don't see it first. I'd rather use it and teach it than leave it as black magic. |
| 20:59 | gfredericks | ^enterprise style |
| 20:59 | arrdem | lololol\ |
| 21:00 | verma | ok, I was missing the "do" |
| 21:00 | johnwalker | (inc arrdem) |
| 21:00 | lazybot | ⇒ 33 |
| 21:00 | verma | my first print was evalauating to nil which was being called as a function |
| 21:01 | verma | johnwalker, what's this? |
| 21:01 | johnwalker | verma: the inc? |
| 21:01 | verma | in inc arrdem specifically |
| 21:01 | verma | no* |
| 21:01 | johnwalker | it adds to a users reputation |
| 21:02 | verma | oh ok :) |
| 21:02 | arrdem | verma: note that normally inc is pure and has no side effects. here inc is a lie and has side effects :P |
| 21:02 | arrdem | &(-> 1 inc inc inc) |
| 21:02 | lazybot | ⇒ 4 |
| 21:03 | verma | lol |
| 21:04 | verma | can I not use ~@ outside of a macro definition? |
| 21:05 | justin_smith | verma: yes, but only inside ` |
| 21:05 | arrdem | no. ~@ is syntax-quote magic. |
| 21:05 | arrdem | eh... okay. I'm wrong and justin_smith is right |
| 21:05 | justin_smith | ,`(a b c) |
| 21:05 | clojurebot | (sandbox/a sandbox/b sandbox/c) |
| 21:05 | justin_smith | ,`(a b c ~@[0 1 2]) |
| 21:05 | clojurebot | (sandbox/a sandbox/b sandbox/c 0 1 ...) |
| 21:06 | justin_smith | clojurebot, that 2 is shorter than your ... |
| 21:06 | clojurebot | 'Sea, mhuise. |
| 21:06 | justin_smith | ~that 2 |
| 21:06 | clojurebot | that 2 is shorter than your ... |
| 21:07 | justin_smith | how do I make it forget things again? |
| 21:07 | gfredericks | ,(alter-var-root #'clojure.core/unquote-splicing (constantly (constantly 42))) |
| 21:07 | clojurebot | #<core$constantly$fn__4085 clojure.core$constantly$fn__4085@c25346> |
| 21:07 | gfredericks | ,~@(hehe) |
| 21:07 | clojurebot | #<CompilerException java.lang.RuntimeException: Unable to resolve symbol: hehe in this context, compiling:(NO_SOURCE_PATH:0:0)> |
| 21:07 | gfredericks | ,~@(:hehe) |
| 21:07 | clojurebot | #<IllegalArgumentException java.lang.IllegalArgumentException: Wrong number of args passed to keyword: :hehe> |
| 21:07 | gfredericks | ,~@(+ 1 2) |
| 21:07 | clojurebot | 42 |
| 21:07 | gfredericks | phew |
| 21:07 | arrdem | gfredericks: you broke the bot. wp. |
| 21:07 | gfredericks | ,(alter-var-root #'clojure.core/unquote (constantly inc)) |
| 21:07 | clojurebot | #<core$inc clojure.core$inc@192c07a> |
| 21:07 | gfredericks | ,~~3 |
| 21:07 | clojurebot | 5 |
| 21:08 | arrdem | verma: this is black magic. please don't try this at home |
| 21:08 | gfredericks | ,~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~0 |
| 21:08 | clojurebot | #<IllegalStateException java.lang.IllegalStateException: Attempting to call unbound fn: #'clojure.core/unquote> |
| 21:08 | gfredericks | ,(alter-var-root #'clojure.core/unquote (constantly inc)) |
| 21:08 | clojurebot | #<core$inc clojure.core$inc@1f530ab> |
| 21:08 | gfredericks | ,~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~0 |
| 21:08 | clojurebot | 42 |
| 21:08 | johnwalker | lol |
| 21:08 | verma | dafuq |
| 21:08 | verma | arrdem, not trying it .... yet |
| 21:09 | arrdem | verma: ~, `, ~@ and ' are hacks, gfredericks is mucking with the symbols they translate into and doing evil things |
| 21:09 | gfredericks | I dunno if I'd describe ' as a hack |
| 21:10 | fifosine | Anyone here familiar with working with Datomic? I'm trying to delete an entity but I get the error ":db.error/datom-cannot-be-altered Boot datoms cannot be altered: [:db/excise :db/valueType :db.type/ref 13194139534317 false]" |
| 21:10 | verma | arrdem, I am going to leave them alone for now |
| 21:10 | verma | :) |
| 21:10 | gfredericks | clojurebot: ' is not a hack |
| 21:10 | clojurebot | Ok. |
| 21:10 | gfredericks | ~' |
| 21:11 | clojurebot | ' is the quoting you want here |
| 21:11 | arrdem | verma: they're fine to use, just don't use alter-var-root until you're really really sure what you're doing. |
| 21:11 | gfredericks | only do it for funsies |
| 21:11 | arrdem | or when you need to add features to clojure.core :X |
| 21:11 | gfredericks | yeah I guess that doesn't preclude normal macro usage does it |
| 21:11 | gfredericks | ,~0 |
| 21:11 | clojurebot | 1 |
| 21:12 | gfredericks | ,(defmacro thing [x] `(identity ~x)) |
| 21:12 | clojurebot | #'sandbox/thing |
| 21:12 | metellus | ,~~0 |
| 21:12 | gfredericks | ,(thing 99) |
| 21:12 | clojurebot | 2 |
| 21:12 | clojurebot | 99 |
| 21:12 | gfredericks | arrdem: okay it's totes cool |
| 21:12 | gfredericks | rich put it there for such a time as this |
| 21:13 | gfredericks | ,(alter-var-root #'clojure.core/unquote (constantly reverse)) |
| 21:13 | clojurebot | #<core$reverse clojure.core$reverse@3af8a6> |
| 21:13 | gfredericks | ,~"foo" |
| 21:13 | clojurebot | (\o \o \f) |
| 21:13 | andyf | Mom, Gary's messing with the bot again! |
| 21:14 | verma | lol |
| 21:16 | arrdem | quick someone alter-var-root on eval to (constantly 42) |
| 21:27 | gfredericks | before it's too late! |
| 21:34 | masonn | does anything else besides false a nil evaluate to false in a boolean context? |
| 21:35 | masonn | and |
| 21:36 | justin_smith | masonn: false and nil are the only "falsey" values |
| 21:37 | masonn | nil is used to indiate no value? |
| 21:38 | verma | ,(into {] [[:hello "world" :bye "world"]]) |
| 21:38 | andyf | masonn: This is a real corner case, probably only arising if you do Java interop with Java Boolean values, but in Java and Clojure a freshly constructed Boolean object is treated as true, even if the value it contains is false: http://grimoire.arrdem.com/1.6.0/clojure.core/if/ |
| 21:38 | clojurebot | #<RuntimeException java.lang.RuntimeException: Unmatched delimiter: ]> |
| 21:38 | andyf | nil is Java null |
| 21:38 | gfredericks | masonn: or something |
| 21:39 | verma | ,(into {] [[:hello "world"] [:bye "world"]]) |
| 21:39 | clojurebot | #<RuntimeException java.lang.RuntimeException: Unmatched delimiter: ]> |
| 21:39 | verma | ,(into {} [[:hello "world"] [:bye "world"]]) |
| 21:39 | clojurebot | {:hello "world", :bye "world"} |
| 21:39 | andyf | masonn: Ignore that comment and link I sent you if you aren't doing Java interop |
| 21:39 | justin_smith | masonn: yes, it often comes from get with a selector that isn't in the collection |
| 21:39 | justin_smith | ,(get [] :a) |
| 21:39 | clojurebot | nil |
| 21:39 | verma | ,(into {} (partition 2 [:hello "world" :bye "world"])) |
| 21:39 | clojurebot | #<ClassCastException java.lang.ClassCastException: clojure.lang.Keyword cannot be cast to java.util.Map$Entry> |
| 21:40 | verma | how are these two different? |
| 21:40 | gfredericks | partition returns seqs |
| 21:40 | justin_smith | verma: a seq cannot be a map entry, a vector can |
| 21:41 | verma | justin_smith, hmmm |
| 21:41 | justin_smith | ,(into {} (map vec (partition 2 [:hello "world" :bye "world"]))) |
| 21:41 | clojurebot | {:hello "world", :bye "world"} |
| 21:42 | justin_smith | once you have vectors, it is fine |
| 21:42 | verma | justin_smith, hmm ok, thanks |
| 21:45 | justin_smith | ,(apply hash-map [:hello "world" :bye "world"]) verma: also, consider this |
| 21:45 | clojurebot | {:hello "world", :bye "world"} |
| 21:45 | verma | justin_smith, nice |
| 21:46 | verma | here it shouldn't matter if that second argument is a vec or a list, right |
| 21:46 | justin_smith | right |
| 21:46 | justin_smith | because apply is different |
| 21:46 | justin_smith | ,(apply hash-map '(:hello "world" :bye "world")) |
| 21:46 | clojurebot | {:hello "world", :bye "world"} |
| 21:46 | verma | nice |
| 21:46 | justin_smith | into is stricter (and faster, if things are already shaped the way it likes) |
| 21:56 | gfredericks | into doesn't need a top-level vector either |
| 21:56 | gfredericks | just that the pairs themselves are vectors |
| 21:56 | verma | haha shit man, macros so awesome |
| 21:56 | gfredericks | uh oh |
| 21:56 | verma | ama gonna create a new language using clojure |
| 21:57 | gfredericks | ,(defn impoverish [data] (clojure.walk/postwalk #(if (zero? (rand-int 2)) %) data)) |
| 21:57 | clojurebot | #<CompilerException java.lang.ClassNotFoundException: clojure.walk, compiling:(NO_SOURCE_PATH:0:0)> |
| 21:57 | gfredericks | nevermind I'm going to bed |
| 22:47 | Fare | debugged the lexer, now debugging the parser |
| 22:47 | Fare | what do you use to debug clojure code? |
| 22:49 | justin_smith | Fare: what I do is keep my functions as stateless as possible, and provide tests with the range of inputs selected. If those tests don't catch the error, then use an atom to record the inputs I actually get at runtime, and make tests out of those if they were not in the expected range. |
| 22:50 | justin_smith | s/selected/expected |
| 22:51 | justin_smith | also, move all possible logic out of stateful code and into stateless, so most everything can be trivially tested without magic or mocking |
| 22:53 | andyf | Fare: printf, clojure.tools.trace |
| 22:56 | Fare | justin_smith, yes, I'm writing in mostly pure functional style |
| 22:56 | Fare | so all the debugging is happening with pure functions |
| 22:57 | Fare | andyf: thanks! |
| 22:57 | Fare | FileNotFoundException Could not locate clojure/tools/trace__init.class or clojure/tools/trace.clj on classpath: clojure.lang.RT.load (RT.java:443) — it's not builtin? |
| 22:58 | andyf | also pprint is nice for big data structures, especially nested maps |
| 22:58 | Frozenlock | pprint is one of those function I'd like in every namespace in my repl |
| 22:58 | drusellers | agreed |
| 22:59 | andyf | Fare: no, a separate lib that you can add to your Leiningen dependencies, assuming you are using Leiningen. Line to add to your dependencies for latest version at the README here: https://github.com/clojure/tools.trace |
| 22:59 | justin_smith | also, if it was not clear, what I meant about the map thing was (def calls (atom {})) (defn debugged-f [args] (let [... result (frob args)] (swap! calls assoc args result) result)) |
| 22:59 | justin_smith | *the atom thing that is |
| 23:00 | Fare | [com.gfredericks/tools.trace "0.7.3-SNAPSHOT"] ? |
| 23:00 | justin_smith | that way you can use your repl to interactively look at the args / try variations, etc. |
| 23:01 | andyf | Fare: That looks like a version customized by someone else. The README I linked to says this: [org.clojure/tools.trace "0.7.8"] |
| 23:03 | Fare | that's the one I found on clojars |
| 23:04 | andyf | Clojure core team distributes their libs via maven.org repos. You can search for them at search.maven.org |
| 23:06 | Frozenlock | Before I start coding... is there a library to make tutorials for ring websites? |
| 23:06 | TEttinger | Frozenlock: ? |
| 23:06 | TEttinger | tutorial to make libraries, you mean? |
| 23:06 | Frozenlock | No, I mean what I said :-p |
| 23:06 | kristof | Fare: Hello! |
| 23:06 | kristof | Fare: What exactly are you working on? |
| 23:06 | brehaut | Frozenlock: O_o |
| 23:07 | Frozenlock | TEttinger: sya I have a website in ring. I'd like to make a tutorial to guide a user through many steps (pages). |
| 23:07 | Frozenlock | Surely this can be done with middlewares |
| 23:07 | Frozenlock | *say |
| 23:07 | Fare | kristof, still the same: a compiler for a pure python dialect |
| 23:07 | kristof | I never knew what you were working on :P |
| 23:07 | Fare | right now, debugging a python 3.5 parser |
| 23:07 | Fare | the lexer is pretty stable now |
| 23:08 | Frozenlock | Does my question make more sense now? :-p |
| 23:09 | TEttinger | yes, you kinda want a chain-of-pages thing |
| 23:09 | Frozenlock | Ahhh, that's the technical term I was lacking. Chain-of-pages. |
| 23:10 | Fare | ClassCastException java.lang.Long cannot be cast to java.lang.String clojure.lang.Compiler.analyze (Compiler.java:6464) — how do I get a backtrace? |
| 23:10 | Fare | (.printStacktrace *e) isn't very helpful |
| 23:11 | Fare | wow, the REPL is hosed. Is it worth trying to debug it? |
| 23:11 | Fare | I hosed it with (set! *file* 0) |
| 23:12 | TEttinger | Frozenlock, not a technical term at all! but it should be what you need, right? I mean even webcomics and blogs have a similar need |
| 23:12 | Frozenlock | Oh, wait, I'm not sure that's what I want. |
| 23:12 | brehaut | TEttinger, Frozenlock: pagination? |
| 23:12 | TEttinger | thanks brehaut |
| 23:13 | Frozenlock | Wow I must suck at explaining |
| 23:13 | Frozenlock | I'll be back... |
| 23:14 | TEttinger | Frozenlock, you want to have a continuous stream of read this->next->read this new thing->next, but also the ability to bookmark or skip around mid-way? |
| 23:14 | TEttinger | like http://www.xkcd.com/ |
| 23:15 | Frozenlock | https://www.refheap.com/88141 |
| 23:16 | Frozenlock | Is this more clear? |
| 23:16 | TEttinger | much |
| 23:16 | TEttinger | that seems like a common pattern, it could be a lib |
| 23:16 | TEttinger | but I kinda doubt it |
| 23:17 | Frozenlock | Well, that's why I asked. I don't want to redo what has already be done. (and probably of higher quality than what I could do) |
| 23:18 | Frozenlock | Seems like middlewares are an obvious solution for this. You can associate the tutorial to a ring session and just pop the stack at each steps. |
| 23:18 | TEttinger | I rewrote a java lib's Timer class in C# because synchronized doesn't behave like lock does. the original Timer class re-implemented functionality in java itself, I believe... |
| 23:18 | TEttinger | re-writing does happen for all sorts of reasons!Z |
| 23:21 | brehaut | Frozenlock: why does it need to be stateful? |
| 23:22 | Frozenlock | To know at which step the user is? |
| 23:22 | brehaut | the users client can track that? |
| 23:23 | brehaut | (ie, you send the link to the next step with the current step, and the client follows that as needed) |
| 23:23 | Frozenlock | as in "/tuto/1" "/tuto/2" ? |
| 23:23 | brehaut | sure |
| 23:24 | Frozenlock | Eh, sounds dangerous to me. What if the user clicks on something else? If it's in the session, you can see it and guide him back to the right place. |
| 23:25 | brehaut | if you arent tracking per user state, then its really non-dangerous. they can go back and forth as needed without you having to trak tha |
| 23:29 | Frozenlock | Dangerous to lose the user. He's at "/tuto/12" and then clicks on "/home" or whatever. |
| 23:30 | andyf | Fare: Can you do a paste of what (.printStackTrace *e) showed you? (clojure.repl/pst *e) may give a nicer format for Clojure stack traces. |
| 23:30 | andyf | but maybe not, depending on what it looks like |
| 23:30 | Frozenlock | Or do you think the user is smart enough to press 'back'? :-p |
| 23:30 | andyf | Also, don't do (set! *file* 0) :-) |
| 23:31 | Fare | andyf: nothing more than what I showed. Looks like the clojure runtime is just not prepare for *file* being of the wrong type |
| 23:31 | Frozenlock | But it would be simpler... I think the pages are already in HTML for the middlewares... |
| 23:31 | andyf | Fare: I've never tried that, but not surprised if that messes up something fairly deep down in the compiler |
| 23:32 | andyf | Fare: Strings are better :) |
| 23:33 | brehaut | Frozenlock: is this a tutorial for people recently defrosted from cryostorage? |
| 23:33 | Fare | (incredible how much smaller than the java code this parser is, btw) |
| 23:34 | Frozenlock | brehaut: I'd say for people who can't see a difference between IE and Chrome. "It's the Internet." |
| 23:34 | Fare | yeah, since my parser reports the value of *file* everywhere (or should I be using a different parameter?), I figured I'd bind it to something with a very short representation. What's shorter than nil? Why, 0! |
| 23:35 | TEttinger | Frozenlock, heh I installed an antivirus software for a woman who didn't know that yahoo was internet |
| 23:36 | Frozenlock | Yeah, I'm sure it's most of the population. We take so much information for granted... |
| 23:37 | Frozenlock | For example, I recently realized that using 'placeholders' in html forms is confusing for some people, because they think it's already filled. |
| 23:37 | xk05 | hm emacs-live with overtone looks interesting |
| 23:38 | xk05 | i've got a fender strat with a little 35w practice amp that i play around on, this would be a good backup |
| 23:40 | Fare | OK, one thing I'm missing for a full python 3.5 lexer is better unicode support. |
| 23:40 | brehaut | xk05: 35w is little O_o? |
| 23:41 | xk05 | 35 watts? yeah |
| 23:41 | Fare | is the solution ICU4J ? |
| 23:42 | brehaut | xk05: what constitutes loud then?! 5 watts is capable of pushing 100dB |
| 23:42 | xk05 | its about the size of a small desktop tower |
| 23:42 | xk05 | maybe i mean amps |
| 23:42 | brehaut | xk05: nobody measures amps in amps |
| 23:43 | Frozenlock | uh? |
| 23:43 | brehaut | xk05: that would super confusing too : |
| 23:43 | xk05 | actually its 38 |
| 23:44 | Frozenlock | Intensity is measured in amperes, is it not? |
| 23:44 | Frozenlock | You are kidding me... |
| 23:44 | justin_smith | Frozenlock: decibels |
| 23:44 | Frozenlock | (dec Intensity) |
| 23:44 | lazybot | ⇒ -1 |
| 23:44 | Frozenlock | (dec so) |
| 23:44 | lazybot | ⇒ -31 |
| 23:44 | Frozenlock | Stop using words as username! |
| 23:44 | brehaut | xk05: wait, is this a solidstate frontman? |
| 23:45 | Frozenlock | I meant electric intensity -_- |
| 23:46 | xk05 | it looks like this: https://reverb.com/item/141098-fender-frontman-pr-241-black |
| 23:46 | xk05 | clojure sure has come a long way |
| 23:46 | brehaut | xk05: yes thats solid state. as you were then. |