diff --git a/_data/git-log.json b/_data/git-log.json index 87ae572..4675f43 100644 --- a/_data/git-log.json +++ b/_data/git-log.json @@ -1 +1 @@ -[{"committer": {"date": 1544130061, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "author": {"date": 1544130061, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "tree": "43ff3a2ef1b335531ae9c2e8c21baf045428c89d", "parents": ["5edb0c0bd9718ac1ed85edba0cb0631f72af0cfe"], "commit": "b7112ed1b8d93be33274632144ca6b6ffad4ed59", "message": "remove infinite loop", "changes": [[9, 1, "_includes/analytics.html"]]}, {"committer": {"date": 1544127681, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "author": {"date": 1544127680, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "tree": "c52c67af38c6291d32add8944f121bc347066c45", "parents": ["a60bdf6b5c41d29c624a5f0ae03a7d030bc2af86"], "commit": "5edb0c0bd9718ac1ed85edba0cb0631f72af0cfe", "message": "updated git log", "changes": [[1, 1, "_data/git-log.json"]]}, {"committer": {"date": 1544127680, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "author": {"date": 1544127680, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "tree": "4620cf436c72473762976236feb4e10f388ce54e", "parents": ["2be3136cb36df23f2197d067fcb923169d3d87af"], "commit": "a60bdf6b5c41d29c624a5f0ae03a7d030bc2af86", "message": "refactor analytics to _includes", "changes": [[1, 0, "_includes/analytics.html"], [1, 11, "about.md"], [1, 11, "drafts/app-idea.md"], [1, 11, "drafts/boundaries.md"], [1, 11, "drafts/casual.md"], [1, 11, "drafts/invented-or-discovered.md"], [1, 11, "drafts/learnable-programming.md"], [1, 11, "drafts/power.md"], [1, 11, "drafts/regex-for-humans.md"], [1, 11, "drafts/visual.md"], [1, 11, "essays/sissies.md"], [1, 2, "ideas.md"], [1, 11, "notes/aaron-kent-call-9-15-17.md"], [1, 11, "notes/aidan-cunniffe-call-11-29-17.md"], [1, 11, "notes/andre-staltz-call-10-9-17.md"], [1, 11, "notes/andre-staltz-call-9-11-17.md"], [1, 11, "notes/bret-victor/SimulationAsAPracticalTool.md"], [1, 11, "notes/bret-victor/dynamicland.md"], [1, 11, "notes/bret-victor/explorable-explanations.md"], [1, 11, "notes/bret-victor/index.md"], [1, 11, "notes/bret-victor/kill-math.md"], [1, 11, "notes/bret-victor/learnable-programming.md"], [1, 11, "notes/bret-victor/magic-ink.md"], [1, 11, "notes/bret-victor/questions.md"], [1, 11, "notes/bret-victor/substroke.md"], [1, 11, "notes/dan-scanlon-call-9-5-17.md"], [1, 11, "notes/dataflow/advances-in-dataflow-programming-langauges.md"], [1, 11, "notes/dynamicland-zine.md"], [1, 11, "notes/future-authoring.md"], [1, 11, "notes/glen-chiacchieri-12-29-17.md"], [1, 11, "notes/halfway-there-cis-240.md"], [1, 11, "notes/historical-accidents.md"], [1, 11, "notes/jaime-brandon-call-12-12-17.md"], [1, 11, "notes/jaime-brandon-call-9-5-17.md"], [1, 11, "notes/jcr-licklider.md"], [1, 11, "notes/jonathan-edwards/06-14-18.md"], [1, 11, "notes/jonathan-edwards/07-10-18.md"], [1, 11, "notes/jonathan-edwards/08-21-18.md"], [1, 11, "notes/jonathan-edwards/09-26-18.md"], [1, 11, "notes/jonathan-edwards/10-09-18.md"], [1, 11, "notes/jonathan-edwards/11-09-18.md"], [1, 11, "notes/jonathan-edwards/11-21-18.md"], [1, 11, "notes/joy-js-review.md"], [1, 11, "notes/kevin-lynagh.md"], [1, 11, "notes/live/2018.md"], [1, 11, "notes/michael-nielsen.md"], [1, 11, "notes/nicky-case-call-11-1-17.md"], [1, 11, "notes/no-silver-bullet.md"], [1, 11, "notes/samuel-loncar.md"], [1, 11, "papers/comprehensible-frp/feedback.md"], [1, 11, "papers/comprehensible-frp/index.md"], [1, 11, "plan.md"], [1, 11, "principles.md"], [1, 11, "reflections/10.md"], [1, 11, "reflections/11.md"], [1, 11, "reflections/12.md"], [1, 11, "reflections/13.md"]]}, {"committer": {"date": 1544127559, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "author": {"date": 1544127558, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "tree": "e9fb4b2b120d753096ca6aa2825738f4c830cc2d", "parents": ["b443369e09913f7f6570c27334fb13e91c3d593f"], "commit": "2be3136cb36df23f2197d067fcb923169d3d87af", "message": "updated git log", "changes": [[1, 1, "_data/git-log.json"]]}, {"committer": {"date": 1544127558, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "author": {"date": 1544127558, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "tree": "64d022a162359763cc7a51cb00bd0be80b6116eb", "parents": ["16ebfed4e1047c0d6a15947e409258d0843c2435"], "commit": "b443369e09913f7f6570c27334fb13e91c3d593f", "message": "removed unbreakable-links", "changes": [[1, 1, "404.md"], [1, 1, "README.md"], [0, 1, "about.md"], [1, 1, "drafts/app-idea.md"], [1, 1, "drafts/boundaries.md"], [1, 1, "drafts/casual.md"], [0, 1, "drafts/invented-or-discovered.md"], [1, 1, "drafts/learnable-programming.md"], [1, 1, "drafts/legal-code.md"], [1, 1, "drafts/power.md"], [1, 1, "drafts/regex-for-humans.md"], [1, 1, "drafts/visual.md"], [1, 1, "episodes/1-welcome.html"], [1, 1, "episodes/10-unisons-paul-chiusano-on-how-abstraction-will-save-distributed-computing.html"], [1, 1, "episodes/11-how-reactjs-was-created-with-pete-hunt.html"], [1, 1, "episodes/12-research-recap-six-cycle-js-deep-dive.html"], [1, 1, "episodes/13-teaching-elm-to-4th-graders-christopher-anand.html"], [1, 1, "episodes/14-research-recap-seven-master-planning.html"], [1, 1, "episodes/15-raising-genius-with-scott-mueller.html"], [1, 1, "episodes/16-research-recap-eight-life-and-work-planning.html"], [1, 1, "episodes/17-bootstrapping-bubble-is-emmanuel-straschnov.html"], [1, 1, "episodes/18-research-recap-nine.html"], [1, 1, "episodes/19-building-universe-joe-cohen.html"], [1, 1, "episodes/2-research-recap.html"], [1, 1, "episodes/20.md"], [1, 1, "episodes/21.md"], [1, 1, "episodes/22.md"], [1, 1, "episodes/23.md"], [1, 1, "episodes/24.md"], [1, 1, "episodes/25.md"], [1, 1, "episodes/26.md"], [1, 1, "episodes/27.md"], [1, 1, "episodes/28.md"], [1, 1, "episodes/29.md"], [1, 1, "episodes/3-jonathan-leung-on-inventing-on-principle.html"], [1, 1, "episodes/30.md"], [1, 1, "episodes/31.md"], [1, 1, "episodes/32.md"], [1, 1, "episodes/33.md"], [1, 1, "episodes/34.md"], [1, 1, "episodes/4-research-recap-two.html"], [1, 1, "episodes/5-samantha-john.html"], [1, 1, "episodes/6-research-recap-three.html"], [1, 1, "episodes/7-lookers-lloyd-tab-on-growing-languages-through-deprecation.html"], [1, 1, "episodes/8-research-recap-four.html"], [1, 1, "episodes/9-research-recap-five.html"], [1, 1, "essays/sissies.md"], [0, 11, "ideas.md"], [1, 1, "index.html"], [0, 1, "journal.md"], [0, 1, "links.md"], [1, 1, "log.md"], [0, 1, "notes/aaron-kent-call-9-15-17.md"], [0, 1, "notes/aidan-cunniffe-call-11-29-17.md"], [0, 1, "notes/andre-staltz-call-10-9-17.md"], [0, 1, "notes/andre-staltz-call-9-11-17.md"], [0, 1, "notes/bret-victor/SimulationAsAPracticalTool.md"], [0, 1, "notes/bret-victor/dynamicland.md"], [0, 1, "notes/bret-victor/explorable-explanations.md"], [1, 1, "notes/bret-victor/index.md"], [0, 1, "notes/bret-victor/kill-math.md"], [1, 1, "notes/bret-victor/learnable-programming.md"], [0, 1, "notes/bret-victor/magic-ink.md"], [1, 1, "notes/bret-victor/questions.md"], [0, 1, "notes/bret-victor/substroke.md"], [1, 1, "notes/conal-elliott.md"], [0, 1, "notes/dan-scanlon-call-9-5-17.md"], [0, 1, "notes/dataflow/advances-in-dataflow-programming-langauges.md"], [0, 1, "notes/dynamicland-zine.md"], [0, 1, "notes/future-authoring.md"], [0, 1, "notes/glen-chiacchieri-12-29-17.md"], [1, 1, "notes/halfway-there-cis-240.md"], [1, 1, "notes/hilltop-lang.md"], [0, 1, "notes/historical-accidents.md"], [0, 1, "notes/jaime-brandon-call-12-12-17.md"], [0, 1, "notes/jaime-brandon-call-9-5-17.md"], [0, 1, "notes/jcr-licklider.md"], [0, 1, "notes/jonathan-edwards/06-14-18.md"], [0, 1, "notes/jonathan-edwards/07-10-18.md"], [0, 1, "notes/jonathan-edwards/08-21-18.md"], [0, 1, "notes/jonathan-edwards/09-26-18.md"], [0, 1, "notes/jonathan-edwards/10-09-18.md"], [0, 1, "notes/joy-js-review.md"], [0, 1, "notes/kevin-lynagh.md"], [1, 1, "notes/kill-html-css.md"], [1, 1, "notes/kill-primitives.md"], [0, 1, "notes/live/2018.md"], [0, 1, "notes/michael-nielsen.md"], [0, 1, "notes/nicky-case-call-11-1-17.md"], [1, 1, "notes/niko-autio-microeditor.html"], [1, 1, "notes/no-silver-bullet.md"], [0, 1, "notes/quotes.md"], [0, 1, "notes/samuel-loncar.md"], [1, 1, "notes/simon-friis-vindum.md"], [0, 1, "notes/stefan-lesser-12-13-17.md"], [0, 1, "papers/comprehensible-frp/feedback.md"], [0, 1, "papers/comprehensible-frp/index.md"], [0, 1, "plan.md"], [0, 1, "principles.md"], [1, 1, "prototypes/streamsheets/index.html"], [0, 1, "reflections/10.md"], [0, 1, "reflections/11.md"], [0, 1, "reflections/12.md"], [0, 1, "reflections/13.md"], [0, 43, "unbreakable-links/README.md"], [0, 186, "unbreakable-links/index.js"]]}, {"committer": {"date": 1544126259, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "author": {"date": 1544126257, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "tree": "9efe849f2906e841306859068ab2f063b25f5aa7", "parents": ["6251dd3936c7e37f4eaf05f381dec71b38b32b97"], "commit": "16ebfed4e1047c0d6a15947e409258d0843c2435", "message": "updated git log", "changes": [[1, 1, "_data/git-log.json"]]}, {"committer": {"date": 1544126257, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "author": {"date": 1544126257, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "tree": "cfc205e9afd7c39458149a92c752ed589a8f4192", "parents": ["ac3968a768d457c34ced3234b5c1f71752925990"], "commit": "6251dd3936c7e37f4eaf05f381dec71b38b32b97", "message": "fix things for jekyll doctor", "changes": [[2, 1, "_config.yml"], [1, 1, "episodes/34.md"]]}, {"committer": {"date": 1544022205, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "author": {"date": 1544022189, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "tree": "54b60b082dd447d9eeef50b4e8132984e17ae4ae", "parents": ["93028c9c45cbb73ac65d02b047dbc716acec4274"], "commit": "ac3968a768d457c34ced3234b5c1f71752925990", "message": "updated git log", "changes": [[1, 1, "_data/git-log.json"]]}, {"committer": {"date": 1544022205, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "author": {"date": 1544022189, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "tree": "22aa0286e3cba1f30a4c792f859fabda879d9222", "parents": ["800707f73c87840384f2b9a1ff65bba4399bc144"], "commit": "93028c9c45cbb73ac65d02b047dbc716acec4274", "message": "added episode 34; katherine ye", "changes": [[1, 1, "episodes/33.md"], [897, 0, "episodes/34.md"], [2, 1, "index.html"]]}, {"committer": {"date": 1543867662, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "author": {"date": 1543867661, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "tree": "584a58dcbb5ec4a7e325636cc2e7d10e8b14af0c", "parents": ["3fec824d6a70ba3ac0cca7f6dafb804dca11b867"], "commit": "00b5743987eb1fb411a56d2813bda342db678199", "message": "updated git log", "changes": [[1, 1, "_data/git-log.json"]]}, {"committer": {"date": 1543867661, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "author": {"date": 1543867661, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "tree": "1a860f4e7d216b0dacde48b54e47b8ebf1ea1e72", "parents": ["5f841a9e72a67ea1eb18712a35f6e3179b7c5918"], "commit": "3fec824d6a70ba3ac0cca7f6dafb804dca11b867", "message": "fix single l conal elliott typo", "changes": [[2, 1, "404.md"], [1, 1, "about.md"], [2, 2, "drafts/casual.md"], [6, 6, "episodes/33.md"], [1, 1, "journal.md"], [3, 3, "links.md"], [2, 2, "notes/bret-victor/learnable-programming.md"], [0, 54, "notes/conal-elliot.md"], [54, 0, "notes/conal-elliott.md"], [1, 1, "notes/dan-scanlon-call-9-5-17.md"], [1, 1, "reflections/13.md"]]}, {"committer": {"date": 1543859116, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "author": {"date": 1543859115, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "tree": "761b6681bd4515e4cf35d65bdd56fa825bf6b09c", "parents": ["91ca8d4875e5745f5f2826433e36bdc807170607"], "commit": "5f841a9e72a67ea1eb18712a35f6e3179b7c5918", "message": "updated git log", "changes": [[1, 1, "_data/git-log.json"]]}, {"committer": {"date": 1543859115, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "author": {"date": 1543859115, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "tree": "fc50959003ba0139494a244259844c3146a2c5cc", "parents": ["53f4eb1ffe778baf0fa7194b1dfcfefa15126f07"], "commit": "91ca8d4875e5745f5f2826433e36bdc807170607", "message": "udpate episode 33 transcript", "changes": [[308, 283, "episodes/33.md"]]}, {"committer": {"date": 1543854038, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "author": {"date": 1543854036, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "tree": "4957cd18d734b2c9d39e37941e801ac234b8251d", "parents": ["28d4fb3ec1aae8cb94b0c3dbcc7fff450193a789"], "commit": "53f4eb1ffe778baf0fa7194b1dfcfefa15126f07", "message": "updated git log", "changes": [[1, 1, "_data/git-log.json"]]}, {"committer": {"date": 1543854036, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "author": {"date": 1543854036, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "tree": "521e7ee83f7e7fc51f6b7e9e6d2f3c68482597c2", "parents": ["dab6c9032a60683fe1d5771d85cf771f4e7cfd93"], "commit": "28d4fb3ec1aae8cb94b0c3dbcc7fff450193a789", "message": "added episode 33, reflection 14 /about", "changes": [[659, 0, "episodes/33.md"], [1, 0, "index.html"], [9, 0, "reflections/14.html"]]}, {"committer": {"date": 1543836949, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "author": {"date": 1543836802, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "tree": "ea48ddbb738c35206e89d4e110417e618fc0f570", "parents": ["d8a3c8e853d50a11c6c556a9934c4cfcea7c1aeb"], "commit": "dab6c9032a60683fe1d5771d85cf771f4e7cfd93", "message": "updated git log", "changes": [[1, 1, "_data/git-log.json"]]}, {"committer": {"date": 1543836802, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "author": {"date": 1543836802, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "tree": "0b42ade66c8e3286eb9b632f98771dfb5c308759", "parents": ["e1e24399f616a6ebc30a028b701cd335696f1360"], "commit": "d8a3c8e853d50a11c6c556a9934c4cfcea7c1aeb", "message": "## Dec 3 2018 Notes\n\n* TOC\n{: toc }\n\n### First two weeks Dec 2018\n\nThis week, the focus is on the podcast and my freelance work. I would like to publish my reflection 14 episode as well as edit Katherine's episode and prep for and record Vlad's episode. Let's say the podcast will be Mon, Tues and Weds this week and I'll do freelance Thursday and Friday.\n\nNext week I want to focus on research, playing with Turbine and other p4 thoughts...\n\n### Equality of code\n\nI asked Paul Chiusano about hashing code that's equivalent but syntactically different, such as 1+x and x+1, and apparently Unison \"doesn’t normalize commutative operations.\" Some relevant links he sent me are [Normalizing](https://en.m.wikipedia.org/wiki/Normalization_property_(abstract_rewriting)) and [Rice's Theorem](https://en.m.wikipedia.org/wiki/Rice%27s_theorem).\n\n### p4 thoughts 12/3/18\n\n#### Start with non UI motivating problems\n\nA way to simplify this problem is to build an FP playground to solve normal FP problems with cyclical streams first and work our way up to UI:\n\n* Such as the problems that [Pane](http://joshuahhh.com/projects/pane/) solves\n* Here's an idea for a developer tool extension slice-and-dice playground thing. Here's a common pattern I found useful: \tquerySelect some nodes and map/filter over them a bunch, such as:\n\n```javascript\n[].slice.call(editorElement.querySelectorAll('*'))\n\n .map(e => [e, e.innerText])\n\n .map(([e, text]) => [e, text.match(/^(#+)\\s.*$/)])\n\n .filter(([e, m]) => m)\n\n .map(([e, m]) => [e, m[1]])\n\n .forEach(([e,m]) => {\n\n e.style.fontSize = (50 - (5*m.length)) || 3;\n\n e.style.marginBottom = 2 + \"px\";\n\n e.style.marginTop = 2 + \"px\";\n })\n```\n\nThe issue with this approach is that we may create a FP playground that won't scale up to cyclical UI problems...\n\n#### Fluidity is not the initial focus\n\nI realize that part of why structured editors haven't been able to compete with text-based coding is:\n\n1. Computers come with a hardware input device especially designed for text input: the keyboard!\n2. We all have spent dozens of hours learning to use this keyboard for text input!\n\nIt's simply not a fair comparison to expect a new interface to be as fluid as text from Day 1. Of course fluidity is important and of course making it work with people's existing hardware and skills will help with adoption, but they aren't the first things to worry about. Maybe the ultimate interface will require new input hardware and/or a lot of practice to get the hang of. Hopefully we can get away with the keyboard and mouse and make the onboarding simple, but we don't want to pigeonhole ourselves over it.\n\nThe initial focus should be on the comprehensibility of the code and the liveness of the experience. Liveness means that an incremental action should result in an incremental result. This is possible without fluidity, which means that \"taking the incremental action\" may not be ergonomic for some reason.\n\n(However, I will note that fluidity is SUPER important to me. I would love to build an interface that's only optionally dependent on the mouse.)\n\n#### All Literals are GUIs...\n\nIf we throw out text-based coding and agree to a structured editor of some kind, you may realize that we can automatically represent colors as a color picker instead of (or in addition to) a hex value or rgb value. Cyrus Omar has work where he embed's a regex playground right into the IDE. (As Tudor Girba says, whenever you leave the IDE, the \"I\" has failed.)\n\nIf you follow this line of thinking, you realize that ALL literals are GUIs! Numbers can be scrubbable or many other interactive representations, booleans are a checkbox thing... We can even nest GUIs! You could have a string as a widget which is basically a text box but you can add other arbitrary expressions inside - no more escaping characters necessary! Lists can be a specialized GUI where you can add and remove expressions or do comprehensions.\n\nWe can continue this idea for all kinds of expressions: if-expressions, pattern-matching, lambdas, function application... Can we build nestable custom GUIs for every part of System F/Haskell?! I think so!\n\nThe key here is the nestability. Normally a color picker or other GUI is a top-level thing. But why? I don't see any reason why it can't be as expression-like as coding.\n\nWhen you define a function it will default to a basic representation but it should allow you to *add a more specific GUI to represent your function!*\n\nThese thoughts were inspired mostly by Tudor Girba, but also are related to [Niko Autio's Microeditor ideas](https://futureofcoding.org/notes/niko-autio-microeditor.html).\n\nI am curious how to combine this idea with the ideas of Hazel and Josh's principle of radical visibility of preview evaluation with test data. Same with the hashing stuff. There are so many cool PX ideas to combine together!\n\nDrawing this out will be interesting. And if I can show how we can do any pattern from Haskell, completeness is guaranteed!\n\nIn terms of implantation, not sure if HTML or canvas is the way to go. Would be fun to play with Turbine on this project...", "changes": []}, {"committer": {"date": 1543248438, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "author": {"date": 1543248405, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "tree": "7490b1ed3c1ae081df8b4c51ea2aa366091543b7", "parents": ["273255117a506906cfd881f7a10f9fdd84630197"], "commit": "02e1e774e04695aacb476f1fa29c0ef5fb615630", "message": "updated git log", "changes": [[1, 1, "_data/git-log.json"]]}, {"committer": {"date": 1543248405, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "author": {"date": 1543248405, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "tree": "2a16f01ae8dc28d089f7e23a2d8051393b7550a0", "parents": ["c848c3d111893971f22972d8007f7de0229599e9"], "commit": "273255117a506906cfd881f7a10f9fdd84630197", "message": "## A productive few days in late Nov 2018\n\n* TOC\n{: toc }\n\n### Fun Calls\n\n#### JE\n\nWent really well. [Notes here.](/notes/jonathan-edwards/11-21-18) The end-result was that I should either find or build my own Reflex alternative in JS. It's easier to start from a compile-target, a DSL, than from a visual editor. Once I have this built, I can use it to think about visual abstractions to compile to it. And I can use the framework to build those abstractions in a bootstrappy way.\n\n#### Philip Tchernavskij\n\nPhD student in Paris also interested in the malleability of software, but coming from the HCI and political perspective. His work sounds a lot like Dynamicland.\n\n#### Kartik Agaram\n\nAnother person interested in the same goal / themes of software malleability. It's really fun to chat with people like Kartik and Philip where we agree so much on goals but are coming from different places and see entirely different implementations of these ideas. I got Kartik, to agree to [record the conversation as an experiment](https://www.youtube.com/watch?v=DuMdDXCMDk0). I think it went well. Apparently 18 people watched it. Maybe if we continue chatting from where we left off, I can grab the audio from the conversations and turn it into a podcast. Or maybe we can do a podcast from scratch at some point.\n\n### Blinknote\n\n
\n\n\nThis was a really fun project, and it really energized me. In my head, hacking this together was like running up a hill and the prideful energy I felt afterwards was like running down the hill and I still feel like I'm running downhill three days later! I am actually writing this journal entry in Blinknote. It's so amazing to use tools that you make yourself. So much pride. It definitely encourages working and working with more of a smile. It also allows you to feel less boxed in - you can change things if they don't work for you.\n\nIt makes me even more excited for my vision of programming as allowing others to make their own tools, collaboratively. Working on ones own tools makes me think of whittling a spatula from a branch with a knife. However I don't think that's the right metaphor for my system because I want to highlight the collaborative nature more.\n\n### FoC London dinner\n\nThis was a lot more work than I expected, finding a restaurant, getting people to RSVP, setting up payments, emailing people, dealing with dietary restrictions, confirming with restaurant, people's plans change, etc. One way to keep myself sane during this process is not to judge myself on the outcome but on the process, and even by just the fact that I'm doing it, trying things. My refrain is \"full credit for showing up\". I hope it goes well Wednesday!\n\n### Kits vs apps\n\nThis is a common theme I've seen a lot ever since my visit to Dynamicland. I saw it again in Pharo and wrote up [a draft / ouline of an essay about it](https://futureofcoding.org/drafts/boundaries).\n\nI've never liked the kit idea. In another incarnation, it's \"everything is a document\". I think the STEPS project had this. It's always felt messy, ugly, and lame. On one level this is just a surface thing: overlapping windows, lots of gray top navs of windows, nested menus and right-click menus.\n\nHowever on another level it feels like the messiness is a bit real. For one, it's usual a dynamicly typed system. For another, it always feels less polished and usable than apps. As in, I can't imagine my mom using it.\n\n### I'm over the web\n\nThis is a big deal. For a while I've thought that HTML, CSS, and JS would be ok, as a compile target, but I no longer think so, particularly after Tudor showed me Pharo. He made the point that having everything in \"a single render tree\" is really key, and I don't feel I quite understand why but this does feel critical to me intuitively.\n\nDifferences include:\n\n* single render tree, mentioned above\n* different security model that will allow more things because it will expect users to understand more of the code they are \"importing\"\n* caching that will make more sense, better offline & online story, maybe some peer-to-peer in there too\n* different computational model from JS and HTML DOM\n\nThus my goal-system-I-have-no-name-for (wow, I really should come up with a working title for this... potluck? d1 for dream 1? I guess logichub could be d2?) will have to be built on a new system. Initially this system can be embedded within the web as a web app, but eventually I can imagine it having its own standalone \"browser\" that would work on various operating systems. Or I guess it could turn into an operating system itself!\n\nWhy start as a web app? I have to pick some platform and web is what I know best and I hate installing things and I love my chromebook so web seems like a solid pick.\n\nThe key question for all smalltalk-like systems: how do you prevent it from becoming its own universe? For example, Pharo or Lively Web.\n\nMy answer is that you start with single-user apps, starting with daily productivity tools, like notes, email, calendar, task management, and then once you have a critical mass, people will slowly spawn more ambitious projects that the community will use, and it will grow from there.\n\nI guess if it works within a webapp, people can use it on the web, so that's a pretty good story, as compared to Pharo which requires a download. So maybe the answer is that if we build it on the web to start with, it could seem like a website to most people, kinda like Lively Web or Tiddlywiki.\n\n### Fluidity vs structure\n\nI need to spend some time defining fluidity and structure, but this graph feels provocative:\n\n![](https://i.imgur.com/iVXH72a.jpg)\n\nI think fluidity has to do with live-ness, feedback loop speed, incremental actions causing incremental result, etc. And structure has to do with possible / impossible states, types, schemas. I'm stuck on where AST editors fit in this layout: they enable greater feedback loop speed knowledge of errors and prevent error states, yet they are not as fluid as using text but text doesn't give you as much info as fast.\n\nOne interesting note is that Airtable is particularly noteworth as having high structure and also high fluidity.\n\n### Conal -> Turbine\n\nJust as I decided (in the last meeting with JE) to build or find a JS lib for DCTP, I popped onto Twitter to find this:\n\n💭Yesterday I wished for a dream note-taking chrome extension
— Steve Krouse 🇬🇧 (@stevekrouse) November 23, 2018
🎁@dankantor supplied with me the initial code
👨💻I hacked for ~2 hours last night
✨I have a working Chrome extension! https://t.co/51Res4TnlI
\n\n\nWhich led me back to [Turbine](https://github.com/funkia/turbine), which I had found a few months back and mistakenly disregarded as the \"wrong kind of FRP\" as mistakenly interpreted their Now monad thing. I'm now quite excited about this library! I already sent two long emails to the creator, Simon, and hope he responds soon. Here's what I wrote I'd like to collaborate on:\n\n> 1. Documentation. For example, I had to figure out how `list` worked from reading the source and puzzling together a few examples without explanations. I'd love to help document every function in the API. (Additionally, I believe the code itself could use some comment documentation but that's more up to you.)\n>\n> 2. Understanding the types of the streams I'm working with would help a lot. Maybe getting TypeScript set up ([as I failed to do in the issue above](https://github.com/funkia/turbine-starter/issues/2)) would help here.\n>\n> 3. Being able to \"inspect\" streams better as a debugging and understanding tool. [CycleJS has this wonderful devtool](https://github.com/cyclejs/cyclejs/tree/master/devtool) and there are [a number of other really cool stream visualization tools](https://github.com/stevekrouse/futureofcoding.org/blob/95bad27a4d9e2bbd0b186b7683eecf97197fe068/drafts/frp.md#71-visualizations) we can draw on for inspiration. At the very least, a better `console.log` story would go a long way. It was really tough to figure out what was going on with my streams.\n>\n> 4. Collapsing higher-order streams is really hard, but luckily [this picture](https://user-images.githubusercontent.com/2288939/48842176-78ef8400-ed8b-11e8-8996-307d841f9ac5.png) makes it a LOT easier. It saved my life last night as I was working on my favorite FRP problem of [buttons that add buttons that add buttons... but only the odd buttons](https://codesandbox.io/s/w2kvqr5nw8). Maybe we can build on this picture somehow or at least incorporate it into the documentation...\n>\n> 5. [As stated in the issue above](https://github.com/funkia/turbine/issues/81), I don't like the way the model and view are separated. I wonder if it's possible to combine them like in Reflex and other \"original FRP\" frameworks.\n\nAnd after we/I work on these more pressing issues, the next step will be building a layer on top of that Turbine that would make the development experience *much* better. That is, building a GUI that \"compiles\" to Turbine, for example, kind of in the spirit of Conal's Tangible Functional Programming. Here I am referring to more radical ideas than improving the documentation or a simple devtool, such a projectional editor in the spirit of Lamdu, Luna, Isomorf, Dark, Unison, and Hazel.\n\n### Todos 11/26/18\n\n* wait for Simon palepind response\n * maybe get started on some of the issues: documentation, try to combine view and model, build 7guis things, play with TodoMVC if they have it (or build it)\n* reflection episode\n* edit Katherine podcast\n* [regroup projects](https://futureofcoding.org/log#possible-dec-2018-re-group-projects)", "changes": []}, {"committer": {"date": 1543238661, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "author": {"date": 1543238660, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "tree": "2a16f01ae8dc28d089f7e23a2d8051393b7550a0", "parents": ["7945e2ff22517fe650646561482c6872c0337879"], "commit": "c848c3d111893971f22972d8007f7de0229599e9", "message": "updated git log", "changes": [[1, 0, "_data/files.csv"], [1, 1, "_data/git-log.json"]]}, {"committer": {"date": 1543238660, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "author": {"date": 1543238660, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "tree": "c136dbf1360d9556af12be25a685dcd84a18fee6", "parents": ["1e4443578c9704843a082fc8dbfa03dbf087c561"], "commit": "7945e2ff22517fe650646561482c6872c0337879", "message": "added boundaries of apps outline draft", "changes": [[39, 0, "drafts/boundaries.md"]]}, {"committer": {"date": 1543237666, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "author": {"date": 1543237665, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "tree": "a9cbb5cdd3d6461888443694982f8f9211af5f27", "parents": ["befd86be4cf60da8bba5052379fe1db0220af116"], "commit": "1e4443578c9704843a082fc8dbfa03dbf087c561", "message": "updated git log", "changes": [[1, 0, "_data/files.csv"], [1, 1, "_data/git-log.json"]]}, {"committer": {"date": 1543237665, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "author": {"date": 1543237665, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "tree": "757dde3a7b1c2c822550837d564af676398432ad", "parents": ["bbe3c6ad56187b93440332568909dbe0e37ce81e"], "commit": "befd86be4cf60da8bba5052379fe1db0220af116", "message": "added JE meeting ntoes 11/21/18", "changes": [[79, 0, "notes/jonathan-edwards/11-21-18.md"]]}, {"committer": {"date": 1542805879, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "author": {"date": 1542805870, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "tree": "ea202405af27561551e5bf852147fa2d45569c02", "parents": ["783bcd703e182c7f639d3442d8e07fa6a1884929"], "commit": "bbe3c6ad56187b93440332568909dbe0e37ce81e", "message": "updated git log", "changes": [[1, 1, "_data/git-log.json"]]}, {"committer": {"date": 1542805870, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "author": {"date": 1542805870, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "tree": "5c4fd6191f7dadaf19ec03268acae090b071019c", "parents": ["717c4a653f1540907e06edddde02085041940878"], "commit": "783bcd703e182c7f639d3442d8e07fa6a1884929", "message": "## p4 thinking for JE meeting\n\n* TOC\n{: toc }\n\n### Theme of my work\n\nA fun question on Twitter yesterday encouraged me to think a bit broader as to an underlying theme to my work that would encompass this project, as well as other outside of \"improving programming\" (namely, LogicHub). I'm proud of what I came up with:\n\nStumbled across another *spot-on* post about FRP by @paldepind: "Let's reinvent FRP" https://t.co/Ga7ywHnySI .
— Conal Elliott (@conal) November 23, 2018
\n\n\n### Some responses about fluid Haskell\n\nSean McDirmid suggested Haskell for Mac, which is very cool and close to what I want so I installed it, but I wasn't able to see an easy way to get Reflex to work with it...\n\nLuke Iannini apparently worked on a [live recompiler for Haskell](https://github.com/lukexi/halive).\n\nThe monadfix people shocked me when they said:\n\n> None of us have been able to achieve the \"fluid, live Haskell programming experience\" that you're yearning for, even without \"has to work GHCJS\" as an additional constraint.\n\nMy new thesis is that this fluid Haskell doesn't really exist - at least for most Haskell developers.\n\nArtyom from monadfix was also very kind and commented on my issue about installing intero. Too bad they can't help here!\n\n### Biggest experience problems with Haskell/Reflex\n\nI made a full day's effort of trying to steelman Haskell/Reflex and make the experience as good as possible before trying to improve it - yet I just have such distaste for installing and debugging shit in the terminal (as well as using the existing Reflex setup I have) that I wonder if I can simply pull on my memory for the key issues...\n\n#### 1. Speed of feedback loop\n\nThe main thing was that speed of feedback on all fronts (syntax, types, output) was so slow and required so many keystrokes. In particular there were times that I could point to places in my code where I just wanted to know the type of something but did not know how to ask Haskell for that information.\n\n#### 2. API Discoverability\n\nIn other words, \"I have some things. I want some other things. What blocks can I use to go from what I have to what I want?\" In Scratch, all the \"legos are on the floor\" to help with this. I find that the lodash JS library also does a superb job of this. I found the Reflex documentation and the Haskell autocomplete tooling to feel like I'm basically guess and checking.\n\n#### 3. Plumbing code\n\nSuch as converting `Int` or `String` to `Text` and back, or worst of all, collapsing higher-order streams. I was very excited to find this extremely helpful video, [Real World Reflex](https://www.youtube.com/watch?v=dNBUDAU9sv4) last night which has a really wonderful slide to help with this:\n\n![image](https://user-images.githubusercontent.com/2288939/48842176-78ef8400-ed8b-11e8-8996-307d841f9ac5.png)\n\n#### 4. Visualize streams\n\nThis includes seeing the \"shape\" of streams and how streams make up other streams as in rxmarbles.com, as well as watching the live data flow through streams.\n\n#### 5. Direct manipulation\n\nThis whole thing won't feel natural without direct or bi-directional manipulation of the output because why not?\n\n### Next step ideas\n\n#### 1. Stay in Haskell\n\nContinue working towards a fluid experience in Haskell/Reflex.\n\n1. Find someone to help me setup a better experience and plow through.\n2. Make better documentation for Reflex\n3. Make better utility functions on top of Reflex so I don't have to do as much type conversion/plumbing\n4. Make a devtool for Haskell/Reflex to visualize the streams\n5. [I'd probably never get here] Use some of the bi-directional sketch-n-sketch work\n\n#### 2. Build/use JS library/framework\n\n1. Investigate CycleJS\n2. Look for another stream framework with higher-level and cyclic streams.\n3. See if I can only allow consts and no object modifications while still getting cycles (maybe use a fix-like thing?)\n\n#### 3. Build/use JS Haskell interpreter\n\n1. Investigate the two I already found [here](https://github.com/johang88/haskellinjavascript) and [here](https://github.com/evilcandybag/JSHC), the first of which comes with [an online REPL](http://hiji.tinyrocket.se/)\n2. Experiment with them to see if I can achieve a fast feedback loop\n3. Build a Reflex-like library on top of them\n\n#### 4. Build a higher-level system that compiles to JS\n\n1. Sketch out what it would look like, pulling inspiration from Facebook Origami, the rx visualization tools, the animation tools such as Principle For Mac, Josh Horowitz's [Pane](http://joshuahhh.com/projects/pane/) and what it references including [Aprt.us](http://aprt.us/).\n2. Prototype what \"format\" it would compile to in JS, be it a CycleJS data structure or something else\n3. Build it...\n\nI'm going to spend the next ~30 min doing the sketching discussed above in preparation for my meeting in a few hours with JE.\n\n### Todos 11/20/18\n\n* p4 next steps\n * read the first 6 chapters of TaPL\n * draw out what a better time would look like\n* [regroup projects](https://futureofcoding.org/log#possible-dec-2018-re-group-projects)\n* schedule JE podcast\n* edit Katherine podcast\n* prep for Tudor podcast", "changes": []}, {"committer": {"date": 1542802726, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "author": {"date": 1542802725, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "tree": "5c4fd6191f7dadaf19ec03268acae090b071019c", "parents": ["c67accbabc18fc099b4478e0e194fb75cb30af6c"], "commit": "717c4a653f1540907e06edddde02085041940878", "message": "updated git log", "changes": [[1, 1, "_data/git-log.json"]]}, {"committer": {"date": 1542802725, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "author": {"date": 1542802725, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "tree": "844810a9f18ee2521fb7d3aa8012f949e31da18c", "parents": ["ad1b9cf01d3fd7be3498444bc18b9e97ce0cfc31"], "commit": "c67accbabc18fc099b4478e0e194fb75cb30af6c", "message": "updated pane in live 2018", "changes": [[2, 2, "notes/live/2018.md"]]}, {"committer": {"date": 1542732647, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "author": {"date": 1542732568, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "tree": "010a32c4fc0d84c7a76ba07ede8d20cf10736038", "parents": ["3c4ba62e1637cc6424ddb27d2299752586553dec"], "commit": "ad1b9cf01d3fd7be3498444bc18b9e97ce0cfc31", "message": "updated git log", "changes": [[1, 1, "_data/git-log.json"]]}, {"committer": {"date": 1542732568, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "author": {"date": 1542732568, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "tree": "0430789c8be015f0c7df49169438524f20db22d8", "parents": ["8c51748313d96449c372baad1a9d9c9b6950777f"], "commit": "3c4ba62e1637cc6424ddb27d2299752586553dec", "message": "## Failing to achieve a fluid Haskell environment\n\n* TOC\n{: toc }\n\nToday I tried (and failed) to do the todo-item from yesterday of:\n\n> watch videos of expert Haskellers on Twitch and try to copy their setup\n\n### The chimera of a fluid Haskell\n\nOffloading mental tasks better done by computers to computers, so humans are freed up to think creative thoughts
— Steven Krouse (@stevekrouse) November 21, 2018
\n\n\nFirst I googled around, trying to find videos of this. Nothing came up that easily after 30ish minutes of looking. Haven't gotten anything on Twitter either.\n\n### Intero\n\nI then re-discovered [intero](http://commercialhaskell.github.io/intero/) which seems to promise 90% of what I was looking for, such typeahead suggestions, jump to definition, type of selection, and type errors as you type in the editor with underlines.\n\nI spend a 1.5 hours trying to get this to work, and failed. I had lunch and came back with the idea to [record it](https://www.useloom.com/share/80c4a4a43f5a4bff8eb207ceeeb96a98). It took me another hour to fail and produced [this issue](https://github.com/commercialhaskell/intero/issues/592).\n\nI emailed Chris Done (creator of intero) and [monadfix](https://monadfix.io), asking if I could pay them to help me set this up.\n\n### Todos 11/20/18\n\n(I put an asterix (*) next to the items that I can do tomorrow.)\n\n* p4 next steps\n * read the first 6 chapters of TaPL / finish Stephen Diehl's book*\n * find someone to help me set up fluid haskell setup\n * video myself building a few things in Reflex, talking out loud about my experience\n * make a list of all the bad experiences, and ways to improve them\n * draw out what a better time would look like*\n* [regroup projects](https://futureofcoding.org/log#possible-dec-2018-re-group-projects)\n* schedule JE podcast*\n* edit Katherine podcast*\n* prep for Tudor podcast*", "changes": []}, {"committer": {"date": 1542645441, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "author": {"date": 1542645420, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "tree": "0430789c8be015f0c7df49169438524f20db22d8", "parents": ["857951e243b5769ccd2ab62e42f149dc91748be4"], "commit": "8c51748313d96449c372baad1a9d9c9b6950777f", "message": "updated git log", "changes": [[1, 1, "_data/git-log.json"]]}, {"committer": {"date": 1542645420, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "author": {"date": 1542645420, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "tree": "f401b62c8107fd5e7905276459ab9b53f3881920", "parents": ["bfc39f68927dc52d8c17947e0f8e467629c6c4ce"], "commit": "857951e243b5769ccd2ab62e42f149dc91748be4", "message": "## Making the most of a lazy, jetlagged Monday\n\n* TOC\n{: toc }\n\nI woke early for an Alexander lesson this morning, which was a big mistake as I am not nearly over my jetlag. I went back to bed after getting back and thus didn't get much work done today. Maybe 3 hours of reading, as discussed below, and random Inbox tasks I get done after writing this for an hour or two.\n\n### Paths forward for p4\n(I wrote this section yesterday and the shower note before that.)\n\n![image](https://user-images.githubusercontent.com/2288939/48720162-0cec0f00-ec17-11e8-832f-a092e24d94f0.png)\n\nReflex is the closest thing to the way I think UI should be written and yet it's so crappy to use. I think that fixing the worst parts of this is a great first step. Of course there are many other things to improve such as direct-manipulation, visual metaphors, etc, but let's start with the most egregious places first.\n\n#### Path 1: use Haskell\nCan I turn off optimizing flags in compiler, use a linter or code augmenter, haskell-id (or whatever thing that auto-checks code), sourcegraph? Maybe watching Haskell developers on Twitch would give me a better sense of the state-of-the-art workflow.\n\n#### Path 2: use JS\nCycleJS or rolling my own thing.\nMaybe with JS linter to only allow consts and no object modifications (will be tricky to get cycles this way...).\n\n#### Path 3: build JS haskell interpreter\nBuild an interpreter with ability to swap nodes as running (like Scratch, Smalltalk)\n\n### Haskell interpreter in JS\n\nToday after my jetlag sleepiness I read another few chapters of Stephen Diehl's book [Write You a Haskell](http://dev.stephendiehl.com/fun/index.html), including typing, evaluation, type inference, and the higher-level design of a \"ProtoHaskell\". It seems like a tractable problem, mostly an engineering problem given that it's mostly \"solved\". I even found two already on Github [here](https://github.com/johang88/haskellinjavascript) and [here](https://github.com/evilcandybag/JSHC), the first of which comes with [an online REPL](http://hiji.tinyrocket.se/)! It would be interesting to test the speeds of these REPLS vs each other and GHC.\n\nNow that I know a bit more about how Haskell works under the hood, I wonder how I would implement the features that I think would make a better experience:\n\n1. Replacing expressions in the evaluation tree with other expressions as things are \"running\". In particular, I used to think I could evaluate the AST by visiting nodes one by one and I could replace an old subtree with a newer one, but now I'm not so sure that's how things work...\n2. Representing various expressions or terms as hashes. In particular, how would I represent closures or the environment in hashed terms?\n\nTalking with Cyrus Omar, the Lamdu team, Paul Chuisano, Stephen Diehl will be key in this process... I feel very lucky to be able to confer with the world experts on these topics!\n\n### Go back to drawing, Steve\n\nI can feel myself being pulled into \"engineering mode\" already and it's too early. I don't have my eye fixed on an experience target well enough to get dragged into trying to achieve it. For my work tomorrow, I shall draw out, in tedious frame-by-frame detail, what a simple experience with this \"ideal Haskell experience\" would look like. I wonder if I could make a simple stop-motion video out of it... The features I think are most important:\n\n1. When I type out a UI term, it should appear in view in under a second (or even less) and be interactive\n2. The types of every expression should be immediately accessible\n3. The operations I can perform on expressions should be suggested in an accessible way, as well as new expressions I can add in relevant places\n4. HMR\n5. Automatic plumbing code or plumbing suggestions for conversions between silly types like strings and numbers\n6. The live values running through the program should be tied to the static code somehow to give the types color\n\nFor contrast, I think maybe I should start by trying to accomplish a few UI tasks in Reflex and record them and then make a list of all the pieces of data I wanted to know or actions I wanted to be able to take faster.\n\n### Todos 11/19/18\n\n* p4 next steps\n * watch videos of expert Haskellers on Twitch and try to copy their setup\n * build a few things in Reflex and video myself not having a good time\n * draw out what a better time would look like\n * read the first 6 chapters of TaPL\n* [regroup projects](https://futureofcoding.org/log#possible-dec-2018-re-group-projects)\n* schedule JE podcast\n* edit Katherine podcast\n* prep for Tudor podcast", "changes": []}, {"committer": {"date": 1542233093, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "author": {"date": 1542233083, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "tree": "f401b62c8107fd5e7905276459ab9b53f3881920", "parents": ["fa7a4a794b3e257cb5240be91f92ec6b04bfd48b"], "commit": "bfc39f68927dc52d8c17947e0f8e467629c6c4ce", "message": "updated git log", "changes": [[1, 1, "_data/git-log.json"]]}, {"committer": {"date": 1542233083, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "author": {"date": 1542233083, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "tree": "a691b6fabbb7d6bf7b53d529c68bfa664a472044", "parents": ["9905ea021be45351f7265d8771ad79d8144ba2f1"], "commit": "fa7a4a794b3e257cb5240be91f92ec6b04bfd48b", "message": "## Mid Nov 2018 Many Thoughts\n\n* TOC\n{:toc}\n\n### SPLASH 2018 recap\n\nI normally don't like to travel but this trip was possibly the best thing I've had to travel for in my life. I'm very excited to do more things like this, maybe a couple times per year.\n\n#### Internet friends IRL\n\nI've been referring to this period of my life as my \"Twitter Friends Phase\" because I am making so many friends and then I also get to see them in person. Just in last week in Boston alone, here are all the amazing people I got to spend time with:\n\nWill Chriton, Joel, Jonathan Edwards, Ravi, Brian, Cyrus, Glen, Sean McDirmid, Paul Chuisano, Geoffrey Litt, John Maloney, Charles Roberts, Chris Granger, Eyal Lotem and Yair Chuchem from Lamdu, Roben Kleene, Daniel Moon, the ReScala team from Technische Universität Darmstadt (Ragnar, Pascal), Josh Horowitz, Roly Perera, Caleb Helbling, Evan Czaplicki\n\nSadly I only have one photo from the event. I should do better next time!\n\n![image](https://user-images.githubusercontent.com/2288939/48514489-683f8b00-e82c-11e8-91aa-6b54dd936273.png)\n\n#### LIVE 2018\n\nI have trouble with lectures. I'd much prefer sitting at home in my sweatpants, listening at 2x speed and bouncing if it's not for me right now. However, LIVE 2018 was one of the best days ever, not in spite but *because* it was a day full of mind-blowing demos one after another.\n\nI recorded them on my phone and uploaded online to a lot of thank-you's. The Bootleg page had a fun run, including Jeremy Asheknas's transcript which landed on the front page of HN for the day (not when I posted it, but when he posted it a few hours later).\n\n### Next Research\n\nI really have two very interesting directions to go in: making FRP experience better, or expanding the FRP universe to multi-node. We choose FRP experience for now, but I'm thinking about the other thing on the side.\n\n#### p4 11/14/18\n\n(Tracked at https://github.com/stevekrouse/futureofcoding.org/issues/86)\n\nThe goal is to submit this work to \\I've heard rumors of a fluid, live Haskell programming experience. Has anyone captured such a chimera on video?
— Steven Krouse (@stevekrouse) November 20, 2018
\n\n\n#### 2019 Conference deadlines\n\n- \\Preferences on potential new programming language name..?
— Steven Krouse (@stevekrouse) November 11, 2018
\n\n\nWhat field are these people of?
— Steven Krouse (@stevekrouse) September 15, 2018
Vaneer Bush (Memex), J. C. R. Licklider (ARPANET), Ivan Sutherland (GUI), Douglas Engelbart (computer mouse, “the mother of all demos”), Seymour Papert (LOGO), Alan Kay (OOP, desktop metaphor), Ted Nelson (hypertext), Mitch Resnick (Scratch)
\n\n\n### Reading\n\n#### Enlightenment now\n\nBest book I read this year. So amazing. What an optimistic vision for the future. The opening of the book has a quote from one of my dad's favorite philosophers, Spinoza, as well as one of mine, David Deutch. Highly recommend this book to anyone anywhere, but especially people who are anxious about the future. In short, I would vote for Stephen Pinker for president (of anything) after reading this.\n\n##### LogicHub + betting market\n\nRead this also gave me hope for a LogicHub platform for ideas. In the past, I figured we'd \"teach\" people to be logical and then let them loose to do their crowd-source-y thing, but after reading this book I wonder if we would want to make it more like a betting market in some ways. What's neat about a betting market is that:\n\n1. It encourages you to be more thoughtful because you're \"putting your money where your mouth is\"\n2. It allows people with contrarian opinions to move the market towards their opinion based on how sure they are on their opinion\n\nWhat's not great about a betting market is that its \"resulting\" (term from *Thinking in Bets*), the decision-making process is opaque so we can't share or improve on each others' thoughts. It'd be great if we could somehow create a place where you could show your decision-making-process as well as take a stand for your conviction and then eventually get the benefit (or not) when time shows \"who wins.\"\n\n#### How to change your mind\n\nTurns out many of our heroes in this \"field with no name\" did LSD and it got me pumped:\n\nAgreed that a name doesn't *really* matter, but as @geoffreylitt says, it's nice to be able to have a phrase instead of handwaving with "you know, the topics that we're interested, related to Alan Kay, Bret Victor, Engelbart..."
— Steven Krouse (@stevekrouse) September 17, 2018
\n\n\n#### Kartik Agaram\n\nMe finding Kartik's work is a success story in our wonderful internet research community. In the Future of Programming Slack, Stefan Lesser tried to galvanize us around RSS feeds, then Nikolas Martens posted his list, which Daniel Garcia then found Kartik's work in! Really a team effort.\n\nI am in LOVE with his /about page and want to use it as a jumping off point for a new draft of my own /about page:\n\n> I'm working on ways to better convey the [global structure of programs](http://akkartik.name/post/readable-bad). The goal: use an open-source tool, get an idea for a simple tweak, fork the repo, orient yourself, and make the change you visualized -- all in a single afternoon. Understanding a strange codebase is hard; I can't change that, but I think I can make it easier for people to persevere. I want to carve steps into the wall of the learning process. I want to replace quantum leaps of understanding after weeks of effort with an hour of achievement for an honest hour (or three) of effort.\n>\n> This focus on helping outsiders _comprehend_ a project is unconventional. I'm less concerned about the [readability](http://akkartik.name/post/readable-bad) of a codebase. I find the usual rhetoric around ‘readability’ tends to focus on helping authors merge contributions rather than helping others understand and _appreciate_ their efforts. If you've ever seen an open source project whose CONTRIBUTINGdocument consists of a nit-picky list of formatting rules and procedures for submitting patches, you know what I mean. There's a paucity of guidance earlier in the pipeline, when newcomers aren't thinking about sending a patch, just trying to understand the sea of abstractions, to keep their heads above water. I think improving this guidance might greatly increase the amount of citizen involvement in open source, [the number of eyeballs reviewing code](https://en.wikipedia.org/wiki/Linus%27s_Law), rather than simply using projects and treating their internals as [externalities](https://en.wikipedia.org/wiki/Externality)until the next [serious security vulnerability](http://heartbleed.com/). Our society is more [anti-fragile](https://en.wikipedia.org/wiki/Antifragile) when there's greater grassroots oversight of the software that is [eating our world](http://www.wired.com/business/2012/04/ff_andreessen/5).\n>\n> Everyone doesn't have to understand every line of code that helps manage their lives, but all software should _reward curiosity_.\n\nSurprisingly and also excitingly, I think Kartik and I disagree on a number of points on how to reach this shared goal. I'm excited to read some of his posts soon and figure out why. Here are some I want to start with (some were recommended by him and not written by him) but I imagine I'll read 'em all shortly:\n\n* http://akkartik.name/post/libraries\n* https://lobste.rs/s/zyomiu/what_does_it_mean_design_software_well#c_yvvkwm\n* http://wiki.c2.com/?BlubParadox\n* http://blog.cleancoder.com/uncle-bob/2017/10/04/CodeIsNotTheAnswer.html\n\n#### Spreadsheet-paradigm deep dive\n\nFor Dark, I did a deep dive on the spreadsheet paradigm. I want to write more about this but don't have the time at the moment. The thoughts are in [this private google doc I can hopefully make public soon](https://docs.google.com/document/d/14Tw387o_rnpa7Ru2n5ZpAabiCTrlm3Oan69UCmks6xE/edit#)\n\nOne fun picture (will find this later) is that Forms/3 beat APL at its own game (matrices) - I think they did a user study to \"prove\" this.\n\n🤯 Engelbart did LSD! To aid in problem solving!! (from “How to Change Your Mind”)
— Steven Krouse (@stevekrouse) September 18, 2018
\n\n\n### Last NYC FoP meetup\n\nThe NYC Future of Programming meetup went out with a bang. (It's likely not the last one forever, but it's the last before I move to London so will have to wait till I visit or someone takes it upon themselves to continue.)\n\nJason Brennan talked about Beach which was amazing. I find myself inspired by his ideas, including the infinite canvas for a programming language.\n\nThen after some technical (and climate) difficulties Corey spoke about his experiences from Eve. He mentioned how raising VC money probably wasn't the right move. Now he's finishing his degree and is teaching coding with robots and building his language/environment (called Mech) to support that. Mech is quite similar to Even in many respects, which is quite exciting.\n\nJosh Horowitz (from Dynamicland) talked about Pane, his functional programming node-and-wire prototype that he's presenting at SPLASH. One of the key ideas is that he's reversed it: the nodes are data and the wires are functions. This makes a lot of sense when you are trying to show the data. We met up afterwards to chat for ~2 hours about these ideas - hopefully we can meet up again this week to continue. My current thoughts are very much in this direction.\n\n### First podcast sponsorship offer!\n\nI got an email *during the Future of Programming meetup* from Amjad from Replit, offering to sponsor the podcast! This is a huge deal to me, even from just a \"stamp of approval\" perspective. But also the money will help pay for transcripts for episodes which people have been asking about, and other various upgrades. Big win!\n\n(I also want to be careful about this, so if anyone isn't down with this or how I mention them in the beginning of episodes, I am all ears.)\n\n### bretvictorfan.club\n\nI am sorry that this will make likely Bret uncomfortable, but I hope he'll realize that it's in the best possible spirit of love, respect, and admiration for his ideas.\n\nTurns out my seemingly-novel ideas for improving spreadsheets were in Lotus Improv in 1990 https://t.co/GF8B9l1sy0
— Steven Krouse (@stevekrouse) September 11, 2018
\n\n\n### shower notes july, aug, sept 2018\n\nI have been doing a poor job of moving my shower notes into a digital form of any sort over the past few months. I figured I'd put em all here in case anyone's curious. You never know - sometimes I get those \"in your shower notes from last year you said...\" emails.\n\n![image](https://user-images.githubusercontent.com/2288939/46044930-2b87cb00-c0ea-11e8-9855-c6113b619d33.png)\n\n### prototype 4\n\nThe [future work](https://futureofcoding.org/papers/comprehensible-frp/#7-future-work) section of my paper talks about visual metaphors for FRP. While I do think this is quite important in order to \"democratize visual intuition\" ([Penrose](http://penrose.ink/)), I wonder if it's necessary. What if we take normal FRP haskell-ish notation as a starting place and simply augment it with LIVE-ness, such as an interpreted environment, showing data, and evaluating as far as possible even when there are holes (Cyrus Omar's work). Geoff Litt and Paul Chiusano suggested that expressions with holes are just functions with those holes as parameters, and we could put a slider or examples values in there. Always concretions, never pure abstractions.\n\nHere's another idea I've been toying with: Jason's Brennan's notion of a programming environment on an endless canvas, like in Sketch or Photoshop. One thing this could enable is a structure-less structured editor - in that you could put together pieces of expressions in various places and combine them later. I guess this would be similar to Scratch or Blockly... which I don't love... One possibility is to use the layer metaphor from Photoshop as a programmatic abstraction, but I don't know what that would mean exactly yet.\n\nMy first thought was to build this as a FP thing first and build my way up to FRP. It could be the [data slice-and-dice ninja thing](https://futureofcoding.org/log#yesterday%E2%80%99s-slice-and-dice-data-ninja-playground), starting with JSON/CSV slice, dicing, and joining -- this is related to [datafun](http://www.rntz.net/datafun/).\n\nBut then I went ahead and did a drawings for it as an FRP platform:\n\n![img_0032](https://user-images.githubusercontent.com/2288939/46086431-122c6080-c176-11e8-8a3c-214ab5e09154.jpg)\n![img_0033](https://user-images.githubusercontent.com/2288939/46086528-4acc3a00-c176-11e8-9be7-d5e9017bca9a.jpg)\n![img_0034](https://user-images.githubusercontent.com/2288939/46086472-296b4e00-c176-11e8-9974-441aaf189d39.jpg)\n![img_0035](https://user-images.githubusercontent.com/2288939/46086469-26705d80-c176-11e8-85a8-852189cef443.jpg)\n\n### Accepted to REBLS 2018!\n\nVery exciting, getting my first paper accepted. Got a bunch of feedback to read and then incorporate. Will read it this afternoon, take notes, put them here, and then meet with Jonathan Edwards about it as well.\n\n### New framing of my work\n\n(This is related to the new /about page Kartik has inspired.) Software is never really ever started but only incremented, added to, improved upon. Thus the key is to shoot for customize-ability, modify-ability, change-ability, mold-ability - I want to evoke clay, play-doh, etc. This would truly catalyze the computer revolution because regular people would be able to *modify the software they use*. (The killer app for this language/platform could be a build-your-own-email-app thingy. I can imagine a world where top-level execs hire college grads to help them customize their email app workflow.)\n\nIn order to achieve this, we need the two pillars of comprehensibility (understand what's up quickly) and composibility (plug and play with existing pieces).\n\nFunctional programming is great but we need solid abstractions to fully liberate it from the Von Neuman architecture (Out of the tarpit, Conal). For example, Reflex > Redux (my paper), but we need to make FP and FRP usable with LIVE and other visualizations.\n\nCurrently, I'm working on drawing out various prototypes. I want to stay in this phase for a while, making sure I know what I want to build, getting feedback on it from Jonathan and other smarties. Next step is to scope it down to a reasonable prototype and to go code.\n\n#### New framing open questions:\n\n* would JetBrains MPS be hepful here as a way to build a structured editor for live-ness?\n* can I use an existing language or do I need to start that from scratch as well...?\n\n### Todos 9/26/18\n\n* Get replit.com sponsorship started (draft copy)\n* Fix up Explicitly Comprehensible by Sunday\n* Edit Nadia Eghbal podcast\n* Read all of [Kartik](http://akkartik.name/)\n * Re-do my /about page\n* Continue with prototype 4 / new framing of my work...?\n* Organize FoC Thinking & FoC Research lists from Google Inbox", "changes": [[1, 1, "index.html"]]}, {"committer": {"date": 1537799987, "timezone": "-0400", "name": "GitHub", "email": "noreply@github.com"}, "author": {"date": 1537799987, "timezone": "-0400", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "tree": "c3a43bbe3883e1720f5ebda45678f8806ecf390e", "parents": ["b16ded2435685afbec9ffe90701e7f581ea16000"], "commit": "9cf50e678ff582d11e0cc32d6af487a654a61f75", "message": "added Cubix link", "changes": [[1, 0, "episodes/30.md"]]}, {"committer": {"date": 1537799876, "timezone": "-0400", "name": "GitHub", "email": "noreply@github.com"}, "author": {"date": 1537799876, "timezone": "-0400", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "tree": "a72c74d94a4bb9ffd581c495abc6f73bda44c3dc", "parents": ["ab202057a02d7817cbcf07ecdcc95a75a88c94ce"], "commit": "b16ded2435685afbec9ffe90701e7f581ea16000", "message": "fixed Theil typo", "changes": [[1, 1, "episodes/30.md"]]}, {"committer": {"date": 1537645360, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "author": {"date": 1537645356, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "tree": "7b5be5ddc2f2ffcaed9fba7d89ef668dfe46c983", "parents": ["440e89ea14b15089bcb523f462b71d2ca3c126b4"], "commit": "ab202057a02d7817cbcf07ecdcc95a75a88c94ce", "message": "updated git log", "changes": [[0, 6, "_data/files.csv"], [1, 1, "_data/git-log.json"]]}, {"committer": {"date": 1537645356, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "author": {"date": 1537645356, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "tree": "4a8b7fc5ffd1a3d941c535599842a9b73e31ba77", "parents": ["457d7011799a9667ef3149d5836d955ad0c52a75"], "commit": "440e89ea14b15089bcb523f462b71d2ca3c126b4", "message": "working on fixing strange git bug...", "changes": [[7, 0, "_data/files.csv"]]}, {"committer": {"date": 1537644402, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "author": {"date": 1537644398, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "tree": "3e582f0db46e6c8808483dd15b4e187e3f474dfe", "parents": ["7816da98ca5dcb5a62b5e4ea968d69c9e88ffb83"], "commit": "457d7011799a9667ef3149d5836d955ad0c52a75", "message": "updated git log", "changes": [[1, 1, "_data/git-log.json"]]}, {"committer": {"date": 1537644398, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "author": {"date": 1537644398, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "tree": "7e9e59e371c61db2631cab87acb5bf3a4abbe866", "parents": ["8104ba62a8543d2c73fb2321022563a56498689a"], "commit": "7816da98ca5dcb5a62b5e4ea968d69c9e88ffb83", "message": "added episode 30, james koppel", "changes": [[1157, 0, "episodes/30.md"], [1, 0, "index.html"]]}, {"committer": {"date": 1536683911, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "author": {"date": 1536681927, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "tree": "d366d84c39fc46fe9a86e28039cdbb6a73397df8", "parents": ["138641ea1454e5d2379dcbc144e0c068138dd3d2"], "commit": "8104ba62a8543d2c73fb2321022563a56498689a", "message": "updated git log", "changes": [[1, 1, "_data/git-log.json"]]}, {"committer": {"date": 1536681927, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "author": {"date": 1536681927, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "tree": "3f62c9f1ef23fce4294d5fe01b5cb7d0cf1e18c9", "parents": ["c91b94928e098cf0f0c1ed4c5ae9cdf3b5a2a812"], "commit": "138641ea1454e5d2379dcbc144e0c068138dd3d2", "message": "## FRP Morning 9/11/18\n\n* TOC\n{: toc }\n\n### From Debugging Towards Live Tuing of Reactive Applications\n\nI was sent this paper by Jonathan Edwards for feedback to the authors. It was recently accepted into LIVE. It was right up my alley. It's the notion of taking the DAG visualization of a FRP app, but making it editable at the visualization level, similar to a node-and-wire environment, such as Facebook Origami. It was a fun read, and I gave a few notes to the authors.\n\n### Beautiful Conal Quotes\n\nThere are a few things Conal said that have really stuck with me, so I took the time to transcribe them and put them [here](/notes/conal-elliot). But I'll paste them below as well because they are just so wonderful:\n\n> It’s important to me that you cannot look in a behavior and say like “when does it change (change in the sense of events)?” Because in order to answer that question One would need a more complex semantic model.\n> Now, many or most so-called FRP systems I see out there do have some notion of “when does something change.” And every one of those breaks the semantic model.\n>\n> It’s like you have arithmetic, right? So FRP is arithmetic for time-varying quantities of all sorts of types. By arithmetic, I mean some algebra, some set of operators that have nice laws, nice properties. And imagine if you thought of arithmetic as about compositional structure or about the express that you evaluated.\n>\n> If you added 3 and 4, can you tell tell the difference between that and what you get by adding 2 and 5? It’s very important to the laws of arithmetic that you cannot tell the difference. If you could tell the difference, then what you would have would not be a type of numbers with a nice set of operations. It would be something more like a type of trees or something like that. And there would be no interesting equational properties. And you’d have something very complicated. And you’d have to talk about your API instead of talking about... You wouldn’t be doing math, you’d be doing data structure manipulation.\n>\n> For instance every time you hear somebody talk about FRP in terms of graphs or propagation or something like that, they are missing the point entirely. Because they are taking about some sort of operational, mechanistic model, not about what it means.\n>\n> And what I see happen over and over is not only do people generate a complex model but they don’t know it’s complex because they haven’t looked at it precisely. And they thwart most attempts to do nontrivial optimization’s because they’ve exposed too much information. So I want to make it as abstract and useful as possible, so it’s simple for somebody to think about, and I can do radically different sorts of optimization experiments.\n\nOf course, this doesn't mean that a \"debugging engine\" can't break these abstractions to keep track of these things so as to aid you in understanding. The key is that the programmer cannot break this abstraction at the semantic level, so we can do creative optimizations, etc. In other words, I can write `3+4=2+5` and we can talk about each of those four numbers indepdenently. They don't immedialy collapse to `7=7` the instant I write them down.\n\nI also love this beautiful quote about functions as boxes and values as flowing across arrows:\n\n> It's an inherently first-order visualization. In other words, the visualization itself makes a hard visually syntactic distinction between functions and values. What's great about functional programing is that functions are values... [with] visual arrows, with every composition, you get something more complex than what you had before. Complexity grows and grows and grows. Visual langauges are very sparse, rather than a dense notation. So pretty quickly you get swamped... You use up a lot of space not saying very much.\n\n### Feyman Method to Solving FRP Notation\n\nThe method is:\n\n1. Write down the problem.\n2. Think very hard.\n3. Write down the solution.\n\nHere's what that looked like:\n\n![image](https://user-images.githubusercontent.com/2288939/45373019-63f0ba80-b5bc-11e8-92c0-e7e894314bfc.png)\n\nWhat I decided was (for now) to give up on wires and arrows to visualize flow and depedencies. Instead I want to be more creative about showing those things, such as spatial arrangement, labelling (including colors, words, and on-hover interactions), etc.\n\nI then pseudo-coded a few classic GUI problems. (I may steal other problems from [7GUIS](https://eugenkiss.github.io/7guis/).)\n\nWhat I discovered here is that the classic notation of FP isn't all that bad. (That's not quite true. For example, [Conal's original bouncing ball](https://futureofcoding.org/log#bouncing-ball-solved) is tough to read. More on this in the todos below...)\n\nThe problems are:\n\n#### 1. Expression construction made \"live\" & \"concrete\"\n\nYou want to be able to construct these expressions in any order, such as:\n\nA) Start with an widget, like a button, and then derive some state from it, and then plop it back in itself.\n\nB) Start with a notion of some state (you haven't yet defined), and build up a widget from that state, which then can be defined in terms of the widget.\n\nSelf-referencing makes this possible more difficult, but nothing a structure-y editor couldn't solve.\n\n#### 2. See the dataflow behind behaviors & events\n\nI dont see any reason why this shouldn't be possible as an \"overlay\" of some sort on top of the classic FP notation.\n\nI can also imagine an on-hover interaction to functions that allow you to visualize how they transform their inputs into their output, such as [this one](https://futureofcoding.org/log#lets-visualize-all-the-fp-list-operators).\n\nIt'd be neat to have an over-arching shape of an application so you can visually get a sense for how it fits together, but I don't know if anyone's done that yet. Node-and-wires don't tell you much: they tell you less than regular FP syntax, and often in more confusing ways.\n\n#### What's the type of FRP Widgets?\n\nI'm not clear on what the \"type\" of widgets should be -- that is, what they \"return\".\n\nAre they a \"structure\" of some sort that you can then get various event streams (such as click) \"from\"?\n\nOr should they simply return the (or a list of the) event stream(s) that they \"contain\"?\n\n### Blur the line between front & backend\n\nIn the past I called this idea \"higher level HTTP requests\" or \"HTTP = JQuery\". Here are some thoughts I put on Twitter along these lines yesterday:\n\n\n\n### Next steps 9/11/18\n\n* pseudo-code more GUI problems, possibly from [7GUIS](https://eugenkiss.github.io/7guis/), building up to ToDoMVC\n* think about what and where traditional FRP syntax is difficult (such as [Conal's original bouncing ball](https://futureofcoding.org/log#bouncing-ball-solved)), and also more modern syntaxes... re-check out PureScript in this vein", "changes": [[12, 2, "notes/conal-elliot.md"]]}, {"committer": {"date": 1536443596, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "author": {"date": 1536443596, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "tree": "9fb88ce02314463fbaaf17f2414ece4c0829f3c6", "parents": ["760bef72611f0aecc1a83ef1a1c8eb3f0c99c254"], "commit": "c91b94928e098cf0f0c1ed4c5ae9cdf3b5a2a812", "message": "updated git log", "changes": [[1, 1, "_data/git-log.json"]]}, {"committer": {"date": 1536443201, "timezone": "-0400", "name": "Steve Krouse", "email": "stevekrouse@users.noreply.github.com"}, "author": {"date": 1536443201, "timezone": "-0400", "name": "Steve Krouse", "email": "stevekrouse@users.noreply.github.com"}, "tree": "957e8ea461285928b233783bd4dc829a6c4917c4", "parents": ["d3a45ade4511110945e12486b823bf444b00c346"], "commit": "760bef72611f0aecc1a83ef1a1c8eb3f0c99c254", "message": "## Candlewood Lake Vacation, etc\n\n* TOC\n{: toc }\n\nAs expected, I haven't gotten much done here the past few weeks. I was\non vacation and wanted to do more freelance stuff, which I did. I'm\nalso reading a great series of novels by Robin Hobb which are\ndistracting. However, I'm excited about all the chatter around my\npodcast, tweeters, on the Slack group. Thanks to all that listen, and\nespecially to those that write in - even just to say hi!\n\n### Foundations\n\nI've been thinking a lot what we take for granted, and questioning\neverything. So why not the foundations. There's the Turing Machine\n(wah ich is the epitome of inelegant) and Lambda Calculus (which is a\nmillion times better by comparison). But can we do better? Are there\nother alternatives? I did some Wikipedia-ing, but didn't come up with\nmuch interesting. Here are some links:\n\n*\nhttps://www.reddit.com/r/AskComputerScience/comments/78wnv4/is_there_an\n_alternative_to_lambda_calculus_as_a/\n* https://en.wikipedia.org/wiki/Process_calculus\n*\nhttps://en.wikipedia.org/wiki/Category:Term-rewriting_programming_langu\nages\n\nI'm going to this [whacky workshop in\nItaly](https://programme.hypotheses.org/autumn-workshop-formalisms-at-t\nhe-interface-with-machines-languages-and-systems) next month that will\nhopefully encourage me to think outside the box on these topics. What\neven *is* a computer program?\n\n### Misc links\n\n* [Datafun](http://www.rntz.net/datafun/) - functional query language!\nVery cool. Along the lines of the question I've been having about why\nwe have different data structures in databases vs in our languages.\n* [Wolfram on Math\nNotation](https://www.stephenwolfram.com/publications/mathematical-nota\ntion-past-future/) - very good. Thought provoking!\n\n### OAP - open authorial principle\n\nI've been having fun Twitter conversations with\n[Antranig](https://twitter.com/amb26ponder) (who I think lives in\nLondon!). He has [a really cool paper on this\nOAP](https://github.com/amb26/papers/blob/master/onward-2016/onward-201\n6.pdf), which is very similar in spirit to r0ml's notion of \"liberal\nsoftware.\" Many of the examples were in about object inherentance in\nJava which I am allergic to, but I love the idea of formalisizing this\nideal.\n\nWhat are the key actions that need to be enabled for this principle:\n\n1. Finding/understanding all relevant sections in the code. (This is\nrelated to my recent work.)\n2. Making the change (including previewing it)\n3. Managing various versions\n\nI also had two other interesting, random thoughts:\n\n1. The \"Settings Menu\" is a list of global variables you can set to\nrange of pre-defined constants\n2. Where does composability play into the OAP?\n\n### Todo 9/8/18\n\n* \"Future work\" - better \"notations\" for higher-order streams (as in\nReflex). I should be able to get 5-10 hours here this week. That's the\ngoal at least.\n* Organize \"FoC Thinking\" - I've been collecting a list of things to\nthink about in my inbox, but I'd like to get that somewhere public.\n\t* at the top: https://eugenkiss.github.io/7guis/\n* Organize \"FoC Research\" - same idea but more for things to read for\ninspiration, like papers\n\t* at the top: https://github.com/hypotext/notation", "changes": [[1, 0, "log.md"]]}, {"committer": {"date": 1535468707, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "author": {"date": 1535468701, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "tree": "f7a64f097b8475d03768a7486919748250669dd0", "parents": ["31838cb3ba540a823236c8920f29114cb637efb1"], "commit": "d3a45ade4511110945e12486b823bf444b00c346", "message": "updated git log", "changes": [[1, 1, "_data/git-log.json"]]}, {"committer": {"date": 1535468701, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "author": {"date": 1535468701, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "tree": "61bd44823e44ffa30707b84cf6dd3332e868c0d5", "parents": ["2cb7b93a9dd10679b6f900438ed664d78ef6a384"], "commit": "31838cb3ba540a823236c8920f29114cb637efb1", "message": "add woofjs workflow to homepage", "changes": [[1, 0, "index.html"]]}, {"committer": {"date": 1535398329, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "author": {"date": 1535398324, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "tree": "6ea41727f212e21c3f40b50da21750ac51c9d028", "parents": ["1853da463483be7bb9495b66a7215feba61b9d2b"], "commit": "2cb7b93a9dd10679b6f900438ed664d78ef6a384", "message": "updated git log", "changes": [[5, 0, "_data/files.csv"], [1, 1, "_data/git-log.json"]]}, {"committer": {"date": 1535398324, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "author": {"date": 1535398324, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "tree": "dc91374e6cdfe918b4247feda780c77fe14edd05", "parents": ["198556aca1735db6219365d43363fa87c4556326"], "commit": "1853da463483be7bb9495b66a7215feba61b9d2b", "message": "added reflection 13, podcasts 28 and 29", "changes": [[44, 0, "episodes/28.md"], [23, 0, "episodes/29.md"], [2, 0, "index.html"], [4, 0, "notes/aaron-kent-call-9-15-17.md"], [118, 0, "notes/jonathan-edwards/06-14-18.md"], [140, 0, "notes/jonathan-edwards/07-10-18.md"], [92, 0, "notes/jonathan-edwards/08-21-18.md"], [64, 8, "reflections/13.md"]]}, {"committer": {"date": 1535323079, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "author": {"date": 1535323076, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "tree": "38b44287889769c52dad7fde674d1422c971213e", "parents": ["d1abf772486931f25b757ffaf93c30966f7d6b10"], "commit": "198556aca1735db6219365d43363fa87c4556326", "message": "updated git log", "changes": [[94, 0, "_data/files.csv"], [1, 1, "_data/git-log.json"]]}, {"committer": {"date": 1535323076, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "author": {"date": 1535323076, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "tree": "ab9a9f7961c2f49c174365b980ad0e7e943559ae", "parents": ["5f41ce04e95929074d60290a4b25e2b1466299e0"], "commit": "d1abf772486931f25b757ffaf93c30966f7d6b10", "message": "attempting to add directory listings...", "changes": [[36, 3, "404.md"], [5, 0, "README.md"], [0, 1, "notes/index.html"]]}, {"committer": {"date": 1535321825, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "author": {"date": 1535321820, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "tree": "081c0350ad966bc567d67d414c019218128b94cd", "parents": ["7ef007826b5d36c7b10de50b4f6c5075312f5583"], "commit": "5f41ce04e95929074d60290a4b25e2b1466299e0", "message": "updated git log", "changes": [[1, 1, "_data/git-log.json"]]}, {"committer": {"date": 1535321820, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "author": {"date": 1535321820, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "tree": "da2543021094982c194c86ed183b3db2a94455df", "parents": ["624d805a08ad51845658edeb0eda31ff0f2d7326"], "commit": "7ef007826b5d36c7b10de50b4f6c5075312f5583", "message": "add sitemaps", "changes": [[2, 0, "_config.yml"]]}, {"committer": {"date": 1535199813, "timezone": "-0400", "name": "Steve Krouse", "email": "stevekrouse@users.noreply.github.com"}, "author": {"date": 1535199813, "timezone": "-0400", "name": "Steve Krouse", "email": "stevekrouse@users.noreply.github.com"}, "tree": "c4e037527c4953c2cc6ff57d4705e62e22a7e282", "parents": ["2554d62622244699c4b78687db33c3191bb0a033"], "commit": "624d805a08ad51845658edeb0eda31ff0f2d7326", "message": "started reflection 13 outline", "changes": [[49, 0, "reflections/13.md"]]}, {"committer": {"date": 1534937625, "timezone": "-0400", "name": "GitHub", "email": "noreply@github.com"}, "author": {"date": 1534937625, "timezone": "-0400", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "tree": "f5b3debd20f26441ccf47ffd77b348dee0741a82", "parents": ["fbd86a350730552192edd863b54c8abb0befd4a9"], "commit": "2554d62622244699c4b78687db33c3191bb0a033", "message": "Fix frp draft redirect", "changes": [[2, 2, "404.md"]]}, {"committer": {"date": 1534542152, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "author": {"date": 1534542149, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "tree": "24f205d609bb455fa01edfaf0a2c051c66d3d75d", "parents": ["99e3f93836b5e480ed9382ec983d074eda0f33b8"], "commit": "fbd86a350730552192edd863b54c8abb0befd4a9", "message": "updated git log", "changes": [[1, 1, "_data/git-log.json"]]}, {"committer": {"date": 1534542149, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "author": {"date": 1534542149, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "tree": "124044ebb598bcdb5322f70681be7e67bbc63ba5", "parents": ["6bff7c5cb005d10bab1b76a7004631a90b6f5990"], "commit": "99e3f93836b5e480ed9382ec983d074eda0f33b8", "message": "fixed LaTeX link", "changes": [[2, 2, "papers/comprehensible-frp/index.md"]]}, {"committer": {"date": 1534541885, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "author": {"date": 1534541882, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "tree": "6bea9488ddf1fbbbbabb7777623c55e9c55f6d11", "parents": ["8be9c9d772ea122f54db871ad41aec5fe8dff524"], "commit": "6bff7c5cb005d10bab1b76a7004631a90b6f5990", "message": "updated git log", "changes": [[1, 1, "_data/git-log.json"]]}, {"committer": {"date": 1534541882, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "author": {"date": 1534541882, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "tree": "9e5695120319696828eadc169e24b36fb32d0902", "parents": ["64b8083919e2cc6756692f30258d6d59ce404b56"], "commit": "8be9c9d772ea122f54db871ad41aec5fe8dff524", "message": "fix frp paper header typo", "changes": [[0, 1, "papers/comprehensible-frp/index.md"]]}, {"committer": {"date": 1534541671, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "author": {"date": 1534540295, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "tree": "da7bf5146454d444aab1983232b1da15ba0893a6", "parents": ["342b7b9ec018f2188bb7252a5f7b016c5d8d53d5"], "commit": "64b8083919e2cc6756692f30258d6d59ce404b56", "message": "updated git log", "changes": [[1, 1, "_data/git-log.json"]]}, {"committer": {"date": 1534540295, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "author": {"date": 1534540295, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "tree": "0cb58451f427686a20339e78362cdf8118e76903", "parents": ["95bad27a4d9e2bbd0b186b7683eecf97197fe068"], "commit": "342b7b9ec018f2188bb7252a5f7b016c5d8d53d5", "message": "## London, REBLS, & future plans\n\n* TOC\n{: toc }\n\n\n### Moving to London!\n\nLast week I got the Exceptional Tech Talent Visa which means I'm moving there on Oct 1. Just bought my plane ticket. Hope to be there for a year or two.\n\n### Submitted to REBLS 2018!!\n\nLast night I submitted my the [the submitted PDF version](./papers/comprehensible-frp/comprehensible-frp.pdf) of the paper to REBLS! It took ~10 hours to translate the [blog version](./papers/comprehensible-frp) to the PDF version! I had a lot of trouble with LaTeX, so I fiuged I should put up the [full LaTex code and associated files ](https://github.com/stevekrouse/futureofcoding.org/tree/master/papers/comprehensible-frp/LaTex) in case it'd be helpful for future independent researchers. Turns out they extended the deadline for another two weeks just now (probably because they didn't get enough submissions), but it's nice to have it behind me.\n\nLooking at the cost of flights to Boston from London, it seems pretty stable, so I don't need to get it yet. I can also register for SPLASH up until Oct 1 for $100 off. I hear back if I get in on Sept 25th.\n\n### Next two weeks (8/20/18-8/31/18)\n\nNext week I agreed to write an essay about Dynamicland. Also, I'm visiting Boston for a few days to visit my programming research friends! I'd also like to do more work for First Round Capital next week. So I don't think I'll have much time here.\n\nThe following week will be more vacation focused with my parents, brothers, and grandparents. I may do a bit of work for First Round and Dark, but not likely work here.\n\n### Future research directions\n\nHere are a few ideas. I'm going to chat with Jonathan Edwards in Boston next week so maybe we can review this together.\n\n#### 1. [Comprehensible FRP's Future work](./papers/comprehensible-frp#7-future-work)\n\nI'm actually very excited about this section. Here's basically the plan. Take the Reflex TodoMVC diagram from this paper and tweak in in Figma a bunch. At the same time, work on getting this stuff to compile in JavaScript somehow. The goal here is very explicitly a language / visual environment. If it's good, I win. If it's bad, maybe I turn it into a paper.\n\n#### 2. [Anti-IO Monad](http://futureofcoding.org/log#my-growing-anti-io-monad-obsession)\n\nThis is a neat line of inquiry but I don't have a very concrete next step here. It's very related to the ideas in this tweet storm:\n\n\n\nAnd the lovely replies:\n\nI think I'm gonna do it... pic.twitter.com/9wKgw8b7g8
— Steven Krouse (@stevekrouse) September 19, 2018
\n\n\nInteresting.
— Ivan Reese (@spiralganglion) August 10, 2018
2¢ — I think when you push for extreme reductions, throwing away ever more context.. you eventually run into the Berry Paradox (https://t.co/4ULmDa7DPt)
\n\n\n#### 3. [Slice-and-Dice Data-ninja playground](http://futureofcoding.org/log#yesterday%E2%80%99s-slice-and-dice-data-ninja-playground)\n\nThis is very much jumping to an entirely different problem. It's intriguing, but not as likely.\n\n#### 4. Liberal Software\n\nFrom a motivation/vision perspective, this is important. I'd love to collaborate with r0ml on this.", "changes": [[2, 1, "404.md"], [0, 352, "drafts/frp.md"], [49, 43, "index.html"], [819, 0, "papers/comprehensible-frp/LaTeX/ACM-Reference-Format.bbx"], [2894, 0, "papers/comprehensible-frp/LaTeX/ACM-Reference-Format.bst"], [5, 0, "papers/comprehensible-frp/LaTeX/ACM-Reference-Format.cbx"], [18, 0, "papers/comprehensible-frp/LaTeX/ACM-Reference-Format.dbx"], [199, 0, "papers/comprehensible-frp/LaTeX/README"], [88, 0, "papers/comprehensible-frp/LaTeX/acmart.bib"], [2671, 0, "papers/comprehensible-frp/LaTeX/acmart.cls"], ["-", "-", "papers/comprehensible-frp/LaTeX/counter.png"], ["-", "-", "papers/comprehensible-frp/LaTeX/elm-actions.png"], ["-", "-", "papers/comprehensible-frp/LaTeX/elm-architecture.png"], ["-", "-", "papers/comprehensible-frp/LaTeX/elm-entries.png"], ["-", "-", "papers/comprehensible-frp/LaTeX/elm-graph.png"], [47, 0, "papers/comprehensible-frp/LaTeX/frp.bib"], [363, 0, "papers/comprehensible-frp/LaTeX/frp.tex"], ["-", "-", "papers/comprehensible-frp/LaTeX/highlight-actions.png"], ["-", "-", "papers/comprehensible-frp/LaTeX/highlight-entries.png"], ["-", "-", "papers/comprehensible-frp/LaTeX/reflex-graph.png"], ["-", "-", "papers/comprehensible-frp/LaTeX/rxfiddle.png"], ["-", "-", "papers/comprehensible-frp/LaTeX/rxmarbles.png"], ["-", "-", "papers/comprehensible-frp/LaTeX/todomvc.png"], ["-", "-", "papers/comprehensible-frp/comprehensible-frp.pdf"], [357, 0, "papers/comprehensible-frp/index.md"]]}, {"committer": {"date": 1534266841, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "author": {"date": 1534266838, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "tree": "00aaebdc15cad776b0f34b2dfe84964154e9ff44", "parents": ["ba882940a80b1ba98625b6bf3d70e6a9fd5bca52"], "commit": "95bad27a4d9e2bbd0b186b7683eecf97197fe068", "message": "updated git log", "changes": [[1, 1, "_data/git-log.json"]]}, {"committer": {"date": 1534266838, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "author": {"date": 1534266838, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "tree": "a2ae2e1149c13fde1392531f475e24cb9728be88", "parents": ["df071f988cff3d6adb8a86709e34d12057c865f0"], "commit": "ba882940a80b1ba98625b6bf3d70e6a9fd5bca52", "message": "fixed frp typos (thanks matt marcus)", "changes": [[7, 9, "drafts/frp.md"]]}, {"committer": {"date": 1534261913, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "author": {"date": 1534261763, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "tree": "1856ce64c8b155674610a2748179383fadf9f3b9", "parents": ["d17aec58fed6efab0433df37717d2661f3d531bd"], "commit": "df071f988cff3d6adb8a86709e34d12057c865f0", "message": "updated git log", "changes": [[1, 1, "_data/git-log.json"]]}, {"committer": {"date": 1534261763, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "author": {"date": 1534261763, "timezone": "+0000", "name": "Steve Krouse", "email": "skrouse@seas.upenn.edu"}, "tree": "e41871c8f895bc0fb4fa1f4f3d8f2600f4e4fb09", "parents": ["3c4cbb21b92688aca129a8d0be53f1eb6b76c5ea"], "commit": "d17aec58fed6efab0433df37717d2661f3d531bd", "message": "## Incorporated Jonathan Edwards feedback on frp draft 2\n\n* TOC\n{: toc }\n\nAs usual I received some prompt and insightful feedback from Jonathan Edwards yesterday:\n\n> Abstract\n> scalable->modular, larger->entire\n> “this paper shows how higher-order and cyclic streams can improve comprehensibility.”\n\n✔\n\n> Introduction\n> they depend => they depend upon\n\n✔\n\n> Elm architecture\n> Elm is more like ML than Haskell\n> Defer mentioning higher-order/cyclic streams till later when you define them.\n> Instead: “user interfaces are inherently a cycle of alternating input and output, which is reflected in the Elm architecture”\n\n✔\n\n> Reflex\n> Show the types of button and display\n\n✔\n\n> Note how the do notation is implicitly assembling the view as if by accumulating side-effects from button and display, unlike the explicit construction in Elm.\n\nThe view is very explicitly assembled in Reflex - the vertical order of statements is the explicit order of the view. The \"side-effects\" we get from `button` and `display` are their event streams, which are also explicit. It *is* unfamiliar to use `do`-notation to construct an event propagation network, instead of how it's normally used for imperative code, but that doesn't make this code imperative.\n\n> Is it easy to hierarchically compose views in Reflex?\n\n✔\n\n> delete “we here”\n\n✔\n\n> The price we pay for this explicitness is that events are abstracted from the single values in Elm into a time-stamped stream of values. In Elm we write a global state reducer function that pattern matches on these events. In Reflex we use stream combinators to define the model and view as streams of values of each other. The single global I/O cycle of Elm becomes a number of cyclic definitions between model and view streams in Reflex.\n\n ✔\n\n> Diagrams\n> Finding them a little hard to understand. The top level is the big yellow boxes, but what exactly are they?\n> Categories of some sort? I’d expect the top level of the Elm diagram to be Model, View, and Messages.\n\nThis is a great question. I think this makes it clearer:\n\nsounds like church encoding https://t.co/4Md0GECpXo
— Mariano Guerra (@warianoguerra) August 10, 2018