clojuredesign-podcast

Discussions around the Functional Design in Clojure podcast - https://clojuredesign.club/
sebastian 2019-12-14T10:28:48.005500Z

I've discovered your podcast a couple of weeks ago, listened through the entire back-catalogue and felt compelled to leave some positive feedback for you guys. The podcast is a great and fun ressource for me as a beginner to get an understanding of the fundamental differences when programming in a functional language. You are doing a great job with making fundamental concepts tangible. So thank you for that.

pez 2019-12-14T10:52:31.013600Z

^ What he said ^

sebastian 2019-12-14T10:54:46.015100Z

An interesting subject for me right now would be a comparison of the popular webstacks, what are the main differences between them and for which kind of web applications are they most suitable for. So, what would be best used for • bigger CRUD applications without very much dynamism • dynamic frontends with a REST/GraphQL backend • and what to use for security (perhaps users with roles, voting...) and authentication It is a deep and wide topic, I know, but perhaps you can speak from experience on what works well together. What are your thoughts on "frameworks" like Luminus which collect libraries and do some amount of scaffolding to plug these libraries together. Is it easy to exchange libraries in such a setup?

➕ 2
mmeix 2019-12-14T13:33:38.018Z

Congratulation and thanks for Episode 059 “Lining it up” - to fully understand the intent and motivation of Seqs is very useful!

👍 1
neumann 2019-12-14T18:35:36.018700Z

@sebastian I'm happy to hear you're enjoying the podcast. Thanks so much for the feedback!

neumann 2019-12-14T18:35:49.019Z

@pez Thanks also!

neumann 2019-12-14T18:37:18.020200Z

Web apps are a great topic. @nate and I work with them all the time. If we're not working on a data streaming system (with websockets, core.async, and Kafka), we're working on a web application.

neumann 2019-12-14T18:40:07.020900Z

It is a deep and wide topic. I'm putting it on our list. I'm going to think about how to approach it.

neumann 2019-12-14T18:40:23.021Z

@mmeix Thanks!

neumann 2019-12-14T18:41:38.022200Z

One thing comes to mind. The way ring handles requests is really interesting and idiomatic of functional programming too. There might be a nice way into the topic via that.

✔️ 1
neumann 2019-12-14T18:42:03.022800Z

We could also do an overview episode where we talk about different libraries we've used and what we think of them.

neumann 2019-12-14T18:42:37.023500Z

I find Luminus really interesting. I like how the authors didn't try to reinvent all the parts, but instead they found good parts and put them together.

neumann 2019-12-14T18:43:04.024100Z

I personally haven't used it yet because it was created after I had already figured out how to put the necessary parts together myself.

neumann 2019-12-14T18:43:26.024400Z

But I have used a number of the same parts that Luminus uses.

neumann 2019-12-14T18:44:06.024900Z

Even talking through the "layers": what they are and how they work could be helpful.

neumann 2019-12-14T18:44:14.025200Z

Thanks for the topic suggestion!

mmeix 2019-12-14T19:17:59.027Z

Lot of REPLing with seqs now (and just found rebel-readline by bhaumann 👍)

neumann 2019-12-14T19:33:54.027200Z

Oh yes! rebel-readline is fantastic!

mmeix 2019-12-14T20:29:51.027900Z

Another minor subject: “What are real usage cases for meta?”

nate 2019-12-14T20:30:50.028600Z

Ooh, that's a good one.

mmeix 2019-12-14T20:31:30.028900Z

(are there any? … will wait for Ep “Meta! Meta! Meta!” 😋)

nate 2019-12-14T20:32:43.030400Z

There have been many times I've come close to using meta, but I usually just merge things in to the main map or envelope.

neumann 2019-12-14T20:32:46.030600Z

@mmeix I agree with Nate, that's a good topic.

neumann 2019-12-14T20:33:09.031Z

Meta baffled me at first, but I've seen some good uses.

mmeix 2019-12-14T20:33:51.031700Z

I stumbled over this by trying (class …) and (type …) while reading (doc type) and (doc class)

mmeix 2019-12-14T20:41:46.032500Z

subtle differences in here:

mmeix 2019-12-14T20:42:40.032700Z

user=> (*type* '(1 2 3)) `clojure.lang.PersistentList` user=> (*type* (*seq* '(1 2 3))) `clojure.lang.PersistentList` user=> (*type* [1 2 3]) `clojure.lang.PersistentVector` user=> (*type* (*seq* [1 2 3])) `clojure.lang.PersistentVector$ChunkedSeq` user=> (*type* #{1 2 3}) `clojure.lang.PersistentHashSet` user=> (*type* (*seq* #{1 2 3})) `clojure.lang.APersistentMap$KeySeq` user=> (*type* {*:x* 12 *:y* 34}) `clojure.lang.PersistentArrayMap` user=> (*type* (*seq* {*:x* 12 *:y* 34})) `clojure.lang.PersistentArrayMap$Seq` user=> (*type* *"123"*) `java.lang.String` user=> (*type* (*seq* *"123"*)) `clojure.lang.StringSeq`

mmeix 2019-12-14T20:43:34.032900Z

have to think it over tomorrow (afterthoughts for Ep 059)

sebastian 2019-12-14T20:50:32.033100Z

and that is exactly the problem beginners like me face when coming to clojure. I'm a reasonably experienced web dev, so I know which general parts go into that kind of app but finding well established libraries that also work well together is another story 🙂

neumann 2019-12-14T20:53:39.033400Z

Yeah. I can see the difficulty with it. It really is a problem. @nate and I should definitely cover this more.

sebastian 2019-12-14T20:54:28.033600Z

both the ring and layers approach seem like a good way structuring this wide area. I'm exited about with what you come up 🙂

neumann 2019-12-14T20:56:02.033800Z

Oh! That's really interesting. Yes. Little differences. The ISeq is the parent interface of almost all of those, but it's interesting to see the cases where a Clojure function gives you something more specific (like clojure.lang.PersistentVector$ChunkedSeq.)

neumann 2019-12-14T20:56:16.034Z

@nate Check this out. Interesting!

neumann 2019-12-14T20:57:32.034200Z

@sebastian Thanks! It might sound a little strange, but I'm excited to see what we come up with too! We will start on a topic and we almost always end up having some of our own surprises as we explore it!

mmeix 2019-12-14T20:59:01.034400Z

(the capital “I” in ISeq is for Interface? is this JAVA-speak?)

mmeix 2019-12-14T20:59:24.034600Z

(no experience with JAVA here…)

neumann 2019-12-14T20:59:25.034800Z

Yes. It's a convention, but it is not mandatory.

mmeix 2019-12-14T20:59:31.035Z

ok

neumann 2019-12-14T20:59:35.035200Z

I = "Interface"

mmeix 2019-12-14T21:00:11.035400Z

and “A” as in clojure.lang.APersistentMap$KeySeq ?

neumann 2019-12-14T21:00:51.035600Z

"A" typically means "Abstract".

mmeix 2019-12-14T21:00:57.035800Z

ah, ok!

mmeix 2019-12-14T21:01:17.036Z

(thanks!)

neumann 2019-12-14T21:01:35.036500Z

The declaration:

public abstract class APersistentMap

neumann 2019-12-14T21:01:59.036700Z

So yes, it does mean "abstract" in this case.

neumann 2019-12-14T21:02:05.036900Z

(I wasn't 100% sure myself!)

sebastian 2019-12-14T21:13:17.037100Z

like your functional rom com

neumann 2019-12-14T22:14:06.037300Z

🙂