#clojure log - Mar 12 2016

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

1:19 cfleming: clgv: TEttinger: Sorry, I'm around more in Slack than in IRC these days.

1:22 TEttinger: ah, thanks for the heads-up

1:22 do I need an invite?

1:23 cfleming: I've had a nagging issue with dependencies not appearing in anything IntelliJ/Cursive sees except for the REPL

1:24 REPL allows me to import stuff fine, but the lein deps don't seem to appear at all in the editor

1:24 I don't know if this is a known bug or a config issue on my side

1:30 cfleming: TEttinger: I don't think so, I think you can sign up at clojurians.slack.com

1:30 TEttinger: Are you refreshing after adding them to the project.clj?

1:30 TEttinger: that's part of the issue too I think

1:30 it doesn't seem like quite a lot of options are present

1:30 let me check

1:31 cfleming: You should be able to use Cmd/Ctrl-Shift-A and search for Refresh Leiningen Projects, or you can open the Leiningen toolwindow.

1:32 I'm planning to add a warning soon that the current project.clj has been modified since the last refresh, with a shortcut link to refresh immediately.

1:32 This causes all sorts of problems for people, it's a real source of confusion.

1:32 TEttinger: hm, I just can't find refresh anywhere

1:32 http://i.imgur.com/JcFpKun.png

1:32 I'll try that shortcut

1:34 clicked the leiningen project refresh one, nothing seems different

1:34 cfleming: That's in the lein toolwindow?

1:35 Ok, do you see the dependency in External Libraries at the bottom of the Project view?

1:35 TEttinger: I don't have a lein toolwindow

1:35 cfleming: Sure you do :)

1:35 TEttinger: and no, only... a few things in external libs

1:36 cfleming: View->Tool Windows->Leiningen

1:36 TEttinger: I imported the project.clj, but I really haven't seen any lein tool window

1:36 ah!

1:36 listed there, but not in external libs

1:36 cfleming: So in the toolwindow, hit the refresh button there.

1:37 TEttinger: yep, did that, still not seeing the imports

1:37 it's a java class I'm trying to import, and it isn't from maven central or clojars if that matters

1:38 cfleming: You don't get any errors when refreshing your project?

1:39 TEttinger: no, it shows nothing

1:39 you can see why I was confused :) I think it may be a config issue

1:40 partially installed cursive or something. running community 15.0.4

1:40 cfleming: So just so I'm clear - this class comes from a dependency in your project.clj, right?

1:40 TEttinger: yes, let me actually gist that

1:41 cfleming: That dep isn't in maven central or Clojars, so you're installing it locally into .m2? Or using another repo?

1:41 That would be great

1:41 TEttinger: https://gist.github.com/tommyettinger/0259d15be0ce241e4a46

1:41 it's another repo

1:42 I could try a local install

1:42 hm, no

1:42 jitpack is great, but it changes some names

1:42 cfleming: Ok, so squidlib comes from the jitpack repo?

1:43 TEttinger: oh d'oh. I might have got it

1:43 it's possible it was already installed in my .m2 so the repl could see it

1:43 but the project.clj was looking for a weird name

1:43 cfleming: Ok - that -SNAPSHOT version is bizarre

1:43 Is that right?

1:44 TEttinger: yes

1:44 cfleming: Shouldn't that be master-SNAPSHOT?

1:44 TEttinger: and that wasn't the issue, the one I just said

1:44 let me check jitpack's docs

1:45 cfleming: Let me try to import that project, one sec.

1:47 TEttinger: I can't make heads or tails of this https://jitpack.io/docs/BUILDING/#multi-module-projects

1:47 it doesn't say if lein needs an extra section of some kind

1:47 cfleming: Actually, it looks like a lein problem

1:47 TEttinger: hm

1:47 I'm on 2.5.3

1:48 it's probably an ancient version

1:48 cfleming: I got your project.clj, and put it in a directory. lein deps :tree downloads a bunch of squidlib stuff, but doesn't add it to the dependencies.

1:48 TEttinger: eh... eh? eh.

1:48 that's bizarre

1:49 cfleming: I'd just download the repo and install it locally.

1:49 That should work.

1:49 I don't know what jitpack is doing, but lein doesn't like it.

1:50 TEttinger: trying master-snapshot now

1:50 yeah, jitpack is really fantastic for java dev

1:51 cfleming: Except that it doesn't seem to work very well :)

1:51 TEttinger: indeed, for clojure it needs way better docs :|

1:52 cfleming: It's not just that, it's doing something very strange:

1:52 https://gist.github.com/cursive-ide/4422cfa7e21ba4104403

1:52 TEttinger: the really strange thing is I don't see any transitive deps of one project that has a bunch

1:53 why... is it adding a dep to parent....

1:53 that's a pom-only parent project

1:53 no code

1:54 cfleming: Right, I don't think jitpack is handling the deps properly. I see it downloading jars, but they aren't put anywhere in the cache.

1:54 Actually, I lie, sorry, they're there - spot blindness.

1:55 Anyway, I'm not sure what the problem is sorry, but it looks like a lein issue. I think probably lein doesn't like that version much.

1:56 If you use the -v3.0.0-b3-g386143b-39 version, it works, at least for lein - I bet Cursive will pick them up too.

1:56 TEttinger: whaaaaaaaat is going on!

1:56 cfleming: It doesn't like the -SNAPSHOT version.

1:56 TEttinger: I tried lein deps :tree at the command line!

1:57 cfleming: Maybe it trims -SNAPSHOT from the version, or something.

1:57 TEttinger: and it doesn't see any deps other than clojure

1:57 cfleming: Right.

1:57 Or you mean you don't get clojure-complete or nrepl either?

1:57 TEttinger: sorry yes

1:57 I get those two

1:58 but they aren't listed as deps in project.clj, they could be implicit?

1:58 cfleming: Yes, lein adds them.

1:58 But that's what I meant above - lein doesn't add those deps.

1:58 TEttinger: hmm

1:58 cfleming: If you use the explicit version, it does, and I bet Cursive will see them then.

1:58 TEttinger: that is odd

1:58 ok, I will try

1:59 I would like to get a snapshot build but it looks out of the question somehow

1:59 cfleming: I think if you download the repo, and compile and install it locally, you can get a snapshot version.

2:00 But jitpack doesn't work for whatever reason. master-SNAPSHOT might work, though.

2:01 master-SNAPSHOT doesn't work either.

2:02 Got to go, sorry

2:03 TEttinger: you're a hero cfleming!

2:03 it works now

2:03 cfleming: With the explicit versions?

2:03 TEttinger: not -SNAPSHOT, but the example you give works

2:03 yes

2:03 cfleming: Nice!

2:03 TEttinger: thanks so much

2:04 as recompense, here's the cat who has been gradually forcing me out of my seat https://dl.dropboxusercontent.com/u/11914692/Satchmo_Portrait.png

2:20 cfleming: TEttinger: That's a pretty cute cat :)

2:20 TEttinger: he's a good un. loves water

2:21 he's happy about southern california getting some rain finally

7:45 pvinis: hello. when using cider and eval something, how can i keep the overlay after moving the cursor?

8:38 Xack: is it normal that `lein repl` uses around 300MB of RAM? :(

8:38 justin_smith: depends on your deps, but that sounds about right

8:39 Xack: if you follow the instructions for FAST_TRAMPOLINE that will also reduce RAM usage (by launching the process in the same VM instead of launching three vms total)

8:39 ~faster

8:39 clojurebot: faster is https://github.com/technomancy/leiningen/wiki/Faster

8:40 justin_smith: also if you avoid starting nrepl, you can cut it down to one vm running

8:40 Xack: :dependencies [[org.clojure/tools.nrepl "0.2.12"]]}}

8:40 i see, thanks!

8:40 justin_smith: that faster link also describes how to start clojure.main directly

8:41 nrepl has great features, but it also means you need two processes, the client and the server

8:42 if you are connecting from eg. an editor, you can trampoline repl :headless as well (still accepts connections, doesn't start a second client vm)

8:42 Xack: i see, thanks!

10:15 pilne: i feel like between clojure and clojurescript, using a browser for any "gui", is probably my best bet when it comes to what i'd like to create (relatively/easily portable x-platform (mostly desktop, possibly android, doubtfully iOS), applications, in terms of "learning" overhead. clojure seems to be one of the best 1:1 mappings of the jvm language to the js, but i haven't dug deep into scala or kotlin as much, due to... not liking

10:15 them as much, and i can be lazy...

10:17 and... i can't help that i think in s-exprs >.<

10:18 dysfun: clojure/script are a good combo for that. there's a phonegap extension that has up to date webkit as well

10:19 pilne: yes, i have it in the growing list of 'awesome stuff' links... too many bookmarks >.< lol

10:19 dysfun: i have that with pdfs of academic papers

10:21 pilne: i looked at doing the javascript all the way down thing like... node.js for a few days... and i'd rather have to treat my functions as "less capable" when going from jvm -> js, than try and make my "less capable" functions into "more capable" functions (at least that's how i felt writing js for a backend), and... a lot of my stuff is more compute oriented than io oriented for now.

10:21 ... don't get me started on my haskell addiction >.<

10:21 well, ghc... to be proper

10:22 dysfun: on the haskell side, i find haste better than ghcjs right now

10:22 ghcjs will be amazing when it's finished, but that's not today

10:23 pilne: right after i get a new install, comfy, i install leiningen, stack, virtualenvwrapper, and nvm. lol

10:24 dysfun: i currently have a project where stack is insufficient for papering over cabal hell

10:24 pilne: that's where i enjoy playing, kinda in an order of preference too, but i try to be pragmatic, and yeah, haste is approaching it like "haskell inspired" so they can play a bit more cut-and-loose, whereas ghcjs is like a complete reproduction (i feel)

10:24 i'm just a learner... still so.. it suffices for me *knocks on wood

10:25 and i get tempted to read about new languages more than i should >.<

10:25 * dysfun is currently learning julia, knows that story far too well

10:25 pilne: i have a love/hate/intrigue for julia and rust as well

10:26 dysfun: i have to confess i gave up on rust and chose modern c++ for my low level code

10:26 pilne: and nothing but respect for common lisp, scheme, racket either

10:26 rust is still... polishing (irony?)

10:26 dysfun: yeah, but i'll need to deploy before they get that far

10:26 pilne: i think anyone who likes clojure, could enjoy htdp and/or sicp implemented in racket

10:27 pragmatism is always the better way

10:27 it is possible to write "nice" c++, it just takes more effort lol.

10:27 dysfun: modern c++ is a different animal, but it's a huge language

10:28 pilne: yeah, you can avoid a lot of the pitfalls if you stick to as much 11/14 as possible

10:28 dysfun: yeah, i now require c++14 by default

10:28 pilne: still too big for my brain

10:28 i respect it, but fear it in my hands >.<

10:28 dysfun: some of my c++ is on the bleeding edge because it gives me the ability to achieve more safety

10:29 pilne: i'm cool with the 12guage that is macros, but not the vulcan cannon that is c++

10:29 dysfun: perhaps you'd like one of my projects that i've been hacking on today: simplified c++ with clojure syntax

10:29 pilne: O.o

10:29 that could be quite pragmatic in a lot of situations

10:29 that's like pixie.. but with balls

10:30 dysfun: i got fed up of not being able to have macros after a few months of c++ hacking

10:30 pilne: no offense to pixie btw

10:30 yeah, macros are what i hate the most when i'm not in a lisp... it's painful!

10:30 dysfun: i might be more interested in pixie if they got it off python

10:31 pilne: agreed, it made it easier, but... GIL >.<

10:31 and good c++ is easier to port around a bit imho

10:32 dysfun: so i'm building a cross-platform app (desktop and mobile) and the only way i can minimise repetition and have the option to replace guis is to use c++ for the bulk of the code

10:32 pilne: oh, and repls... mustn't forget those wonderful things :)

10:33 dysfun: naturally c++ is more annoying to bind than C, but oh well

10:33 i'm contemplating emscripten

10:33 pilne: if it needs a lot of efficient low-level access yeah, that would make sense, i'm not going quite that far yet, so jvm level should work fine for me

10:34 dysfun: yeah, there are some things you just don't do in java

10:35 pilne: every single platform out there has pros and cons, you just find one that has cons you can avoid or work with lol.

10:35 dysfun: that's your first job as a programmer, identify which things might possibly work for your use case

10:35 pilne: because if "rainbowshittingunicorn" lang existed, we'd all be using it.

10:36 it's like writing a sudoku solver in assembly by hand, sure you can, but why not prolog?

10:37 dysfun: because no.

10:37 pilne: lol

10:41 dysfun: pilne: have you use core.logic?

10:42 pilne: i haven't more than some passing intros yet

10:42 i do like what i've seen though :)

10:42 dysfun: likewise. i was hoping for a prolog user's view of it

10:43 pilne: it doesn't seem quite as "elegant" as prolog (but i'm an odd duck) for the syntax and application, but, it looks to be feature-complete, and integrates with a langauge that could add interesting functionality to the present-features

10:43 and a wild hyphen appears

10:44 dysfun: i think the design of the prolog standard library is really excellent, but i also think the same of clojure

10:45 pilne: in short, it's pros far outweigh it's cons, for me, i just dabbled in that 7 languages book enough to get an appreciation for prolog.

10:45 kinda blew my mind

10:45 dysfun: heh

10:45 i was reading the manpage for swipl the other day and it referred to the book i'm currently using as a rolling mat

10:45 pilne: lol

10:46 in ways it reminds me of fortran, like a razor in its intended domain, from an era where it was beneficial to have highly specialized programming languages

10:47 now we toss around gigabytes like they are nothing...

10:47 AimHere: Back in Fortran's day, it was pretty much the one programming language, and was necessarily general purpose

10:47 pilne: ghz, cores... pipelines

10:48 the application domain of computers was smaller then as well

10:48 the evolution and intermixing of different paradigms is fascinating :)

12:08 moredhel: hi, I'm having issues understanding why some code isn't working. I believe that what I have written is equivalent, so any help on describing what is actually different would be appreciated: https://gist.github.com/hamhut1066/d4fbcd67cc3ba3f303e2

12:11 opqdonut: ,(macroexpand-1 '(-> dna (map f) foo))

12:11 clojurebot: (foo (map dna f))

12:12 opqdonut: moredhel: ^ see, dna becomes the _first_ arg

12:12 ,(macroexpand-1 '(->> dna (map f) foo))

12:12 clojurebot: (foo (map f dna))

12:12 opqdonut: that's better: ->> puts it in last

12:13 ,(macroexpand-1 '(-> dna ((fn [x] (map f x))) foo))

12:13 clojurebot: (foo ((fn [x] (map f x)) dna))

12:13 opqdonut: ^ that's how you make the fn hack work: note the double parens

12:13 ,(macroexpand-1 '(-> dna (fn [x] (map f x)) foo))

12:13 clojurebot: (foo (fn dna [x] (map f x)))

12:13 moredhel: hmm, thanks. I had forgotten ->/->> were macros

12:13 opqdonut: ^ because this becomes nonsense

12:13 moredhel: if you want nonmacro, just use comp

12:14 moredhel: no, I'm more than happy with macros :)

12:14 opqdonut: remember macroexpand-1, it's your friend

12:14 moredhel: yeah, I was looking into that, but there doesn't feel like it's necessary, as the functions are statically defined

12:16 hmm, see, this seems to work... (macroexpand-1 '(->> "AAB" (map opposite-strand)))

12:17 until I actually try and execute it, and it fails.

12:17 (map opposite-strand "AAB")

12:17 should work

12:17 opqdonut: what happend when you try to execute?

12:18 moredhel: nvm, I was throwing an expected error, my fault.

12:18 opqdonut: :>

13:16 sdegutis: How can a deftype call one of its own methods? Like, (deftype Foo [] IFoo (calling-from-method [this] (some-method 123)) (some-method [this n] ...))

13:16 What's the syntax and is it even possible?

13:18 justin_smith: sdegutis: of course it's possible, since you can only define methods that are already defined in a protocol or interface

13:18 you can simply call them

13:18 sdegutis: justin_smith: so then I have to :refer those methods into the current namespace or something?

13:18 If so, "ugh, okay, fine then I guess"

13:19 justin_smith: sdegutis: no, if you do (deftype Foo [a b] IBar ...) then clojure knows to look up the following method definitions in the IBar interface

13:19 you don't need any refer

13:19 sdegutis: Uh.

13:19 Hmm.

13:19 justin_smith: now if you want the function version of a protocol method, either call the properly qualified name of the method, or refer it - or hey maybe it just works you could try unqualified call.

13:21 sdegutis: Hmm yeah.

13:21 I'll just refer it.

13:22 Thanks justin_smith.

13:37 justin_smith: oh I was wrong, it's not the context of the protocol /interface you declare that would make it resolve, it would resolve the method the same way the method would be resolved in any other context

13:43 brianboyko: Hello. I'm trying to work through "Clojure for the Brave and True" but it seems like the instructions are out of date -- or I don't understand them."

13:44 I'm able to lein run "Hello world" but I can't build an uberjar that outputs "Hello World."

13:44 justin_smith: brianboyko: feel free to ask any specific questions here

13:44 brianboyko: Anyone here?

13:44 justin_smith: what happens when you try to run "lein uberjar"

13:45 brianboyko: It builds two files, both jars, one standalone.

13:45 justin_smith: right, the one with standalone in the name is the uberjar

13:46 on linux, you can run that jar, on other platforms you can run 'java -jar target/foo-standalone.jar'

13:46 or whatever the name, of course

13:46 brianboyko: Running this: java -jar app-1.0.0-SNAPSHOT-standalone.jar => no output to the console. But I'm on Linux.

13:46 justin_smith: brianboyko: so no error, it just isn't doing anything?

13:46 brianboyko: Nope.

13:47 justin_smith: what's in your -main definition?

13:47 brianboyko: (ns app.core (:gen-class)) (defn -main "I don't do a whole lot...yet." [& args] println "I'm a little teapot!" )

13:48 justin_smith: brianboyko: that doesn't print, that returns a string

13:48 to call println, you'll need another set of parens

13:48 brianboyko: I think I saw it as soon as it was all on one line.

13:48 justin_smith: returning a string doesn't do anything useful when running the jar

13:48 brianboyko: heh

13:48 brianboyko: So, basically () around println and the string?

13:48 justin_smith: brianboyko: right, in clojure () means "call this"

13:49 so println without the () is just a function, it doesn't get called

13:49 ,println

13:49 clojurebot: #object[clojure.core$println 0x577625cb "clojure.core$println@577625cb"]

13:49 justin_smith: ,(println)

13:49 clojurebot: \n

13:49 brianboyko: :)

13:50 Thanks. I may need your help. I'm a pig on rollerskates with lisp/closure

13:55 ulrichschinz: brianboyko, nice, so I think im gonna stay here... learning as well :) and maybe seing same questions i have ;)

14:02 brianboyko: Right now I'm pair-programming with my friend Josh, he just told me about Lighttable's support for LightTable's in-line evaluation.

14:03 justin_smith: careful with lighttable, last I heard it still had "lose all your code" level bugs

14:03 or, unsaved changes at least

18:35 adam1: Hi folks!

18:36 I'm quite new to clojure(script), such a wonderful language

18:36 qbg: hello adam1

18:36 adam1: I do have a question. I've installed leiningen but it's driving my crazy. I catt' start a repl, can't create a new project, can't do anything really...

18:37 For instance "Failed to resolve version for mies:lein-template:jar:RELEASE: Could not find metadata mies:lein-template/maven-metadata.xml"

18:37 I'm not behind a proxy, no idea why it fails :(

18:37 justin_smith: is that the only error?

18:38 adam1: No

18:38 "lein repl" results in a long error begining with "Could not transfer artifact org.clojure:tools.nrepl:pom:0.2.12 from/to central (https://repo1.maven.org/maven2/)"

18:38 justin_smith: can you share a paste of the full error output?

18:38 adam1: Sure

18:38 justin_smith: adam1: are you on ubuntu by any chance?

18:39 adam1: Yes, ubuntu gnome more precisely

18:39 justin_smith: this reminds me of an ubuntu issue (with a different error as the root cause)

18:39 they fucked up their java security certificate dep, and so the java process refuses to do the downloads

18:40 adam1: Arg, no solution then ?

18:40 justin_smith: oh there is, here's the link in case it is your issue http://askubuntu.com/a/635395

18:41 but I wasn't sure you were getting the same error, didn't want to jump to that conclusion

18:41 so if that doesn't fix it, please do share the whole error output on a paste site

18:42 adam1: Oh yeah ! Just ran the given command and it's fixed !

18:42 justin_smith: awesome, if this irc channel had a faq I would have to add that link

18:42 adam1: Thank you so much !

18:42 justin_smith: np, glad it was an easy fix

18:42 adam1: Repl and creating new projects works perfectly now :)

18:44 Well I'll go clojuring around and might come back here once in a while, bye !

18:46 rhg135: justin_smith: that's what facts are for

18:46 On clojurebot

18:46 justin_smith: oh, right

18:47 rhg135: Witty jokes are also an use

18:47 justin_smith: ~ubuntu is there's a simple fix for download failures on ubuntu http://askubuntu.com/a/635395

18:47 clojurebot: 'Sea, mhuise.

18:47 justin_smith: ~ubuntu

18:47 clojurebot: ubuntu is there's a simple fix for download failures on ubuntu http://askubuntu.com/a/635395

19:42 bendavisnc: hey guys, i'm still super new to learning clojure, and i was wondering if i could just throw out a few questions about clojure / lisp compared to non functional approaches like java

19:43 mainly what changes when thinking / dealing with things like interfaces and design patterns

19:43 are design patterns as much of a thing in the clojure world?

19:49 qbg: Are you comparing it to Spring's AbstractSingletonProxyFactoryBean?

19:54 ben_vulpes: bendavisnc: write a bunch of functions, and when that starts to hurt check in

19:55 if you really need protocols or interfaces, take a look at the reloaded libraries for how that's done

19:57 bendavisnc: ok so i'mma infer because i for some reason can't get a straight answer that the answer is "no, design patterns aren't as much of a thing"

19:57 justin_smith: I use the interpreter pattern in clojure all the time

19:57 some patterns are just the right way to use the language (because the language features support them directly)

19:58 bendavisnc: like let me throw a specific example

19:58 decorator? facade?

20:00 justin_smith: many typical usages of first class functions could be called decarator, in particular in middleware. But we don't tend to reference decarator by name.

20:00 bendavisnc: hmmm ok. thanks

20:00 i think i need to read this

20:00 http://mishadoff.com/blog/clojure-design-patterns/

20:00 ben_vulpes: no, "design patterns aren't much of a thing"

20:00 justin_smith: but it is different because instead of adding fields to a class, this is passing a function to another function and getting a new function back

20:01 bendavisnc: hmmm ok

20:03 i mean i've read a bit about protocols like seq. and idk... i assume the gof matra of "always program to an interface" is still true in lisp land? right?

20:03 justin_smith: bendavisnc: in a normal lisp it's so pervasively a single interface (list) that it's invisible

20:03 but yes, in clojure all the core functions call interface code

20:04 we do have more variety of interfaces than a typical lisp

20:04 bendavisnc: yeah i guess long story short. i've come to be really interested in clojure, but i've sorta hit somewhat of a wall when trying to figure out how to have basic extends style inheritance

20:04 justin_smith: bendavisnc: for example, it's actually impossible to implement methods on a deftype or defrecord call unless they are defined by some interface or protocol first

20:05 bendavisnc: don't

20:05 that is, don't use inheritence

20:05 bendavisnc: ok

20:05 justin_smith: bendavisnc: I think the book that would really help you is Joy of Clojure

20:05 bendavisnc: i've been reading clojure for the brave and true and really like it

20:05 but i've been sorta skipping around honestly

20:06 justin_smith: bendavisnc: one thing about clojure's design is that it's very opinionated, one of those opinionated things is the avoidance of concrete inheritence

20:06 ben_vulpes: (without clos, there's not much oop in clojure)

20:06 (that i've seen)

20:06 yonatankoren: clojure for the brave and true, 4clojure, and also Clojure for Machine Learning by Wali greatly helped me

20:06 bendavisnc: so if i have a basic inheritance situation though

20:06 justin_smith: ben_vulpes: every function is an object that implements callable,

20:07 bendavisnc: say i have an animal, a cat, and a dog

20:07 justin_smith: bendavisnc: then change your design such that you don't

20:07 bendavisnc: how do i split this code up?

20:07 yonatankoren: 4clojure is not a book btw, it's a set of exercises. I improved mostly from that (practice)

20:07 bendavisnc: where can i put dog/run, cat/run, animal/run?

20:07 yonatankoren: as an introduction clojure for the brave and true is a really good book

20:08 bendavisnc: this would just be like maybe one protocol and three def records ?

20:09 justin_smith: bendavisnc: don't use concrete inheritence, it's just clumsy in clojure and not worth it. Make an IAnimal protocol if you must, define the methods in that protocol, but that only defines signitures and does not implement any logic. Then implement it in Dog and Cat records

20:09 but you probably don't need to do any of that, and don't do it until you can prove you need to

20:09 bendavisnc: ok i think i hear you

20:10 i'm right in how i think you mimic let's say java style inheritance, but try to keep everything a plain function instead

20:10 ok let me ask one more question

20:10 kinda towards the annoying same vain, but different

20:11 justin_smith: bendavisnc: we wouldn't mimic java inheritence anyway - we don't abstract the jvm enough for that. When we inherit we produce actual bytecode for a class that inherits. But this tends to be a poor choice in clojure.

20:11 bendavisnc: would it be possible to use clojure to implement java interfaces though?

20:12 justin_smith: yes

20:12 bendavisnc: to define them, or extend them, yes

20:12 these are both actually quite easy things to do

20:12 bendavisnc: i'm thinking for like specifically android development where basically i just import one big jar for the implementations of my java interfaces

20:13 do ppl do that ever?

20:13 justin_smith: it's very easy to call java from clojure, or clojure from java, whichever makes sense situationally

20:13 bendavisnc: does that sound to weird or impossible?

20:13 justin_smith: there's projects for clojure on android yes

20:13 bendavisnc: i'm thinking about how big this clojure included jar will be

20:13 justin_smith: well, if you run clojure you need to load the compiler

20:13 bendavisnc: right ok. but i'm thinking more like normal java deployment. like more java centric maybe

20:14 justin_smith: sure, what we do is package an uberjar that includes clojure.core, and have clojure itself launch the code

20:14 this is neccessary because of the things clojure code is allowed to do at runtime

20:16 bendavisnc: alright. thanks guys. i'm real new to functional programming practice. thanks for bearing with me

20:38 troydm: how do I extend-type vector or generally any arbitary Sequence?

20:46 nvm figured it out

22:33 sharms: I have a two lists: x ([1 2]) and y (([3 4])) - what is the best way to join these together to make ([1 2] [3 4])? For y it could be deeply nested

22:41 justin_smith: sharms: so you don't know how y is shaped? what's the rule that decides what part of y you want?

23:09 Elijah1310: hey

Logging service provided by n01se.net