diff --git a/HISTORY.md b/HISTORY.md
index 407dee2d..98259164 100644
--- a/HISTORY.md
+++ b/HISTORY.md
@@ -23,7 +23,10 @@ License.
For a full list of releases, see
github.
-## 0.1 / 2019-xx-xx
+## 0.1 / 2019-07-24
-Work in progress
+Initial release features the core language (primitive types, lists,
+tuples, records; `let`, `if`, `fn` and `match` expressions; `val`,
+`fun` and `datatype` declarations), an interactive shell `smlj`, and
+relational extensions (`from`).
diff --git a/HOWTO.md b/HOWTO.md
new file mode 100644
index 00000000..c57064a5
--- /dev/null
+++ b/HOWTO.md
@@ -0,0 +1,91 @@
+
+# smlj HOWTO
+
+## How to make a release (for committers)
+
+Make sure `mvn clean install`, `mvn site`, and
+`mvn javadoc:javadoc javadoc:test-javadoc` pass under JDK 8 - 12.
+
+Write release notes. Run the
+[relNotes](https://github.com/julianhyde/share/blob/master/tools/relNotes)
+script and append the output to [HISTORY.md](HISTORY.md).
+
+Update version numbers in README and README.md,
+and the copyright date in NOTICE.
+
+Switch to JDK 11.
+
+Check that the sandbox is clean:
+
+```bash
+git clean -nx
+mvn clean
+```
+
+Prepare:
+
+```bash
+export GPG_TTY=$(tty)
+mvn -Prelease -DreleaseVersion=x.y.0 -DdevelopmentVersion=x.(y+1).0-SNAPSHOT release:prepare
+```
+
+Perform:
+
+```bash
+mvn -Prelease -DskipTests release:perform
+```
+
+Stage the release:
+* Go to https://oss.sonatype.org and log in.
+* Under "Build Promotion", click on "Staging Repositories".
+* Select the line "smlj-nnnn", and click "Close". You might need to
+ click "Refresh" a couple of times before it closes.
+
+After testing, publish the release:
+* Go to https://oss.sonatype.org and log in.
+* Under "Build Promotion", click on "Staging Repositories".
+* Select the line "smlj-nnnn", and click "Release".
+
+Wait a couple of hours for the artifacts to appear on Maven central,
+and announce the release.
+
+Update the [github release list](https://github.com/julianhyde/smlj/releases).
+
+## Cleaning up after a failed release attempt (for committers)
+
+```bash
+# Make sure that the tag you are about to generate does not already
+# exist (due to a failed release attempt)
+git tag
+
+# If the tag exists, delete it locally and remotely
+git tag -d smlj-X.Y.Z
+git push origin :refs/tags/smlj-X.Y.Z
+
+# Remove modified files
+mvn release:clean
+
+# Check whether there are modified files and if so, go back to the
+# original git commit
+git status
+git reset --hard HEAD
+```
diff --git a/README b/README
new file mode 100644
index 00000000..83b5013f
--- /dev/null
+++ b/README
@@ -0,0 +1,14 @@
+smlj release 0.1.0
+
+This is a source or binary distribution of smlj.
+
+Changes since the previous release are described in the
+HISTORY.md file.
+
+The LICENSE and NOTICE files contain license information.
+
+If this is a source distribution, you can find instructions how to
+build the release in the "Building" section in README.md.
+
+Further information about smlj is available at its web site,
+https://github.com/julianhyde/smlj.
diff --git a/README.md b/README.md
index b17d4a02..d039285c 100644
--- a/README.md
+++ b/README.md
@@ -36,7 +36,7 @@ Get smlj from
net.hydromatic
smlj
- 0.1
+ 0.1.0
```
@@ -53,6 +53,18 @@ On Windows, the last line is
```bash
> mvnw install
```
+
+### Run the shell
+
+```bash
+$ ./smlj
+smlj version 0.1.0 (java version "11.0.4", JLine terminal, xterm-256color)
+= "Hello, world!";
+val it = "Hello, world!" : string
+= exit
+$
+```
+
## Status
Implemented:
@@ -73,7 +85,7 @@ Implemented:
* `if`
* `case`
* Primitive, list, tuple and record types
-* Type variables (polymorphism)
+* Type variables (polymorphism) (but see "bugs")
* Enumerated types (`datatype`)
* Tuples and unit, record and list values
* Patterns (destructuring) in `val` and `case`,
@@ -93,6 +105,8 @@ Not implemented:
* Type annotations in expressions and patterns
Bugs:
+* Unbound type variables are not yet supported. For example, the
+ expression `[]` should have type `'a list` but currently fails
* Prevent user from overriding built-in constants and functions:
`true`, `false`, `nil`, `ref`, `it`, `::`; they should not be reserved
* Access parameters and variables by offset into a fixed-size array;
diff --git a/pom.xml b/pom.xml
index d91a9c7b..cafff8cd 100644
--- a/pom.xml
+++ b/pom.xml
@@ -40,8 +40,8 @@ License.
- The Apache Software License, Version 2.0
- http://www.apache.org/licenses/LICENSE-2.0.txt
+ Apache License, Version 2.0
+ https://www.apache.org/licenses/LICENSE-2.0.txt
repo
diff --git a/src/main/java/net/hydromatic/sml/Shell.java b/src/main/java/net/hydromatic/sml/Shell.java
index d5ff8335..23bd75b3 100644
--- a/src/main/java/net/hydromatic/sml/Shell.java
+++ b/src/main/java/net/hydromatic/sml/Shell.java
@@ -117,7 +117,7 @@ private void printAll(List lines) {
/** Generates a banner to be shown on startup. */
private String banner() {
- return "smlj version 0.1-SNAPSHOT"
+ return "smlj version 0.1.0"
+ " (java version \"" + System.getProperty("java.version")
+ "\", JRE " + System.getProperty("java.vendor.version")
+ " (build " + System.getProperty("java.vm.version")