Next: Running Pre-Scheme as Scheme, Previous: Invoking the Pre-Scheme compiler, Up: Pre-Scheme
The ps-compiler/compile-vm.scm,
ps-compiler/compile-gc.scm, and
ps-compiler/compile-vm-no-gc.scm files give examples of running
the Pre-Scheme compiler. They are Scheme48 command programs, to be loaded into the exec
package after
having already loaded the Pre-Scheme compiler. compile-vm.scm &
compile-vm-no-gc.scm generate a new scheme48vm.c in the
scheme/vm/ directory — compile-vm.scm includes the
garbage collector, while compile-vm-no-gc.scm does not
1 —, and compile-gc.scm
generates a new scheme48heap.c, scheme48read-image.c, &
scheme48write-image.c in the scheme/vm/ directory.
Here is a somewhat simpler example. It assumes a pre-built image with the Pre-Scheme compiler loaded is in the ps-compiler.image file in the current directory (see Invoking the Pre-Scheme compiler, where there is a description of how to dump an image with the Pre-Scheme compiler loaded).
% ls hello.scm packages.scm ps-compiler.image % cat hello.scm (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))) % cat packages.scm (define-structure hello (export main) (open prescheme) (files hello)) % scheme48 -i ps-compiler.image heap size 3000000 is too small, using 4770088 Welcome to Scheme 48 1.3 (Pre-Scheme) Copyright (c) 1993-2005 by Richard Kelsey and Jonathan Rees. Please report bugs to scheme-48-bugs@s48.org. Get more information at http://www.s48.org/. Type ,? (comma question-mark) for help. > (prescheme-compiler 'hello '("packages.scm") 'hello-init "hello.c") packages.scm hello.scmChecking types main : ((integer **char) -> integer) In-lining single-use procedures Call Graph: <procedure name> <called non-tail-recursively> <called tail-recursively> main (exported) Merging forms Translating main #{Unspecific} > ,exit % cat hello.c #include <stdio.h> #include "prescheme.h" long main(long, char**); long main(long argc_0X, char **argv_1X) { FILE * out_3X; FILE * out_2X; { if ((1 == argc_0X)) { out_2X = stdout; ps_write_string("Hello, world, ", out_2X); ps_write_string((*(argv_1X + 1)), out_2X); { long ignoreXX; PS_WRITE_CHAR(33, out_2X, ignoreXX) } { long ignoreXX; PS_WRITE_CHAR(10, out_2X, ignoreXX) } return 0;} else { out_3X = stderr; ps_write_string("Usage: ", out_3X); ps_write_string((*(argv_1X + 0)), out_3X); ps_write_string(" <user>", out_3X); { long ignoreXX; PS_WRITE_CHAR(10, out_3X, ignoreXX) } ps_write_string(" Greets the world & <user>.", out_3X); { long ignoreXX; PS_WRITE_CHAR(10, out_3X, ignoreXX) } return -1;}} } %
[1] The actual distribution of Scheme48 separates the garbage collector and the main virtual machine.