{"exhaustive":{"nbHits":false,"typo":false},"exhaustiveNbHits":false,"exhaustiveTypo":false,"hits":[{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"simme_lj"},"story_text":{"matchLevel":"none","matchedWords":[],"value":""},"title":{"fullyHighlighted":false,"matchLevel":"full","matchedWords":["withampersand"],"value":"Building an app <em>with Ampersand</em>.js"},"url":{"fullyHighlighted":false,"matchLevel":"full","matchedWords":["withampersand"],"value":"http://iamsim.me/building-an-app-<em>with-ampersand</em>-js/"}},"_tags":["story","author_simme_lj","story_9380694"],"author":"simme_lj","created_at":"2015-04-15T13:11:15Z","created_at_i":1429103475,"num_comments":0,"objectID":"9380694","points":2,"story_id":9380694,"story_text":"","title":"Building an app with Ampersand.js","updated_at":"2023-09-07T02:31:53Z","url":"http://iamsim.me/building-an-app-with-ampersand-js/"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"at-fates-hands"},"comment_text":{"fullyHighlighted":false,"matchLevel":"full","matchedWords":["withampersand"],"value":"I'm working on several site redesigns so putting my design hat back on after being neck deep in JS is always refreshing.<p>Also working on building a community site with Telescope on Heroku.<p>Starting to learn React. As a non-application developer, I'm looking to use this along <em>with Ampersand</em> to create an easy way to create static websites with it. I know, I know, this is not what its meant for, but I like to think outside the box sometimes with these frameworks."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Ask HN: What project are you currently working on?"}},"_tags":["comment","author_at-fates-hands","story_9891487"],"author":"at-fates-hands","children":[9895126],"comment_text":"I&#x27;m working on several site redesigns so putting my design hat back on after being neck deep in JS is always refreshing.<p>Also working on building a community site with Telescope on Heroku.<p>Starting to learn React. As a non-application developer, I&#x27;m looking to use this along with Ampersand to create an easy way to create static websites with it. I know, I know, this is not what its meant for, but I like to think outside the box sometimes with these frameworks.","created_at":"2015-07-15T16:26:45Z","created_at_i":1436977605,"objectID":"9892247","parent_id":9891487,"points":null,"story_id":9891487,"story_title":"Ask HN: What project are you currently working on?","updated_at":"2023-09-07T03:12:53Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"amk_"},"comment_text":{"fullyHighlighted":false,"matchLevel":"full","matchedWords":["withampersand"],"value":"I found this tutorial series to be pretty good, demoing React <em>with Ampersand</em> as the model/controller: <a href=\"http://learn.humanjavascript.com/react-ampersand/introduction\" rel=\"nofollow\">http://learn.humanjavascript.com/react-ampersand/introductio...</a><p>There's also a library to hook up React views directly to a Firebase (real-time JSON streaming) backend: <a href=\"https://www.firebase.com/blog/2014-05-01-using-firebase-with-react.html\" rel=\"nofollow\">https://www.firebase.com/blog/2014-05-01-using-firebase-with...</a>"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"React.js Introduction for People Who Know Just Enough JQuery"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://reactfordesigners.com/labs/reactjs-introduction-for-people-who-know-just-enough-jquery-to-get-by/"}},"_tags":["comment","author_amk_","story_9856855"],"author":"amk_","comment_text":"I found this tutorial series to be pretty good, demoing React with Ampersand as the model&#x2F;controller: <a href=\"http:&#x2F;&#x2F;learn.humanjavascript.com&#x2F;react-ampersand&#x2F;introduction\" rel=\"nofollow\">http:&#x2F;&#x2F;learn.humanjavascript.com&#x2F;react-ampersand&#x2F;introductio...</a><p>There&#x27;s also a library to hook up React views directly to a Firebase (real-time JSON streaming) backend: <a href=\"https:&#x2F;&#x2F;www.firebase.com&#x2F;blog&#x2F;2014-05-01-using-firebase-with-react.html\" rel=\"nofollow\">https:&#x2F;&#x2F;www.firebase.com&#x2F;blog&#x2F;2014-05-01-using-firebase-with...</a>","created_at":"2015-07-09T14:42:35Z","created_at_i":1436452955,"objectID":"9858080","parent_id":9857469,"story_id":9856855,"story_title":"React.js Introduction for People Who Know Just Enough JQuery","story_url":"http://reactfordesigners.com/labs/reactjs-introduction-for-people-who-know-just-enough-jquery-to-get-by/","updated_at":"2024-09-19T22:01:30Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"jlongster"},"comment_text":{"fullyHighlighted":false,"matchLevel":"full","matchedWords":["withampersand"],"value":"I'm not familiar <em>with ampersand</em>-collection, so I don't exactly understand your questions, but I think you're also farther along than I am researching this. I can't give a good answer yet as I'm just starting to play around with integrating mori.<p>I don't know what you mean by &quot;derived attributes&quot;, or why it would be difficult to do data transformations on the models that deal with mori data structures. It'd be great to discuss this somewhere, maybe on #reactjs IRC? I'm jlongster there."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Virtual DOM in Elm"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://elm-lang.org/blog/Blazing-Fast-Html.elm"}},"_tags":["comment","author_jlongster","story_8063870"],"author":"jlongster","comment_text":"I&#x27;m not familiar with ampersand-collection, so I don&#x27;t exactly understand your questions, but I think you&#x27;re also farther along than I am researching this. I can&#x27;t give a good answer yet as I&#x27;m just starting to play around with integrating mori.<p>I don&#x27;t know what you mean by &quot;derived attributes&quot;, or why it would be difficult to do data transformations on the models that deal with mori data structures. It&#x27;d be great to discuss this somewhere, maybe on #reactjs IRC? I&#x27;m jlongster there.","created_at":"2014-07-21T17:18:29Z","created_at_i":1405963109,"objectID":"8064734","parent_id":8064658,"story_id":8063870,"story_title":"Virtual DOM in Elm","story_url":"http://elm-lang.org/blog/Blazing-Fast-Html.elm","updated_at":"2024-09-19T20:57:58Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"voyou"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"I think &quot;ampersat&quot; was first coined in the 90s (when email suddenly made the @ sign more common), presumably by analogy with &quot;ampersand&quot;. The earliest reference I can find is a suggestion from a viewer writing in to CBS Sunday Morning in 1994 (paywalled link, I'm afraid): <a href=\"https://www.lexisnexis.com/uk/nexis/docview/getDocForCuiReq?lni=3SHY-V680-009C-B3D9&amp;csi=8399&amp;oc=00240&amp;perma=true\" rel=\"nofollow\">https://www.lexisnexis.com/uk/nexis/docview/getDocForCuiReq?...</a><p>This newspaper article from 1996 also shows someone proposing &quot;ampersat&quot; apparently as a novel suggestion: <a href=\"http://www.independent.co.uk/life-style/bits--bytes-1317440.html\" rel=\"nofollow\">http://www.independent.co.uk/life-style/bits--bytes-1317440....</a>"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"At"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"http://furbo.org/2014/03/25/at/"}},"_tags":["comment","author_voyou","story_7849715"],"author":"voyou","comment_text":"I think &quot;ampersat&quot; was first coined in the 90s (when email suddenly made the @ sign more common), presumably by analogy with &quot;ampersand&quot;. The earliest reference I can find is a suggestion from a viewer writing in to CBS Sunday Morning in 1994 (paywalled link, I&#x27;m afraid): <a href=\"https://www.lexisnexis.com/uk/nexis/docview/getDocForCuiReq?lni=3SHY-V680-009C-B3D9&amp;csi=8399&amp;oc=00240&amp;perma=true\" rel=\"nofollow\">https:&#x2F;&#x2F;www.lexisnexis.com&#x2F;uk&#x2F;nexis&#x2F;docview&#x2F;getDocForCuiReq?...</a><p>This newspaper article from 1996 also shows someone proposing &quot;ampersat&quot; apparently as a novel suggestion: <a href=\"http://www.independent.co.uk/life-style/bits--bytes-1317440.html\" rel=\"nofollow\">http:&#x2F;&#x2F;www.independent.co.uk&#x2F;life-style&#x2F;bits--bytes-1317440....</a>","created_at":"2014-06-05T10:02:25Z","created_at_i":1401962545,"objectID":"7851105","parent_id":7850091,"story_id":7849715,"story_title":"At","story_url":"http://furbo.org/2014/03/25/at/","updated_at":"2024-09-19T20:55:34Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"magicalhippo"},"comment_text":{"fullyHighlighted":false,"matchLevel":"full","matchedWords":["withampersand"],"value":"Even if you didn't have mnemonics, you could use tab, arrow keys and alt if needed, to navigate, and space to &quot;click&quot; buttons and such.<p>So even if the developer forgot to configure mnemonics, which was as easy as prefixing a letter <em>with ampersand</em>, you could navigate by keyboard. Sometimes tedious but beats not being able."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"GUIs should be fully keyboard-driven"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"https://ckardaris.com/blog/2026/08/28/keyboard-driven-guis.html"}},"_tags":["comment","author_magicalhippo","story_49479837"],"author":"magicalhippo","comment_text":"Even if you didn&#x27;t have mnemonics, you could use tab, arrow keys and alt if needed, to navigate, and space to &quot;click&quot; buttons and such.<p>So even if the developer forgot to configure mnemonics, which was as easy as prefixing a letter with ampersand, you could navigate by keyboard. Sometimes tedious but beats not being able.","created_at":"2026-08-28T20:57:30Z","created_at_i":1787950650,"objectID":"49484169","parent_id":49483132,"story_id":49479837,"story_title":"GUIs should be fully keyboard-driven","story_url":"https://ckardaris.com/blog/2026/08/28/keyboard-driven-guis.html","updated_at":"2026-08-31T08:34:22Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"ayanb"},"comment_text":{"fullyHighlighted":false,"matchLevel":"full","matchedWords":["withampersand"],"value":"Currently, I am working on Ampersand (<a href=\"https://withampersand.com/\" rel=\"nofollow\">https://<em>withampersand</em>.com/</a>)<p>It's a sync infra product that is meant to cut down 6 months of development time, and years of maintenance of deep CRM sync for B2B SaaS.<p>Every Salesforce instance is a unique snowflake. I am moving that customization into configuration and building a resilient infrastructure for bi-directional sync.<p>We also recently launched a pretty cool abstraction on top of Salesforce CDC which is notoriously hard to work with: <a href=\"https://www.withampersand.com/blog/subscribe-actions-bringing-real-time-crm-events-and-actions-to-life\" rel=\"nofollow\">https://www.<em>withampersand</em>.com/blog/subscribe-actions-bringin...</a>"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Ask HN: What are you working on? (October 2025)"}},"_tags":["comment","author_ayanb","story_45561428"],"author":"ayanb","comment_text":"Currently, I am working on Ampersand (<a href=\"https:&#x2F;&#x2F;withampersand.com&#x2F;\" rel=\"nofollow\">https:&#x2F;&#x2F;withampersand.com&#x2F;</a>)<p>It&#x27;s a sync infra product that is meant to cut down 6 months of development time, and years of maintenance of deep CRM sync for B2B SaaS.<p>Every Salesforce instance is a unique snowflake. I am moving that customization into configuration and building a resilient infrastructure for bi-directional sync.<p>We also recently launched a pretty cool abstraction on top of Salesforce CDC which is notoriously hard to work with: <a href=\"https:&#x2F;&#x2F;www.withampersand.com&#x2F;blog&#x2F;subscribe-actions-bringing-real-time-crm-events-and-actions-to-life\" rel=\"nofollow\">https:&#x2F;&#x2F;www.withampersand.com&#x2F;blog&#x2F;subscribe-actions-bringin...</a>","created_at":"2025-10-13T03:14:05Z","created_at_i":1760325245,"objectID":"45564369","parent_id":45561428,"story_id":45561428,"story_title":"Ask HN: What are you working on? (October 2025)","updated_at":"2026-03-05T22:51:17Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"kjuulh"},"comment_text":{"fullyHighlighted":false,"matchLevel":"full","matchedWords":["withampersand"],"value":"Another step in getting proficient <em>with ampersand</em> (or rather immutable refs), is pulling stuff from enums and structs, in an immutable way. I.e. Option&lt;SomeStruct&gt;, or Result&lt;SomeStruct, ErrorKind&gt;. Using as_ref and friends.<p>There was a great post the other day about the &quot;Register of rust&quot;, and getting to know all the different variants of these features to be proficient and being able to build whatever you want.<p>The same goes for async features as well. Async especially requires that you understand lambdas, borrow checking and so on. As it can be quite tricky to send a value to a tokio::task::spawn!(...) if you don't have some mastery over the borrow checker.<p>When you get to taking lambda in a func, that should be async then you begin to get into the weeds of rust, and where some of the nasty compilers errors show up, some of the unhelpful variants, where you are expected to know the intricacies of how lifetimes work, and how rust handles generics vs impl vs enums etc.<p>In the beginning I just recommend using a good old Arc&lt;Mutex&lt;...&gt;&gt; if you need to pass stuff to functions, you can still shoot yourself in the foot, but you can take the optimizations piecemeal."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Getting Past \u201cAmpersand-Driven Development\u201d in Rust"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"https://fiberplane.com/blog/getting-past-ampersand-driven-development-in-rust"}},"_tags":["comment","author_kjuulh","story_35081027"],"author":"kjuulh","children":[35081943],"comment_text":"Another step in getting proficient with ampersand (or rather immutable refs), is pulling stuff from enums and structs, in an immutable way. I.e. Option&lt;SomeStruct&gt;, or Result&lt;SomeStruct, ErrorKind&gt;. Using as_ref and friends.<p>There was a great post the other day about the &quot;Register of rust&quot;, and getting to know all the different variants of these features to be proficient and being able to build whatever you want.<p>The same goes for async features as well. Async especially requires that you understand lambdas, borrow checking and so on. As it can be quite tricky to send a value to a tokio::task::spawn!(...) if you don&#x27;t have some mastery over the borrow checker.<p>When you get to taking lambda in a func, that should be async then you begin to get into the weeds of rust, and where some of the nasty compilers errors show up, some of the unhelpful variants, where you are expected to know the intricacies of how lifetimes work, and how rust handles generics vs impl vs enums etc.<p>In the beginning I just recommend using a good old Arc&lt;Mutex&lt;...&gt;&gt; if you need to pass stuff to functions, you can still shoot yourself in the foot, but you can take the optimizations piecemeal.","created_at":"2023-03-09T14:45:43Z","created_at_i":1678373143,"objectID":"35081689","parent_id":35081027,"story_id":35081027,"story_title":"Getting Past \u201cAmpersand-Driven Development\u201d in Rust","story_url":"https://fiberplane.com/blog/getting-past-ampersand-driven-development-in-rust","updated_at":"2024-09-20T13:30:02Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"dataflow"},"comment_text":{"fullyHighlighted":false,"matchLevel":"full","matchedWords":["withampersand"],"value":"It's called uniform initialization syntax (aka &quot;brace initialization&quot; aka list-initialization [1]). tl;dr is everyone loves it due to the terseness, but I recommend against it. It's kind of like a forced cast/coercion in some ways (and it also looks ugly). Also be careful with parentheses since C++20; if they invoke implicit (aggregate?) constructors that would've traditionally needed {}, I think you can also run into similar casting issues. I just ran into this one a couple days ago; I haven't narrowed it down yet, but it seemed to be due to this.<p>The second one is a lambda (which, if you're not familiar with the term, are anonymous functions/functors); the entries in the initial brackets define the captured variables (if any), and whether they're captured by reference (<em>with ampersand</em>) or by value (without).<p>[1] <a href=\"https://en.cppreference.com/w/cpp/language/list_initialization\" rel=\"nofollow\">https://en.cppreference.com/w/cpp/language/list_initializati...</a>"},"story_title":{"matchLevel":"none","matchedWords":[],"value":"std::latch"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"https://en.cppreference.com/w/cpp/thread/latch"}},"_tags":["comment","author_dataflow","story_27217877"],"author":"dataflow","children":[27219025],"comment_text":"It&#x27;s called uniform initialization syntax (aka &quot;brace initialization&quot; aka list-initialization [1]). tl;dr is everyone loves it due to the terseness, but I recommend against it. It&#x27;s kind of like a forced cast&#x2F;coercion in some ways (and it also looks ugly). Also be careful with parentheses since C++20; if they invoke implicit (aggregate?) constructors that would&#x27;ve traditionally needed {}, I think you can also run into similar casting issues. I just ran into this one a couple days ago; I haven&#x27;t narrowed it down yet, but it seemed to be due to this.<p>The second one is a lambda (which, if you&#x27;re not familiar with the term, are anonymous functions&#x2F;functors); the entries in the initial brackets define the captured variables (if any), and whether they&#x27;re captured by reference (with ampersand) or by value (without).<p>[1] <a href=\"https:&#x2F;&#x2F;en.cppreference.com&#x2F;w&#x2F;cpp&#x2F;language&#x2F;list_initialization\" rel=\"nofollow\">https:&#x2F;&#x2F;en.cppreference.com&#x2F;w&#x2F;cpp&#x2F;language&#x2F;list_initializati...</a>","created_at":"2021-05-20T08:09:48Z","created_at_i":1621498188,"objectID":"27218651","parent_id":27218628,"story_id":27217877,"story_title":"std::latch","story_url":"https://en.cppreference.com/w/cpp/thread/latch","updated_at":"2024-09-20T08:34:35Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"jasode"},"comment_text":{"matchLevel":"none","matchedWords":[],"value":"<i>&gt;I think much of modern C++ should be rejected [...] then fricken switch language! There are countless better alternatives today: Rust, Swift, D, Haskell etc.</i><p>The reality is that many projects are enabled more by <i>existing libraries &amp; tools</i> rather than blank slate clean <i>language syntax</i>.<p>Some example domains of libraries &amp; tools where C++ is the 1st-class client instead of Rust/Swift/D/Haskell:<p>+ deep learning: NVIDIA CUDA api is C++<p>+ HPC High Perfomance Computing: Intel MKL math library is C++<p>+ physics engine for video games: Unreal game engine is C++<p>+ latest cpu chip : ARM Allinea dev tools for the new ARM/Neoverse chips (e.g. latest AWS Graviton2 servers) is C++<p>+ Qt GUI is C++<p>Because of the extensive C++ ecosystem, you get a <i>counter-intuitive</i> situation where programming the latest cutting-edge apps requires a <i>35-year-old language from 1985</i> instead of the newer Rust language from 2012. I predict this delta of tools+libraries between C++ and Rust/Swift will continue to exist for 10+ years.  Recommending/lecturing people to use Rust/Swift/D overlooks the reasons that many programmers use C++.  It's not a random choice.<p>E.g., a realistic starting point for a project might be: <i>&quot;What's a good game engine... oh, it's Unreal, and that's C++.&quot;</i> -- instead of -- <i>&quot;Rust has clean syntax of ownership and borrow with &quot;&amp;&quot; ampersand symbol instead of ugly warts of unique_ptr&lt;T&gt; and std::move() in C++ so I'll code a game in Rust.&quot;</i><p>Sometimes, we look at the <i>ecosystem</i> first, and then work backwards from that to make programming choices.<p>It's when you have the luxury of a greenfield project that doesn't need legacy dependencies that choosing alternative cleaner syntax of Rust/Swift is possible.  Amazon AWS and MS Azure are examples of doing new bare-metal projects with Rust instead of C++."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"Std::visit is everything wrong with modern C++ (2017)"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"https://bitbashing.io/std-visit.html"}},"_tags":["comment","author_jasode","story_25314126"],"author":"jasode","children":[25316237,25316315,25316383,25316644,25317039,25319958,25321031],"comment_text":"<i>&gt;I think much of modern C++ should be rejected [...] then fricken switch language! There are countless better alternatives today: Rust, Swift, D, Haskell etc.</i><p>The reality is that many projects are enabled more by <i>existing libraries &amp; tools</i> rather than blank slate clean <i>language syntax</i>.<p>Some example domains of libraries &amp; tools where C++ is the 1st-class client instead of Rust&#x2F;Swift&#x2F;D&#x2F;Haskell:<p>+ deep learning: NVIDIA CUDA api is C++<p>+ HPC High Perfomance Computing: Intel MKL math library is C++<p>+ physics engine for video games: Unreal game engine is C++<p>+ latest cpu chip : ARM Allinea dev tools for the new ARM&#x2F;Neoverse chips (e.g. latest AWS Graviton2 servers) is C++<p>+ Qt GUI is C++<p>Because of the extensive C++ ecosystem, you get a <i>counter-intuitive</i> situation where programming the latest cutting-edge apps requires a <i>35-year-old language from 1985</i> instead of the newer Rust language from 2012. I predict this delta of tools+libraries between C++ and Rust&#x2F;Swift will continue to exist for 10+ years.  Recommending&#x2F;lecturing people to use Rust&#x2F;Swift&#x2F;D overlooks the reasons that many programmers use C++.  It&#x27;s not a random choice.<p>E.g., a realistic starting point for a project might be: <i>&quot;What&#x27;s a good game engine... oh, it&#x27;s Unreal, and that&#x27;s C++.&quot;</i> -- instead of -- <i>&quot;Rust has clean syntax of ownership and borrow with &quot;&amp;&quot; ampersand symbol instead of ugly warts of unique_ptr&lt;T&gt; and std::move() in C++ so I&#x27;ll code a game in Rust.&quot;</i><p>Sometimes, we look at the <i>ecosystem</i> first, and then work backwards from that to make programming choices.<p>It&#x27;s when you have the luxury of a greenfield project that doesn&#x27;t need legacy dependencies that choosing alternative cleaner syntax of Rust&#x2F;Swift is possible.  Amazon AWS and MS Azure are examples of doing new bare-metal projects with Rust instead of C++.","created_at":"2020-12-05T16:40:32Z","created_at_i":1607186432,"objectID":"25315815","parent_id":25314924,"story_id":25314126,"story_title":"Std::visit is everything wrong with modern C++ (2017)","story_url":"https://bitbashing.io/std-visit.html","updated_at":"2024-09-20T07:25:20Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"tannhaeuser"},"comment_text":{"fullyHighlighted":false,"matchLevel":"full","matchedWords":["withampersand"],"value":"&gt; <i>And it's really the URL (URI, IRI, URN...) that makes the web.</i><p>Well Chrome devs seem to disagree, with the recent push to hide URLs, and so do SPA devs. Is the article meant to save the URL, or rather a fairwell? Anyway, URLs aren't particularly well-designed IMO, for their use of the ampersand char as separator in the query part alone, since these conflict <em>with ampersand</em> as used for starting entity references in HTML and other SGML docs."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"The History of the URL"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"https://blog.cloudflare.com/the-history-of-the-url/"}},"_tags":["comment","author_tannhaeuser","story_22493216"],"author":"tannhaeuser","children":[22495899],"comment_text":"&gt; <i>And it&#x27;s really the URL (URI, IRI, URN...) that makes the web.</i><p>Well Chrome devs seem to disagree, with the recent push to hide URLs, and so do SPA devs. Is the article meant to save the URL, or rather a fairwell? Anyway, URLs aren&#x27;t particularly well-designed IMO, for their use of the ampersand char as separator in the query part alone, since these conflict with ampersand as used for starting entity references in HTML and other SGML docs.","created_at":"2020-03-05T17:22:55Z","created_at_i":1583428975,"objectID":"22495680","parent_id":22494456,"story_id":22493216,"story_title":"The History of the URL","story_url":"https://blog.cloudflare.com/the-history-of-the-url/","updated_at":"2024-09-20T05:47:11Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"jhallenworld"},"comment_text":{"fullyHighlighted":false,"matchLevel":"full","matchedWords":["withampersand"],"value":"I've implemented something like this in a non-LISP syntax language.  See:<p><a href=\"https://github.com/jhallen/joes-sandbox/tree/master/lang/ivy\" rel=\"nofollow\">https://github.com/jhallen/joes-sandbox/tree/master/lang/ivy</a><p>The idea is that in a function call, the arguments are normally evaluated before the call as usual.  But if a formal argument in the function's declaration is prefixed <em>with ampersand</em> then during a function call, that argument is not evaluated, but is instead packaged up as a zero-argument lambda function.  The argument can be called later using the normal function call syntax, but also there is semantic sugar: the * operator calls a zero-argument function.<p>Further, when a variable is evaluated, you get both its value and a reference to it.  This allows variables to be evaluated before being assigned to in assignments.  This sounds weird, but it works with the above.  You can make a &quot;set&quot; function which does the same thing as assignment:<p><pre><code>    # Define set function\n    fn set(&amp;left, right) {\n        *left = right\n    }\n\n    # Set x to 10\n    set x 10\n</code></pre>\nHere is how you could define switch using primitives (if the last argument is prefixed <em>with ampersand</em>, then any extra arguments are treated the same, but can only be accessed via argv):<p><pre><code>    fn switch(&amp;val) {\n            var rtn, x, v = *val\n            x = 1\n            while x &lt; len(argv) - 1 {\n                    if *argv(x) == v {\n                            return *argv(x + 1)\n                    }\n                    x += 2\n            }\n            if x &lt; len(argv) {\n                    return *argv(x)\n            }\n            return void\n    }\n</code></pre>\nExample use (8 arguments passed to switch- each set of braces is an argument):<p><pre><code>    switch 2 1 {\n        print &quot;one&quot;\n    } 2 {\n        print &quot;two&quot;\n    } 3 {\n        print &quot;three&quot;\n    } {\n        print &quot;default&quot;\n    }\n</code></pre>\n&quot;two&quot; is printed in this case.<p>Right now the delayed arguments are evaluated in the closure of the function call (so they are lexically scoped).  The wrap/unwrap concept from this paper gives me ideas on how to make this more versatile..."},"story_title":{"matchLevel":"none","matchedWords":[],"value":"$vau: the ultimate abstraction (2010) [pdf]"},"story_url":{"matchLevel":"none","matchedWords":[],"value":"https://web.wpi.edu/Pubs/ETD/Available/etd-090110-124904/unrestricted/jshutt.pdf"}},"_tags":["comment","author_jhallenworld","story_18405014"],"author":"jhallenworld","children":[18415976,18416695,18417031,18418009,18418968],"comment_text":"I&#x27;ve implemented something like this in a non-LISP syntax language.  See:<p><a href=\"https:&#x2F;&#x2F;github.com&#x2F;jhallen&#x2F;joes-sandbox&#x2F;tree&#x2F;master&#x2F;lang&#x2F;ivy\" rel=\"nofollow\">https:&#x2F;&#x2F;github.com&#x2F;jhallen&#x2F;joes-sandbox&#x2F;tree&#x2F;master&#x2F;lang&#x2F;ivy</a><p>The idea is that in a function call, the arguments are normally evaluated before the call as usual.  But if a formal argument in the function&#x27;s declaration is prefixed with ampersand then during a function call, that argument is not evaluated, but is instead packaged up as a zero-argument lambda function.  The argument can be called later using the normal function call syntax, but also there is semantic sugar: the * operator calls a zero-argument function.<p>Further, when a variable is evaluated, you get both its value and a reference to it.  This allows variables to be evaluated before being assigned to in assignments.  This sounds weird, but it works with the above.  You can make a &quot;set&quot; function which does the same thing as assignment:<p><pre><code>    # Define set function\n    fn set(&amp;left, right) {\n        *left = right\n    }\n\n    # Set x to 10\n    set x 10\n</code></pre>\nHere is how you could define switch using primitives (if the last argument is prefixed with ampersand, then any extra arguments are treated the same, but can only be accessed via argv):<p><pre><code>    fn switch(&amp;val) {\n            var rtn, x, v = *val\n            x = 1\n            while x &lt; len(argv) - 1 {\n                    if *argv(x) == v {\n                            return *argv(x + 1)\n                    }\n                    x += 2\n            }\n            if x &lt; len(argv) {\n                    return *argv(x)\n            }\n            return void\n    }\n</code></pre>\nExample use (8 arguments passed to switch- each set of braces is an argument):<p><pre><code>    switch 2 1 {\n        print &quot;one&quot;\n    } 2 {\n        print &quot;two&quot;\n    } 3 {\n        print &quot;three&quot;\n    } {\n        print &quot;default&quot;\n    }\n</code></pre>\n&quot;two&quot; is printed in this case.<p>Right now the delayed arguments are evaluated in the closure of the function call (so they are lexically scoped).  The wrap&#x2F;unwrap concept from this paper gives me ideas on how to make this more versatile...","created_at":"2018-11-09T16:43:58Z","created_at_i":1541781838,"objectID":"18415732","parent_id":18405014,"story_id":18405014,"story_title":"$vau: the ultimate abstraction (2010) [pdf]","story_url":"https://web.wpi.edu/Pubs/ETD/Available/etd-090110-124904/unrestricted/jshutt.pdf","updated_at":"2024-09-20T03:16:07Z"},{"_highlightResult":{"author":{"matchLevel":"none","matchedWords":[],"value":"laurenzlong"},"story_text":{"matchLevel":"none","matchedWords":[],"value":"Hey HN! I\u2019m one of the co-founders of Ampersand and we\u2019re excited to launch our developer docs today! Ampersand is built for SaaS engineers who want to:<p>- Read data from their customers\u2019 SaaS (e.g. Salesforce, Hubspot).<p>- Write data to their customers\u2019 SaaS.<p>- Subscribe to events happening in their customers\u2019 SaaS (including creates, deletes and field updates).<p>We feature a Terraform-like declarative interface for defining integrations, embeddable UI components for your users to set up and manage their integrations, and a management console for your team to monitor and troubleshoot.<p>We\u2019re launching our docs ahead of our product because we believe that docs are one of the most important things to get right in building a developer product, and we want to get early feedback on it. Looking forward to hearing your feedback in the comments below!"},"title":{"matchLevel":"none","matchedWords":[],"value":"Show HN: Ampersand \u2013 \u201cTerraform for Integrations\u201d"},"url":{"fullyHighlighted":false,"matchLevel":"full","matchedWords":["withampersand"],"value":"https://docs.<em>withampersand</em>.com/docs"}},"_tags":["story","author_laurenzlong","story_35562089","show_hn"],"author":"laurenzlong","children":[35565224],"created_at":"2023-04-13T21:08:59Z","created_at_i":1681420139,"num_comments":2,"objectID":"35562089","points":6,"story_id":35562089,"story_text":"Hey HN! I\u2019m one of the co-founders of Ampersand and we\u2019re excited to launch our developer docs today! Ampersand is built for SaaS engineers who want to:<p>- Read data from their customers\u2019 SaaS (e.g. Salesforce, Hubspot).<p>- Write data to their customers\u2019 SaaS.<p>- Subscribe to events happening in their customers\u2019 SaaS (including creates, deletes and field updates).<p>We feature a Terraform-like declarative interface for defining integrations, embeddable UI components for your users to set up and manage their integrations, and a management console for your team to monitor and troubleshoot.<p>We\u2019re launching our docs ahead of our product because we believe that docs are one of the most important things to get right in building a developer product, and we want to get early feedback on it. Looking forward to hearing your feedback in the comments below!","title":"Show HN: Ampersand \u2013 \u201cTerraform for Integrations\u201d","updated_at":"2024-09-20T13:51:46Z","url":"https://docs.withampersand.com/docs"}],"hitsPerPage":20,"nbHits":13,"nbPages":1,"page":0,"params":"query=withampersand&advancedSyntax=true&analyticsTags=backend","processingTimeMS":16,"processingTimingsMS":{"_request":{"queue":7,"roundTrip":23},"afterFetch":{"format":{"highlighting":2,"total":2},"merge":{"mergeLoop":{"prepareNextHit":5,"total":5},"total":5},"total":5},"fetch":{"query":4,"scanning":5,"total":10},"total":16},"query":"withampersand","serverTimeMS":26}
