This repo is a fork of https://notabug.org/flatwhatson/guile-prescheme It converts the upstream project into a guix channel.
This repository has been archived on 2024-10-22. You can view files and clone it, but cannot push or open issues or pull requests.
Find a file
2022-08-12 01:28:53 +10:00
doc Rest of files we want to customize generated by Hall, gitignore the rest 2022-08-04 13:53:39 -04:00
language/prescheme Add define-record-type emulation 2022-07-21 16:01:58 +10:00
prescheme Stub prescheme expand package 2022-08-11 20:16:03 +10:00
ps-compiler Stub prescheme eval-node package 2022-08-12 01:28:53 +10:00
.dir-locals.el Initial work on guile-prescheme port 2022-07-16 07:36:02 +10:00
.envrc Updates to hall configuration 2022-08-07 15:03:30 +10:00
.gitignore Rest of files we want to customize generated by Hall, gitignore the rest 2022-08-04 13:53:39 -04:00
AUTHORS Rest of files we want to customize generated by Hall, gitignore the rest 2022-08-04 13:53:39 -04:00
COPYING Stub README and COPYING 2022-07-16 21:17:06 +10:00
guix.scm Updates to hall configuration 2022-08-07 15:03:30 +10:00
HACKING Initial version of hall.scm and the things it pulls in 2022-08-04 13:48:19 -04:00
hall.scm Stub prescheme eval-node package 2022-08-12 01:28:53 +10:00
NEWS Inserted email there 2022-08-05 11:33:54 +10:00
README Stub README and COPYING 2022-07-16 21:17:06 +10:00
README.org Add some stuff to the README 2022-07-19 21:58:44 +10:00
TODO.org Stub prescheme eval-node package 2022-08-12 01:28:53 +10:00

Pre-Scheme for Guile

This project is a work-in-progress port of the Pre-Scheme compiler from Scheme 48 to Guile. Pre-Scheme is a statically typed dialect of Scheme which offers the efficiency and low-level machine access of C while retaining many of the desirable features of Scheme.

Read the Pre-Scheme manual here.

Read the Pre-Scheme paper here.

Where is it up to?

An initial Pre-Scheme "emulation layer" has been implemented, which supports running Pre-Scheme code in a Guile Scheme interpreter. This includes features like the define-enumeration and define-external-enumeration macros and a fake memory driver which supports allocate-memory, deallocate-memory.

This is a very fresh port which still requires a good deal of testing and probably a few rounds of fixes before being considered "complete".

Work continues on porting the Pre-Scheme to C compiler.

How can I play with it?

Running the Pre-Scheme emulator

To play with the Pre-Scheme interpreter, you will need git and guile. Clone the repo and start a Guile REPL with guile-prescheme added to your load-path:

guix shell git guile
git clone https://gitlab.com/flatwhatson/guile-prescheme.git
cd guile-prescheme
guile -L .

In the Guile REPL, load the Pre-Scheme environment and switch to the Pre-Scheme language:

(use-modules (system base language))
(set-current-module (default-environment 'prescheme))
,language prescheme

Your REPL is now emulating Pre-Scheme!

Hello, world, Pre-Scheme!

Load up a Pre-Scheme REPL as above, then paste in the following program:

(define (main argc argv)
  (if (= argc 2)
      (let ((out (current-output-port)))
        (write-string "Hello, world, " out)
        (write-string (vector-ref argv 1) out)
        (write-char #\! out)
        (newline out)
        0)
      (let ((out (current-error-port)))
        (write-string "Usage: " out)
        (write-string (vector-ref argv 0) out)
        (write-string " <user>" out)
        (newline out)
        (write-string "  Greets the world & <user>." out)
        (newline out)
        -1)))

A Pre-Scheme main takes ARGC as an int and ARGV as a vector of strings. As with a C program, the first argument is the name of the program which was run.

To get the help output:

> (main 1 #("./hello"))
Usage: ./hello <user>
  Greets the world & <user>.
-1

To get the greeting:

> (main 2 #("./hello" "Pre-Scheme"))
Hello, world, Pre-Scheme!
0

How can I contribute?

If you would like to learn more, co-ordinate with the developers, or simply hang out with like-minded Scheme folks, come and join the party in the #guile-steel channel on the LiberaChat IRC network.