Scheme from Scratch - Bootstrap v0.20 - I/O

The last major missing piece of the puzzle for a bootstrap interpreter is the ability to work with files. Scheme has several input and output primitive procedures and I’m implementing the ones I think will be useful. It is a slightly larger amount to implement than some days have been but hopefully quite straightforward for anyone who has come this far.


  • load
  • read
  • read-char
  • peek-char
  • input-port?
  • open-input-file
  • close-input-file
  • eof-object?


  • write
  • write-char
  • output-port?
  • open-output-file
  • close-output-file
  • error

A sample REPL session:

$ ./scheme
Welcome to Bootstrap Scheme. Use ctrl-c to exit.
> (define out (open-output-port "asdf.txt"))
> (write-char #\c out)
> (close-output-port out)
> (load "program.scm")
> (error "bad move")
"bad move"

Some of these functions required refactoring in other areas of the interpreter. I refactored the C read function to handle the end of a source file properly. I refactored the C write function to take a stream parameter so that the Scheme write could write to any port. I’ll backport these changes to previous versions eventually.

I’m not doing any of the the current-input-port, call-with-input-port, and with-input-from-file business. If a port is not specified as an optional parameter to read, write-char, etc then C’s stdin and stdout are used.

I added the error output form which writes all of its arguments and then exits. This form is not required by R5RS, for example, but is useful.

There is still a little bit to do but we are oh so close.

There is a v0.20 branch on github for this version.

Previous article: Eval
Next article: Standard Library


Have something to write? Comment on this article.

kbob January 25, 2010

Mine is on github now. It reuses a lot of code from my old scheme interpreter, so there’s some unused code lying around.


Still no eval. The heap is kind of interesting, though. See comments here.

Have something to write? Comment on this article.