<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Hacker News: dogfishbar</title><link>https://news.ycombinator.com/user?id=dogfishbar</link><description>Hacker News RSS</description><docs>https://hnrss.org/</docs><generator>hnrss v2.1.1</generator><lastBuildDate>Mon, 15 Jun 2026 12:22:23 +0000</lastBuildDate><atom:link href="https://hnrss.org/user?id=dogfishbar" rel="self" type="application/rss+xml"></atom:link><item><title><![CDATA[New comment by dogfishbar in "Northeastern's redesign of the CS curriculum"]]></title><description><![CDATA[
<p>Retired CS prof here (from a below (ok way-below) top-4 program). There is no longer a job market for CS grads outside of top-4? Is this true? I had no idea, as I understood it, CS major numbers are still rising.</p>
]]></description><pubDate>Mon, 13 Jan 2025 16:59:09 +0000</pubDate><link>https://news.ycombinator.com/item?id=42685608</link><dc:creator>dogfishbar</dc:creator><comments>https://news.ycombinator.com/item?id=42685608</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=42685608</guid></item><item><title><![CDATA[New comment by dogfishbar in "26 programming languages in 25 days, Part 2: Reflections on language design"]]></title><description><![CDATA[
<p>Sure, OCaml is great as are the other dialects of ML. I'm hoping that someone will weigh in with a compelling case for laziness everywhere or dynamic dispatch everywhere, other than pre-existing infrastructure, libraries, etc.</p>
]]></description><pubDate>Tue, 03 Jan 2023 15:28:14 +0000</pubDate><link>https://news.ycombinator.com/item?id=34232594</link><dc:creator>dogfishbar</dc:creator><comments>https://news.ycombinator.com/item?id=34232594</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=34232594</guid></item><item><title><![CDATA[New comment by dogfishbar in "26 programming languages in 25 days, Part 2: Reflections on language design"]]></title><description><![CDATA[
<p>Thanks for letting us tag along. What I'd like to hear are your thoughts on the  Groucho Marx cigar question: laziness is useful every now and then, but in lazy languages like Haskell you pay for it everywhere. The same is true for dynamic dispatch, it's needed when working with values of sum type. But like laziness, it isn't needed wall-to-wall but in dynamically-typed languages, you pay for it everywhere.
Give me a call-by-value language with arrow and sum types and I can pay as I go.
[edit: added "arrow and"]</p>
]]></description><pubDate>Tue, 03 Jan 2023 13:43:27 +0000</pubDate><link>https://news.ycombinator.com/item?id=34231173</link><dc:creator>dogfishbar</dc:creator><comments>https://news.ycombinator.com/item?id=34231173</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=34231173</guid></item><item><title><![CDATA[Elmish/MVU Library for Python?]]></title><description><![CDATA[
<p>I've been using simple animations in a CS1 course using the Elmish/model-view-update style in OCaml. In the spring I'll be teaching CS1 in Python. Does anyone know of a reasonable Elmish/MVU library for Python?</p>
<hr>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=29524319">https://news.ycombinator.com/item?id=29524319</a></p>
<p>Points: 1</p>
<p># Comments: 0</p>
]]></description><pubDate>Sat, 11 Dec 2021 21:08:03 +0000</pubDate><link>https://news.ycombinator.com/item?id=29524319</link><dc:creator>dogfishbar</dc:creator><comments>https://news.ycombinator.com/item?id=29524319</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=29524319</guid></item><item><title><![CDATA[New comment by dogfishbar in "Racket Compiler and Runtime Status"]]></title><description><![CDATA[
<p>Life goal: outlive dynamic type checking.</p>
]]></description><pubDate>Mon, 25 Jan 2021 05:07:51 +0000</pubDate><link>https://news.ycombinator.com/item?id=25899482</link><dc:creator>dogfishbar</dc:creator><comments>https://news.ycombinator.com/item?id=25899482</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=25899482</guid></item><item><title><![CDATA[New comment by dogfishbar in "Postfix: A Simple Stack Language (2005) [pdf]"]]></title><description><![CDATA[
<p>Lyn T. is one of a small handful of the best CS educators on the planet. Good job HN!</p>
]]></description><pubDate>Wed, 03 Jun 2020 01:38:54 +0000</pubDate><link>https://news.ycombinator.com/item?id=23398752</link><dc:creator>dogfishbar</dc:creator><comments>https://news.ycombinator.com/item?id=23398752</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=23398752</guid></item><item><title><![CDATA[New comment by dogfishbar in "Lisp is not based on the Lambda Calculus"]]></title><description><![CDATA[
<p>I spent a lot of time on this. See M-LISP: a representation-independent dialect of LISP with reduction semantics, TOPLAS, 1992, the relevant bit is in section 2.<p>It's true that J. McCarthy had only a passing familiarity with LC. M-expression LISP, as it was originally conceived, was all about first-order recursion schemes over S-expressions. But due to a very simple error in the base case of an inductive definition, LISP 1.0 "featured" or "supported" higher-order functions, ala LC.</p>
]]></description><pubDate>Wed, 14 Aug 2019 19:19:50 +0000</pubDate><link>https://news.ycombinator.com/item?id=20698973</link><dc:creator>dogfishbar</dc:creator><comments>https://news.ycombinator.com/item?id=20698973</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=20698973</guid></item><item><title><![CDATA[New comment by dogfishbar in "Robert and Virginia Heinlein's Colorado Springs House"]]></title><description><![CDATA[
<p>Robert Heinlein's nephew Terrance Heinlein (Terry) is a brilliant architect.
Bob Muller</p>
]]></description><pubDate>Fri, 19 Oct 2018 00:55:14 +0000</pubDate><link>https://news.ycombinator.com/item?id=18253581</link><dc:creator>dogfishbar</dc:creator><comments>https://news.ycombinator.com/item?id=18253581</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=18253581</guid></item><item><title><![CDATA[New comment by dogfishbar in "Just what does “code as data” mean anyway? (2014)"]]></title><description><![CDATA[
<p>M-LISP: a representation-independent dialect of LISP with reduction semantics<p>In this paper we introduce M-LISP, a dialect of LISP designed with an eye toward reconciling LISP's metalinguistic power with the structural style of operational semantics advocated by Plotkin [28]. We begin by reviewing the original definition of LISP [20] in an attempt to clarify the source of its metalinguistic power. We find that it arises from a problematic clause in this definition. We then define the abstract syntax and operational semantics of M-LISP, essentially a hybrid of M-expression LISP and Scheme. Next, we tie the operational semantics to the corresponding equational logic. As usual, provable equality in the logic implies operational equality. Having established this framework we then extend M-LISP with the metalinguistic eval and reify operators (the latter is a nonstrict operator that converts its argument to its metalanguage representation). These operators encapsulate the metalinguistic representation conversions that occur globally in S-expression LISP. We show that the naive versions of these operators render LISP's equational logic inconsistent. On the positive side, we show that a naturally restricted form of the eval operator is confluent and therefore a conservative extension of M-LISP. Unfortunately, we must weaken the logic considerably to obtain a consistent theory of reification.</p>
]]></description><pubDate>Sat, 17 Feb 2018 04:32:22 +0000</pubDate><link>https://news.ycombinator.com/item?id=16399021</link><dc:creator>dogfishbar</dc:creator><comments>https://news.ycombinator.com/item?id=16399021</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=16399021</guid></item><item><title><![CDATA[The Genealogy of Programming Languages – 30K ft edition]]></title><description><![CDATA[
<p>Article URL: <a href="https://github.com/dogfishbar/dogfishbar.github.io/blob/master/genealogyOfPL30KFtEdition.md">https://github.com/dogfishbar/dogfishbar.github.io/blob/master/genealogyOfPL30KFtEdition.md</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=16116597">https://news.ycombinator.com/item?id=16116597</a></p>
<p>Points: 1</p>
<p># Comments: 0</p>
]]></description><pubDate>Wed, 10 Jan 2018 17:01:34 +0000</pubDate><link>https://github.com/dogfishbar/dogfishbar.github.io/blob/master/genealogyOfPL30KFtEdition.md</link><dc:creator>dogfishbar</dc:creator><comments>https://news.ycombinator.com/item?id=16116597</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=16116597</guid></item><item><title><![CDATA[The Genealogy of Programming Languages – 30K ft edition]]></title><description><![CDATA[
<p>Article URL: <a href="https://github.com/dogfishbar/dogfishbar.github.io/blob/master/genealogyOfPL30KFtEdition.md">https://github.com/dogfishbar/dogfishbar.github.io/blob/master/genealogyOfPL30KFtEdition.md</a></p>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=16102396">https://news.ycombinator.com/item?id=16102396</a></p>
<p>Points: 2</p>
<p># Comments: 0</p>
]]></description><pubDate>Tue, 09 Jan 2018 00:36:13 +0000</pubDate><link>https://github.com/dogfishbar/dogfishbar.github.io/blob/master/genealogyOfPL30KFtEdition.md</link><dc:creator>dogfishbar</dc:creator><comments>https://news.ycombinator.com/item?id=16102396</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=16102396</guid></item><item><title><![CDATA[Comcast alternatives in Greater Boston?]]></title><description><![CDATA[
<p>I'd like to swap out Comcast for something less predatory. Any suggestions for Boston?</p>
<hr>
<p>Comments URL: <a href="https://news.ycombinator.com/item?id=15926482">https://news.ycombinator.com/item?id=15926482</a></p>
<p>Points: 1</p>
<p># Comments: 1</p>
]]></description><pubDate>Thu, 14 Dec 2017 20:11:46 +0000</pubDate><link>https://news.ycombinator.com/item?id=15926482</link><dc:creator>dogfishbar</dc:creator><comments>https://news.ycombinator.com/item?id=15926482</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=15926482</guid></item><item><title><![CDATA[New comment by dogfishbar in "Why ML/OCaml are good for writing compilers (1998)"]]></title><description><![CDATA[
<p>I have been teaching OCaml in CS1 at Boston College for 4 years now. Of hundreds of students who went on to learn Java in our CS2 course (joining Python-trained students from other sections of CS1), nearly unanimous happy campers. When OCaml is their first programming language, they're good to go.</p>
]]></description><pubDate>Sun, 16 Apr 2017 00:36:51 +0000</pubDate><link>https://news.ycombinator.com/item?id=14123689</link><dc:creator>dogfishbar</dc:creator><comments>https://news.ycombinator.com/item?id=14123689</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=14123689</guid></item><item><title><![CDATA[New comment by dogfishbar in "Whiteboard problems in pure Lambda Calculus"]]></title><description><![CDATA[
<p>Nice article! But you have a typo.<p>(λx.x y)<p>does not return y, though<p>(\x.x) y<p>does.</p>
]]></description><pubDate>Tue, 21 Mar 2017 03:55:19 +0000</pubDate><link>https://news.ycombinator.com/item?id=13919758</link><dc:creator>dogfishbar</dc:creator><comments>https://news.ycombinator.com/item?id=13919758</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=13919758</guid></item><item><title><![CDATA[New comment by dogfishbar in "Ask HN: Overwhelmed with learning front-end, how do I proceed?"]]></title><description><![CDATA[
<p>I'm teaching a sophomore level web apps course in the spring semester. I'm torn between doing what I think will help them land an internship this summer or land a real job and on the other hand, teaching them something like Elm which makes much more sense to me. Anybody willing to weigh in on these? It would be greatly appreciated.
1. Would a course focussing on just the front end using HTML + CSS + JS + React be reasonable?
2. Is it reasonable to deal only with the front end?
3. If the answer to 2. is no, then what is most reasonable and likely to endure technology for the back end?</p>
]]></description><pubDate>Mon, 07 Nov 2016 13:00:48 +0000</pubDate><link>https://news.ycombinator.com/item?id=12890665</link><dc:creator>dogfishbar</dc:creator><comments>https://news.ycombinator.com/item?id=12890665</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=12890665</guid></item><item><title><![CDATA[New comment by dogfishbar in "Lisp: it's not about macros, it's about READ (2012)"]]></title><description><![CDATA[
<p>Akkartik: the paper of mine that you cited has a bunch of theorems following the program laid out by Gordon Plotkin in the single best paper I ever read: "Call-by-Name, Call-by-Value and the Lambda Calculus" - a truly profound piece of work that is still worth careful study. But my TOPLAS paper on the topic of LISP can safely be skipped --- the punch-line, as I said, is that the amazing genius John McCarthy messed up the base-case for the definition of his hat(.) function. Stuff happens. In the process, he invented (the very buggy) LISP which was the essential bridge between the true source of sensible computation --- (typed) lambda calculus --- and modern and future software.<p>(And for what it's worth (ha!) the architect for my present residence was the amazing Terry Heinlein, nephew of Robert Heinlein (of "grok" fame.))</p>
]]></description><pubDate>Wed, 20 Jul 2016 03:16:49 +0000</pubDate><link>https://news.ycombinator.com/item?id=12126630</link><dc:creator>dogfishbar</dc:creator><comments>https://news.ycombinator.com/item?id=12126630</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=12126630</guid></item><item><title><![CDATA[New comment by dogfishbar in "Lisp: it's not about macros, it's about READ (2012)"]]></title><description><![CDATA[
<p>Thank you for reminding me, McCarthy also invented COND which eventually led to the great modern pattern matching forms.<p>An ironic side-story of this that may or may not be of interest:<p>Because QUOTE was mis-defined, McCarthy had to hack his definition of APPLY/EVAL to get it to work. One consequence of this hacking was that the S-expression LISP "defined" by his version of APPLY/EVAL was a higher-order language while the M-expression LISP that he was attempting to model was strictly first-order. So in his S-expression LISP he could write the MAP function (called "mapcar" back in the day) but the syntax of M-expressions leaves no way to express MAP.<p>I find it so ironic that it took this little representation error to lead to LISP having the essential property of lambda calculus. (Guy Steele fixed most of the trouble with the grammar and introduced proper lexical scoping in Scheme but he didn't catch the quote bug.) It's also fair to say that M-expression LISP wouldn't have changed the world as S-expression LISP did.<p>I don't know if Paul Graham reads HN but Paul once wrote a book on macros in LISP. As far as I know, he doesn't know this story about QUOTE. It doesn't seem to have slowed him down.</p>
]]></description><pubDate>Mon, 18 Jul 2016 11:54:59 +0000</pubDate><link>https://news.ycombinator.com/item?id=12114528</link><dc:creator>dogfishbar</dc:creator><comments>https://news.ycombinator.com/item?id=12114528</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=12114528</guid></item><item><title><![CDATA[New comment by dogfishbar in "Lisp: it's not about macros, it's about READ (2012)"]]></title><description><![CDATA[
<p>Fair enough, I felt I was droning on but it's true that I didn't show the key mistake. Here it is.<p>If you want to represent an arbitrary M-expression as an M-expression, it's most natural to use S-expressions for the representation language, these are the -values- in M-expression LISP. (In lambda calculus we have more choices, normal-forms or weak-head normal-forms). McCarthy defined hat(.), naturally enough, by induction on the structure of M-expressions. For each M-expression, we need an S-expression representation. (Note that we use uppercase symbols for the symbolic constants and lowercase symbols for identifiers.) Here goes:<p>hat(S) == (QUOTE S)<p>hat(x) == X<p>hat(if[M1; M2; M3]) == (IF hat(M1) hat(M2) hat(M3))<p>etc..<p>But HOLD ON! The S-expressions have inductive structure(!). The definition of hat(S) should have been:<p>hat(A) == (SYM A)<p>hat(()) == (NIL)<p>hat((S1 . S2)) == (PAIR hat(S1) hat(S2))<p>There are sensible mathematical properties that this latter representation has that the former doesn't. It's a bit of a long story. But the bottom line is that QUOTE, was defined erroneously. (And John McCarthy burst out laughing when I explained it to him.)<p>RM<p>apologies, more typos.</p>
]]></description><pubDate>Mon, 18 Jul 2016 03:06:53 +0000</pubDate><link>https://news.ycombinator.com/item?id=12113047</link><dc:creator>dogfishbar</dc:creator><comments>https://news.ycombinator.com/item?id=12113047</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=12113047</guid></item><item><title><![CDATA[New comment by dogfishbar in "Lisp: it's not about macros, it's about READ (2012)"]]></title><description><![CDATA[
<p>I published a paper on this in the ACM Transactions on Programming Languages and Systems (TOPLAS) back in 1992. The title was "M-LISP: A Representation-independent Dialect of LISP with Reduction Semantics". No need to read it, the punch-line is above.<p>Fixed yet another typo.</p>
]]></description><pubDate>Mon, 18 Jul 2016 02:36:34 +0000</pubDate><link>https://news.ycombinator.com/item?id=12112969</link><dc:creator>dogfishbar</dc:creator><comments>https://news.ycombinator.com/item?id=12112969</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=12112969</guid></item><item><title><![CDATA[New comment by dogfishbar in "Lisp: it's not about macros, it's about READ (2012)"]]></title><description><![CDATA[
<p>OK, you asked! LISP was originally developed as a language for writing recursive functions of symbolic expressions (S-expressions). It was roughly based on lambda calculus, the language developed by Alonzo Church. But roughly is the key word. S-expressions are given by the context-free grammar:<p>S ::= A | [] | (S . S)<p>One can write data structures this way and lists by using the abbreviation:<p>(S1 . (S2 . ( ... ( SK . ()) ...))) == (S1 S2 ... SK)<p>The terms that manipulated these S-expressions were called M-expressions. They were first-order terms. McCarthy's key idea was to use a conditional in conjunction with a label form to define recursive functions (in the service of various AI applications). The M-expressions were defined roughly as follows:<p>M ::= S | x | if[M; M; M] | f[M; ...; M]<p>f ::= lambda[[x1; ...; xn]; M] | label[g; M]<p>(I'm not 100% confident that I remember the exact details on this syntax but the idea is correct!)<p>McCarthy wanted to show that his new language was Turing-complete. So he wanted to exhibit a universal function APPLY (derivable from f above) such that for any function f and arguments M1; ...; Mk such that f[M1; ...; Mk] evaluates to S-expression S, well, given a representation of f[M1;...;Mk], lets call it, hat(f[M1;...;Mk]), well<p>APPLY[hat(f); hat(M1);...;hat(Mk)] would evaluate to hat(S). This is pretty much a standard formulation of the recursion-theoretic argument. In order to close the sale, McCarthy had to exhibit such an APPLY and also the hat(.) function.
Sadly for all of us LISP lovers (!) he botched the definition of hat(.)! It left people utterly confused for 30+ years. Such a shame.<p>Fixed a couple of typos. Sorry! Fixed one other typo! It's been a while...</p>
]]></description><pubDate>Mon, 18 Jul 2016 02:16:50 +0000</pubDate><link>https://news.ycombinator.com/item?id=12112906</link><dc:creator>dogfishbar</dc:creator><comments>https://news.ycombinator.com/item?id=12112906</comments><guid isPermaLink="false">https://news.ycombinator.com/item?id=12112906</guid></item></channel></rss>