4 ms·
Clojure Zippers (2021)
- 0_gravitas 1y agoI've been using Clojure for a few years now and zippers have always been a blindspot (had no idea even _when_ they would be useful), this is a remarkable tutorial!
- CNNCultists 11mo ago[flagged]
- ngruhn 11mo agoI'm not sure if I get it. But I don't know Clojure syntax too well. Say I want to represent a slideshow state. I could do it with { slides: List<Slide>, current_index: Int } Or alternatively: { left_slides: List<Slide>, current: Slide, right_slides: List<Slide> } Is it fair to call the latter a Zipper?
- laszlokorte 11mo agoYes if List is immutable and the interface for stepping through the slides ist designed accordingly
- shakadak 11mo agoYes, although it's usually defined as: { slides_shown: List<Slide>, slides_left: List<Slide> } Where the head of slides_left is the current slide. Pretty much any recursive data structure can be derived into a zipper.
- wry_discontent 11mo agoI've used zippers a couple times. Once for navigating a collection of deeply nested routes in a webapp, and once for navigating deeply nested xml to grab very particular data. Both times it was pretty pleasant and nice to use. I wouldn't reach for them in most normal situations cause they're more complicated to get right than simple looping (or `clojure.walk/prewalk`), but if you have large semi-predictable data structures, you can do cool stuff with zippers.
- clem 11mo agoI've used zippers to edit parse trees. Very useful API, if a little user unfriendly.
- avbanks 11mo agoThis tutorial was extremely helpful, I was having a hard time grokking the power of zippers.