1,347 karma · joined October 5, 2013
In 2023, as a side project, I created a small functional language called Cassette <https://cassette-lang.com>.
https://zjm.me | z@zjm.me
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
Nice, any goodies you remember from that hoard?
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!
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?
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
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
Was there anything about the spec that was surprising or frustrating to you?
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
I also want to shout-out Berkeley Graphics, who made the monospace font. It's been my favorite for some time now.
> 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.
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.
> 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.