Meow Programming Language v0.21.4: The Documentation Says What the Language Does

Released 2026-08-20. No compiler behaviour changed in this one. What changed is that the documentation now describes the language that v0.17.0 through v0.21.3 actually built, and a test keeps it that way.

What the reference did not say

The reference had never learned about nab go at all — its import section ended at the list of Meow’s own packages. Reaching a Go package by import path, naming it with tag, and pinning a version with @ are all documented now, and every example was run rather than written from memory:

nab go "github.com/Masterminds/semver/v3@v3.3.1"

nyan v = semver.must_parse("v1.4.2")
nya(v.string())    # 1.4.2

Its member-access section still described a dot that reaches fields, groom methods and package functions — which is what a dot did before v0.19.1. A keyword used as a member name, a member or a named function taken as a value, and a binding taking a name over are all described now:

kitty Cat {
  name: string
  age: int
}

groom Cat {
  meow show() string {
    bring self.name + " (age " + to_string(self.age) + ")"
  }
}

meow double(n int) int { bring n * 2 }

nyan nyantyu = Cat("Nyantyu", 3)
nyan tell = nyantyu.show       # not called: the method, bound to nyantyu
nya(tell())                    # Nyantyu (age 3)
nya(lick([1, 2, 3], double))   # [2, 4, 6]

What both documents said that was no longer true

The trill rules were stated without the qualifier v0.21.3 gave them:

Calling … a non-trill user function is a compile error

That holds only when the name reaches that function. A pure body may hold a pure local of its own where an impure function happens to share the name. Both the specification and the reference now say so, with the example.

The website copies had drifted seventeen commits

The four documents on this site — specification, reference, standard library and internals — are copies kept by hand, and the specification had been drifting for seventeen commits. The site was describing a language with no scram, no basket, no json package, no conditional purr, no bolt or slink and no way to reach a Go package, while still carrying a “known limitation” that had been fixed.

All four copies are now what the documents say, keeping the front matter Hugo needs and the opening line each was given for a search engine — the two differences that are deliberate.

Nothing had said when a copy fell behind: the site builds, the tests pass, and only a reader finds out. docs/docs_test.go now checks each pair line by line and names the file and line where they part, verified by breaking it on purpose:

docs/spec.md and its website copy differ at line 509:
  docs:    "### Return Statement"
  website: "### Return Statement (drifted)"

Upgrading

Nothing to change — the binary is unchanged apart from its version. Reading the specification and the reference again is the point of this one.

brew upgrade meow
# or
go install github.com/135yshr/meow/cmd/meow@v0.21.4