A port of Pre-Scheme from Scheme 48 to Guile
|Andrew Whatson 382789414d Update homepage to notabug.org||2 months ago|
|doc||10 months ago|
|language||10 months ago|
|prescheme||8 months ago|
|ps-compiler||8 months ago|
|.dir-locals.el||10 months ago|
|.envrc||10 months ago|
|.gitignore||10 months ago|
|AUTHORS||10 months ago|
|COPYING||10 months ago|
|HACKING||10 months ago|
|NEWS||10 months ago|
|README.org||2 months ago|
|TODO.org||9 months ago|
|guix.scm||2 months ago|
|hall.scm||2 months ago|
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.
An initial Pre-Scheme "emulation layer" has been implemented, which supports
running Pre-Scheme code in a Guile Scheme interpreter. This includes features
define-external-enumeration macros and a
fake memory driver which supports
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.
To play with the Pre-Scheme interpreter, you will need
the repo and start a Guile REPL with
guile-prescheme added to your load-path:
guix shell git guile git clone https://notabug.org/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!
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)))
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
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.