diff --git a/README.md b/README.md index 686ff7b..863d849 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ Concretely, that rules out a few things that would otherwise be tempting: pages the compiler generates rather than a list maintained here. - No examples written here. The playground's are the compiler's corpus at the pinned tag, and the summary under each one is the comment at the top of the - file. Which thirteen of them the picker offers is a choice made here, and it is + file. Which fourteen of them the picker offers is a choice made here, and it is the only one: choosing what to show is not writing it, and every file is still served. The landing page's program is the exception, and it is short and its refusal was still produced by running it. @@ -98,11 +98,11 @@ records the capabilities they asked for. That leaves exactly one example this page can start, and Run is off for the other twenty-eight with the reason beside it, rather than letting somebody press it and be refused. -The picker shows thirteen of the twenty-nine, and that list is in +The picker shows fourteen of the twenty-nine, and that list is in `tools/artifact.mjs` because both tools need it. The corpus is not a menu: about half of it is one language feature at a time, written so the compiler's own tests have something to read, and a visitor scrolling past `sink`, `names` -and `diverge` is being shown the inside of a test suite. The other sixteen stay +and `diverge` is being shown the inside of a test suite. The other fifteen stay here, still asked about, still reachable by name. Forgetting that step is caught rather than shipped. `tools/check.mjs` asks the diff --git a/examples/index.json b/examples/index.json index 285cea6..0a9a17c 100644 --- a/examples/index.json +++ b/examples/index.json @@ -146,7 +146,7 @@ }, { "file": "proven.deed", - "shown": 12, + "shown": 13, "summary": "The Proven tier, which is the part of this language that is supposed to be interesting.", "runs": false, "needs": [], @@ -223,7 +223,7 @@ }, { "file": "transfer.deed", - "shown": -1, + "shown": 12, "summary": "The running example, and two of the fourteen design documents work through it: design/02-syntax.md and design/03-effects.md.", "runs": false, "needs": [], diff --git a/install/index.html b/install/index.html index 2254f08..ede1068 100644 --- a/install/index.html +++ b/install/index.html @@ -57,8 +57,9 @@

A function can only do what its signature admits to.

Install

- One file. The compiler, the formatter, the test runner and the - language server are all in it, and there is nothing else to install. + One file. The compiler, the test runner, the formatter, the + WebAssembly backend, the language server, the debugger and the agent + server are all in it, and there is nothing else to install.

+

What else is in it

+

+ The same file with a different first word each time. None of them + needs anything else on the machine, and + deed --help is the longer version of this table. +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CommandWhat it is
deed checkThe compiler. Silence is the answer.
deed test + The test blocks, and the properties a contract generates. It + refuses to run anything that does not check. +
deed run + Calls main, handing it the one + System capability there is. +
deed build + Compiles to WebAssembly. With --component, writes + the .wit world the effect rows add up to, which is + the one clause page. +
deed doc + A module's API reference, as Markdown. No visibility modifiers + here, so there is nothing to decide about what belongs on it. +
deed fmtOne canonical form, and no options for the output.
deed fix + Applies the repairs that are certain and leaves the guesses + alone. +
deed explain + The page for one diagnostic code. + Every code has one. +
deed lspA language server, for an editor to start rather than you.
deed debug + A debug adapter: breakpoints, stepping, and the stack and + bindings of every active call. +
deed mcp + A Model Context Protocol server, so an agent can ask the + compiler the questions an editor asks. +
+

+ The last one is worth a second sentence, because the argument this + language is built on is that most code is no longer typed out by a + person. deed mcp holds no capability: a program arrives + as text and the answer leaves as text, and nothing it runs can reach + a file. What it hands back is not only the diagnostics but which tier + each obligation landed in, so the thing writing the code can see the + difference between a contract that was proved and one that was left + to a runtime check. +

+

From source

Needs Rust 1.85 or newer, and nothing else:

$ git clone https://github.com/deed-lang/deed
diff --git a/tools/artifact.mjs b/tools/artifact.mjs
index a1baef2..d90f413 100644
--- a/tools/artifact.mjs
+++ b/tools/artifact.mjs
@@ -13,12 +13,18 @@ import { readFile } from "node:fs/promises";
 // one language feature at a time, written so the compiler's own tests have
 // something to read, and a visitor scrolling past `sink`, `names` and
 // `diverge` is being shown the inside of a test suite. So the picker is
-// thirteen programs a person would recognise, and the rest stay on disk, still
+// fourteen programs a person would recognise, and the rest stay on disk, still
 // asked about here and still reachable by name.
 //
 // `hello` is first because it is the only one this page can start. The others
 // have tests, which is the button that works for them.
 //
+// `transfer` is late rather than absent, which it was for four releases. It is
+// the program every design document works through and the one the README
+// opens with, and it is not a feature written down on its own: it is a ledger
+// with an effect, a handler, a contract and a refinement in it. Leaving it out
+// while offering `counter` was an oversight rather than a judgement.
+//
 // It lives beside the code that asks the compiler because both tools need it:
 // one writes the order into the index and the other checks it is still there.
 export const SHOWN = [
@@ -34,6 +40,7 @@ export const SHOWN = [
   "logs.deed",
   "todo.deed",
   "tasks.deed",
+  "transfer.deed",
   "proven.deed",
 ];