HNHacker News
TopNewBestAskShowJobs

news_to_me

1,347 karma · joined October 5, 2013

I'm Zack, a freelance full-stack web developer in Seattle. I've worked with clients on several Elixir web projects ranging from geography-based census data analytics to processing state COVID test results. I've designed web APIs, integrated with many third-party APIs, and restructured application architectures.

In 2023, as a side project, I created a small functional language called Cassette <https://cassette-lang.com>.

https://zjm.me | z@zjm.me

submissionscomments
news_to_me··on Melonking Website
Here's Seattle's version of that: https://www.dinostomatopie.com
news_to_me··on Ask HN: Freelancer? Seeking freelancer? (May 2025)
SEEKING WORK / Seattle / Remote

I'm a freelance full-stack web developer in Seattle. I've worked with clients on several Elixir web projects ranging from geography-based census data analytics to processing state COVID test results. I've also have experience with Node.js, Django, and React.

In 2023, as a side project, I created a small functional language called Cassette <https://cassette-lang.com>. Now I’m developing an S3 app for a classic Macintosh.

https://zjm.me | z@zjm.me

news_to_me··on I bought a Mac
Yeah it’s good general advice to always discharge the CRT. Although… the flyback transformer on most of these Macs has a bleeder resistor, so I skip it when I’m lazy now.
news_to_me··on I bought a Mac
Ooh this looks great
news_to_me··on I bought a Mac
Yeah, I’ve done it once already, hopefully this time I can do it a little cleaner.

Nice, any goodies you remember from that hoard?

news_to_me··on I bought a Mac
Funny timing, I also bought a Mac today - an SE/30. Looking forward to fixing it up.
news_to_me··on Adding row polymorphism to Damas-Hindley-Milner
I'm loving this series, it's one of the best I've found for explaining HM typing in an approachable way. Looking forward to more!
news_to_me··on Show HN: MacProxy Plus – Surf the Modern Web on Vintage Computers
Oh this looks perfect! I kind of intended to make something like this, but now I don't have to. Looking forward to replacing my macproxy with this to try it out :)
news_to_me··on What you learn by making a new programming language
This is so true. I feel like I've learned more about programming in the last two years making Cassette[1] than in the past decade of professional software development.

Every developer should make a language at some point. I want to see everyone's weird, half-baked languages! I want to hear about what other people struggled with, and the tradeoffs they've made!

[1]: https://cassette-lang.com

news_to_me··on Can the moon influence human health? New research
There's also a lot less visible sky in a lot of places in a city—it only takes four or five stories to limit your view and block the moon a lot of the time. And in my experience, it's less the brightness of lights than the sheer volume of light from a city that reduces the apparent brightness of the moon and stars. I'm always amazed how you can see the halo of a city over the horizon at night just from its lights.
news_to_me··on Physicists may now have a way to make element 120
For some background on the quest to discover new elements, I highly recommend this video: https://www.youtube.com/watch?v=Qe5WT22-AO8. The main story about Ninov's fraud is pretty interesting, but the beginning does a good overview of the recent history.
news_to_me··on The Elegance of the ASCII Table
> "a + ogonek accent" and another (properly) sent "a with ogonek" (these print the same but are semantically different!)

How can these possibly be semantically different? Isn’t the point of combining characters to create semantic characters that are the combination of those parts?

news_to_me··on Crafting Interpreters
This looks cool! How did you decide on what data types to include?
news_to_me··on Ask HN: Freelancer? Seeking freelancer? (May 2024)
SEEKING WORK | Seattle, Remote

I'm a full stack developer with 11 years of experience. I'm really good at Javascript and Elixir, and I have experience with Django, Wordpress, and Rails. Recently I've been tinkering with programming language design.

https://zjm.me | z@zjm.me

news_to_me··on Ask HN: Freelancer? Seeking freelancer? (April 2024)
SEEKING WORK | Seattle, WA | Remote

I'm Zack, a freelance full-stack web developer in Seattle. I've worked with clients on projects ranging from geography-based census data analytics to processing state COVID test results. I've designed web APIs, integrated with many third-party APIs, and restructured application architectures.

I have experience with Elixir, Node.js, React, Django, Typescript, and familiarity with other technologies.

z@zjm.me

news_to_me··on Mandala: A little plaground for testing pixel logic patterns
Per-pixel is pretty slow, most fast algorithms don’t do this. Also, this is on the Playdate, which uses a somewhat lean ARM chip (stm32f7).
news_to_me··on Show HN: TinyWasm – A tiny WebAssembly Runtime written in Rust
I’ve been working through the WebAssembly spec recently and it’s pretty interesting, there are many design aspects I wouldn’t have chosen.

Was there anything about the spec that was surprising or frustrating to you?

news_to_me··on Ask HN: Freelancer? Seeking freelancer? (March 2024)
SEEKING WORK | Seattle | Remote

I'm Zack, a freelance full-stack web developer in Seattle. I mostly work in Elixir, and I've worked with clients on several Elixir web projects ranging from geography-based census data analytics to processing state COVID test results. I've designed web APIs, integrated with many third-party APIs, and restructured application architectures.

I also have significant experience with Node.js, React, and custom Javascript front-ends, as well as some experience with Django, Ruby on Rails, and Wordpress. In my spare time I've written a software 3D rasterizer and a functional language called Cassette in C.

https://zjm.me | z@zjm.me

news_to_me··on Show HN: Cassette, a Personal Programming Language
Ok, I think I've got it working on Debian now. I've updated the "Getting Started" section with the dependencies: https://cassette-lang.com/#getting-started
news_to_me··on Show HN: Cassette, a Personal Programming Language
> (the font is great)

I also want to shout-out Berkeley Graphics, who made the monospace font. It's been my favorite for some time now.

https://berkeleygraphics.com

news_to_me··on Show HN: Cassette, a Personal Programming Language
Thanks! It's hard to escape making a syntax that's just a blend of other language's syntax elements, but I don't think that's a bad thing. Cassette's syntax is in some ways my favorite elements from other languages, and is most influenced by Elixir.

> How did you manage to use syntax highlighting for your own language on your website?

I used Pandoc to format a markdown file to HTML, which supports custom syntax definitions for code sections. (The relevent flags are `--standalone --template=template.html --syntax-definition=syntax.xml`.) The syntax definition is written in an XML format used by the Kate text editor (from KDE): https://docs.kde.org/stable5/en/kate/katepart/highlight.html

> One thing: I was confused (as others stated here I think) by the link to Robins Loan's website and thought it was an other article from you about Cassette.

Thanks, I'll clarify this or remove it soon.

> Would you consider writing a blog post about how you created it (building the lexer, parser, etc.)? I would definitely be interested.

For sure! I've been meaning to write up some of the technical aspects of the project, so those will appear on the site at some point in the future.

news_to_me··on Show HN: Cassette, a Personal Programming Language
Oooh I may have to do this!
news_to_me··on Show HN: Cassette, a Personal Programming Language
That was a pretty late change to the syntax actually — I really, really wanted Javascript-style lambdas but with a skinny arrow, like `(x, y) -> x + y`. But it made parsing and compiling really finicky, so I settled on the backslash syntax, which I've seen in a couple other languages. It almost looks like a "λ"!
news_to_me··on Show HN: Cassette, a Personal Programming Language
Thanks! While working on this, whenever I would browse another language project's site I got into the habit of asking myself what I wanted to see, in what order. For better or worse, I really want to see a language's syntax first. I think it gives some context, and helps readers connect the concepts of a language to something more visual and concrete.
news_to_me··on Show HN: Cassette, a Personal Programming Language
Ah yeah, I got a little lazy at the end so the build process is probably a little macOS specific. I'd love to receive patches or bug reports when you get the chance!
news_to_me··on Show HN: Cassette, a Personal Programming Language
Yeah, the syntax is heavily inspired by Elixir, which was of the first languages that "looked right" to me. And Elixir's syntax is very Ruby-inspired, in turn.
news_to_me··on Show HN: Cassette, a Personal Programming Language
I think it's pretty similar semantically, though not syntactically — a lot of it is applying the last chapters of Structure and Interpretation of Computer Programs, which shows you how to build a Lisp interpreter and compiler.
news_to_me··on Show HN: Cassette, a Personal Programming Language
Yeah I went back and forth on this a little bit. If all variables are defined at the beginning of the `let` expression, you can't rebind a variable like this (assuming some previous `x`):

    let x = x + 1
because the new `x` shadows the old one before `x + 1` is compiled. But if you're defining a recursive function, like this:

    let foo = \n -> foo(n + 1)
you need `foo` to be defined before you compile the lambda body, or else the compiler will think you're referencing an undefined variable.

At one point I had an exception where, if the value of a variable being defined is a lambda, it defines the variable first to allow recursion, but not otherwise. But this felt inconsistent and kind of gross. Instead, I decided to have `def` expressions behave like that, and disallow recursion in `let`. `def` is always a function definition, so you'd almost always want that behavior, and I felt that since it has a different syntax, slightly different assignment semantics wouldn't be so bad.

For mutual recursion you have to go a little further, and find all the definitions in the block before you start compiling anything. So `def` expressions are also hoisted to the top of the block and pre-defined at the beginning. This felt ok to me since `def` expressions look like big, formal, static definitions anyway, and it didn't seem surprising that they would have whole-block scope.

news_to_me··on Show HN: Cassette, a Personal Programming Language
Thanks! A big part of the project was discovering all of those philosophical sort of trade offs. Going in, I had a naive idea that I could figure out the “perfect language” for me that expressed exactly how I thought. I have a ton more respect for language maintainers now, even when they make decisions I disagree with.
news_to_me··on Show HN: Cassette, a Personal Programming Language
I dunno, there are a few things I like highlighted that you can’t easily do with just a tokenizer, like parameters or function calls.

> Auto-formatting is also easy: just don't do it.

I agree with this, except that auto-closing grouping symbols is extremely useful and turns out to be pretty easy to support.

Page 1 of 14Next →