From acc561366f3fe6ec0377103f52ef0f7e923711c9 Mon Sep 17 00:00:00 2001 From: Rose Hogenson Date: Mon, 1 Aug 2022 19:35:19 -0700 Subject: Modify the project structure. Now the lib directory contains what will eventually end up on the user's /usr/lib/csc. When I write make install, it will copy all of the .csc files from lib into the destination lib directory. This means I can start working on the standard library in lib/scheme. --- lib/csc/ir1.csc | 215 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 215 insertions(+) create mode 100644 lib/csc/ir1.csc (limited to 'lib/csc/ir1.csc') diff --git a/lib/csc/ir1.csc b/lib/csc/ir1.csc new file mode 100644 index 0000000..b91e8ab --- /dev/null +++ b/lib/csc/ir1.csc @@ -0,0 +1,215 @@ +(define-library (csc ir1) + (export + %call + %call-builtin + %constant + %define-syntax + %if + %lambda + %letrec + %lexical-ref + %lexical-set + %library-define + %library-ref + %sequence + call-arguments + call-builtin-arguments + call-builtin-operation + call-builtin? + call-procedure + call? + constant-expression + constant? + define-syntax-name + define-syntax-transformer + define-syntax? + if-alternate + if-consequent + if-test + if? + lambda-arguments + lambda-body + lambda-rest + lambda? + letrec-expression + letrec-gensyms + letrec-in-order? + letrec-names + letrec-values + letrec? + lexical-ref-gensym + lexical-ref-name + lexical-ref? + lexical-set-expression + lexical-set-ref + lexical-set? + library-define-expression + library-define-ref + library-define? + library-ref-library + library-ref-name + library-ref? + make-call + make-call-builtin + make-constant + make-define-syntax + make-if + make-lambda + make-letrec + make-lexical-ref + make-lexical-set + make-library-define + make-library-ref + make-sequence + sequence-head + sequence-tail + sequence?) + (import (scheme base) + (only (csc list) + all) + (only (csc loop) loop return) + (only (csc match) + define-match-record-type)) + (begin + ; This library defines the intermediate representation IR1. An expression + ; in IR1 has one of the following forms (plagiarized from Guile's + ; Tree-IL). + + + ; expression + ; Constant is used to include literal constants in scheme code. + (define-match-record-type + (make-constant expression) + constant? + %constant + (expression constant-expression)) + + + ; name gensym + ; A reference to a lexically-bound variable. The name is the original name + ; of the variable in the source program. gensym is a unique identifier for + ; this variable. + (define-match-record-type + (make-lexical-ref name gensym) + lexical-ref? + %lexical-ref + (name lexical-ref-name) + (gensym lexical-ref-gensym)) + + + ; name + ; A free reference to a variable in a library. If the library is 'main, + ; then it is a top-level global variable. + (define-match-record-type + (make-library-ref name library) + library-ref? + %library-ref + (name library-ref-name) + (library library-ref-library)) + + + ; name gensym expression + ; Sets a lexically-bound variable. + (define-match-record-type + (make-lexical-set ref expression) + lexical-set? + %lexical-set + (ref lexical-set-ref) + (expression lexical-set-expression)) + + + ; name expression + ; Defines a new variable in the current library. + (define-match-record-type + (make-library-define ref expression) + library-define? + %library-define + (ref library-define-ref) + (expression library-define-expression)) + + + ; name transformer + ; Defines a new macro in the current environment. name is the name of the + ; macro. transformer is a macro transformer. + (define-match-record-type + (make-define-syntax name transformer) + define-syntax? + %define-syntax + (name define-syntax-name) + (transformer define-syntax-transformer)) + + + ; test consequent alternate + ; A conditional. + (define-match-record-type + (make-if test consequent alternate) + if? + %if + (test if-test) + (consequent if-consequent) + (alternate if-alternate)) + + + ; procedure arguments + ; A procedure call. The procedure and arguments are evaluated in an + ; unspecified order, and the resulting procedure is passed the + ; resulting arguments. + (define-match-record-type + (make-call procedure arguments) + call? + %call + (procedure call-procedure) + (arguments call-arguments)) + + + ; operation arguments + ; Executes the given builtin operation on the arguments. The known builtin + ; operations are listed below. Each operation can return a value, or not. + ; - alloc: size -> result + ; - peek: pointer * offset -> result + ; - poke: word * pointer * offset -> () + ; - int bool + (define-match-record-type + (make-call-builtin operation arguments) + call-builtin? + %call-builtin + (operation call-builtin-operation) + (arguments call-builtin-arguments)) + + + ; head tail + ; Evaluate head, ignoring any result. Then tail is evaluated. + (define-match-record-type + (make-sequence head tail) + sequence? + %sequence + (head sequence-head) + (tail sequence-tail)) + + + ; body + ; A closure. Arguments is a list of lexical-refs. + ; Rest is a lexical ref or #f if the lambda doesn't take a rest parameter. + (define-match-record-type + (make-lambda arguments rest body) + lambda? + %lambda + (arguments lambda-arguments) + (rest lambda-rest) + (body lambda-body)) + + + ; in-order? names gensyms values expression + ; Lexical binding, like Scheme's letrec, or letrec* if in-order? is true. + ; names are the original binding names, gensyms are gensyms corresponding + ; to the names, and values are IR1 expressions for the values. expression + ; is a single IR1 expression. + (define-match-record-type + (make-letrec in-order? names gensyms values expression) + letrec? + %letrec + (in-order? letrec-in-order?) + (names letrec-names) + (gensyms letrec-gensyms) + (values letrec-values) + (expression letrec-expression)))) -- cgit v1.3.1