Getting Started with Miranda

I’ve been interested in exploring the Miranda programming language. Miranda influenced Haskell. Haskell was used for programs I use almost daily such as Pandoc and shellcheck. I’ve given a quick review of miranda.org.uk to get a sense of the language but to follow along with the Miranda: The Craft of Functional Programming it is really helpful to have Miranda available on my machine. Today that machine is a Mac Mini, M1 processor, running macOS Sonoma (14.4.x) and the related Xcode C tool chain. I ran into to minor hiccups in compilation and installation. Both easy to overcome but ones I will surely forget in the future. Thus I write myself another blog post.

Compilation

First down load Miranda source code at http://miranda.org.uk/downloads. The version 2.066 is the most recent release I saw linked (2024-04-25), http://www.cs.kent.ac.uk/people/staff/dat/ccount/click.php?id=11. The COPYING link shows the terms under which this source release is made available.

Next you need to untar/gzip the tarball you downloaded. Try running make to see if it compiles. On my Mac Mini I got a compile error that looks like

make
gcc -w    -c -o data.o data.c
data.c:666:43: error: incompatible integer to pointer conversion passing 'word' (aka 'long') to parameter of type 'char *' [-Wint-conversion]
                     else fprintf(f,"%c%s",HERE_X,mkrel(hd[x]));
                                                        ^~~~~
1 error generated.
make: *** [data.o] Error 1

While I’m rusty on C I read this as the C compiler being more strict today then it was back in the 1990s. That’s a good thing generally. Next I checked the compiler version.

gcc --version
Apple clang version 15.0.0 (clang-1500.3.9.4)
Target: arm64-apple-darwin23.4.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

I’m using clang and the website mentioned it should compile with clang for other platforms. I reviewed the data.c file and notice other similar lines that invoked mkrel(hd[x]) had a (char *) cast in front of hd[x]. This tells me that being explicit with the compiler might solve my problem. I edited line 666 of data.c to look like

    else fprintf(f,"%c%s",HERE_X,mkrel((char *)hd[x]));

Save the file and then ran Make again. It compile cleanly. I gave at quick test run of the mira command creating an simple function called addone

mira
/edit
addone a = a + 1
:wq
addone (addone (addone 3))
6
/q

Miranda seems to work. The Makefile comes with a an install rule but the install defaults doesn’t really work with macOS (it wants to install into /usr). I’d rather it install into my home directory so I copied the Makefile to miranda.mak and change the lines setting BIN, LIB and MAN to the following lines.

BIN=$(HOME)/bin
LIB=$(HOME)/lib#beware no spaces after LIB
MAN=$(HOME)/man/man1

In my .profile I set the MIRALIB variable to point at $HOME/lib/miralib. I opened a new terminal session and ran mira and the interpreter was up and running.