~ft/femtolisp

Femtolisp: Gedo Art of Rinne Rebirth

4cada3c closure op: align function on 32-bit systems

~ft pushed to ~ft/femtolisp git

2 days ago

11fd8f6 vm: apply_cl: remove most of the function-local variables - prefer op-local ones instead

~ft pushed to ~ft/femtolisp git

2 days ago

#femtolisp

builds.sr.ht status

Coverage report

A compact interpreter for a minimal lisp/scheme dialect.

This is a reanimation of https://github.com/lambdaconservatory/femtolisp with bigger plans.

Supported OS: 9front, Unix-like operating systems (OpenBSD, NetBSD, Linux, etc).

Supported CPUs: any decent 32 or 64-bit, little or big endian.

Tested on: 9front/arm64, OpenBSD/386, NetBSD/sparc64, Alpine/amd64, Android/arm64.

Also runs on: MacOS 4.x-9.x, Mac OS X, Haiku, DOS.

Some of the changes from the original include:

  • aggressive clean up, removal, renaming and refactoring
  • seamless bignums
  • [ and ], { and } are synonyms to ( and )
  • definedef, define-macrodefmacro
  • λ as a shorthand for lambda
  • t/T instead of #t/#T and nil instead of #f
  • docstrings - (def (f ...) "Docs here" ...) and (help ...)
  • automatic gensyms for macros (blah#) at read time
  • proper (void) and void?
  • better error reporting - disassembly at the current instruction, location of syntax errors
  • some of the previously available (but not merged) patches from the community and Julia are applied
  • c***r of empty list returns empty list
  • "boot" image is built into the executable
  • vm opcode definitions and tables are generated from a single file
  • fixed bootstrap (makes it work properly when opcodes change)
  • built-in symbols aren't constants and can be redefined

Two ways to learn about more changes:

#Building

#POSIX

meson setup build -Dbuildtype=release
ninja -C build test

#Plan 9

mk all test

#MacOS 4.x-9.x (m68k or PowerPC)

Clone and build Retro68. This fork grabs the necessary patches for more things to work as expected:

git clone https://git.sr.ht/~ft/retro68
mkdir retro68-build
cd retro68-build
../retro68/build-toolchain.bash --ninja
# wait until everything builds, make sure it did not error out

Now build femtolisp:

cd femtolisp
export PATH="$PATH:$(pwd)/../retro68-build/toolchain/bin"
# for PowerPC:
meson setup build . -Dbuildtype=minsize --cross-file cross/powerpc-apple.txt
# for m68k:
meson setup build . -Dbuildtype=minsize --cross-file cross/m68k-apple.txt
ninja -C build

Either build/flisp.dsk or build/flisp.bin is the file to get on your Mac.

NOTE: this isn't a full-fledged port and is going to stay low priority unless somebody wants to spend time polishing it.

#DOS

Build DJGPP cross-compiler, then:

export PATH=$PATH:path-to-djgpp-toolchain/bin
meson setup build . -Dbuildtype=minsize --cross-file cross/djgpp.txt
ninja -C build

Result is build/flisp.exe.

#Characteristics

  • lexical scope, lisp-1
  • unrestricted macros
  • case-sensitive
  • simple compacting copying garbage collector
  • Scheme-style varargs (dotted formal argument lists)
  • "human-readable" bytecode with self-hosted compiler
  • circular structure can be printed and read
  • #. read macro for eval-when-read and readably printing builtins
  • read macros for backquote
  • symbol character-escaping printer
  • exceptions
  • gensyms (can be usefully read back in, too)
  • #| multiline comments |#, #;(block comment..., lots of other lexical syntax
  • generic compare function, cyclic equal
  • cvalues system providing C data types and a C FFI
  • constructor notation for nicely printing arbitrary values