aboutsummaryrefslogtreecommitdiffstats
path: root/csc/ir1.csc
diff options
context:
space:
mode:
authorRose Hogenson <rhogenson@posteo.net>2022-04-07 19:32:07 -0700
committerRose Hogenson <rhogenson@posteo.net>2022-04-07 19:32:07 -0700
commitb94b0450645a3739c26e5bc99bfeba3304eb95c4 (patch)
treece98014fa57f62cf769f26577408307b1aedd008 /csc/ir1.csc
parentWrite a test for case-lambda. (diff)
downloadchromatopelma-b94b0450645a3739c26e5bc99bfeba3304eb95c4.tar.zst
Add libraries.
Gone is toplevel. Now everyone lives in a library.
Diffstat (limited to 'csc/ir1.csc')
-rw-r--r--csc/ir1.csc69
1 files changed, 45 insertions, 24 deletions
diff --git a/csc/ir1.csc b/csc/ir1.csc
index 59911ab..e5fc2dd 100644
--- a/csc/ir1.csc
+++ b/csc/ir1.csc
@@ -5,6 +5,9 @@
call?
constant-expression
constant?
+ define-syntax-name
+ define-syntax-transformer
+ define-syntax?
if-alternate
if-consequent
if-test
@@ -32,26 +35,29 @@
lexical-set-gensym
lexical-set-name
lexical-set?
+ library-define-expression
+ library-define-library
+ library-define-name
+ library-define?
+ library-ref-library
+ library-ref-name
+ library-ref?
make-call
make-constant
+ make-define-syntax
make-if
make-lambda
make-lambda-case
make-letrec
make-lexical-ref
make-lexical-set
+ make-library-define
+ make-library-ref
make-sequence
- make-toplevel-define
- make-toplevel-ref
make-void
sequence-head
sequence-tail
sequence?
- toplevel-define-expression
- toplevel-define-name
- toplevel-define?
- toplevel-ref-name
- toplevel-ref?
void?)
(import (scheme base)
(only (csc loop) loop return))
@@ -87,12 +93,14 @@
(gensym lexical-ref-gensym))
- ; <toplevel-ref> name
- ; A free reference to a top level variable.
- (define-record-type <toplevel-ref>
- (make-toplevel-ref name)
- toplevel-ref?
- (name toplevel-ref-name))
+ ; <library-ref> name
+ ; A free reference to a variable in a library. If the library is 'main,
+ ; then it is a top-level global variable.
+ (define-record-type <library-ref>
+ (make-library-ref name library)
+ library-ref?
+ (name library-ref-name)
+ (library library-ref-library))
; <lexical-set> name gensym expression
@@ -105,13 +113,24 @@
(expression lexical-set-expression))
- ; <toplevel-define> name expression
+ ; <library-define> name expression
; Defines a new variable in the current library.
- (define-record-type <toplevel-define>
- (make-toplevel-define name expression)
- toplevel-define?
- (name toplevel-define-name)
- (expression toplevel-define-expression))
+ (define-record-type <library-define>
+ (make-library-define name expression library)
+ library-define?
+ (name library-define-name)
+ (expression library-define-expression)
+ (library library-define-library))
+
+
+ ; <define-syntax> name transformer
+ ; Defines a new macro in the current environment. name is the name of the
+ ; macro. transformer is a macro transformer.
+ (define-record-type <define-syntax>
+ (make-define-syntax name transformer)
+ define-syntax?
+ (name define-syntax-name)
+ (transformer define-syntax-transformer))
; <if> test consequent alternate
@@ -198,16 +217,18 @@
(equal? (constant-expression x) (constant-expression y)))
((and (lexical-ref? x) (lexical-ref? y))
(symbol=? (lexical-ref-name x) (lexical-ref-name y)))
- ((and (toplevel-ref? x) (toplevel-ref? y))
- (symbol=? (toplevel-ref-name x) (toplevel-ref-name y)))
+ ((and (library-ref? x) (library-ref? y))
+ (symbol=? (library-ref-name x) (library-ref-name y))
+ (equal? (library-ref-library x) (library-ref-library y)))
((and (lexical-set? x) (lexical-set? y))
(and
(symbol=? (lexical-set-name x) (lexical-set-name y))
(ir1=? (lexical-set-expression x) (lexical-set-expression y))))
- ((and (toplevel-define? x) (toplevel-define? y))
+ ((and (library-define? x) (library-define? y))
(and
- (symbol=? (toplevel-define-name x) (toplevel-define-name y))
- (ir1=? (toplevel-define-expression x) (toplevel-define-expression y))))
+ (symbol=? (library-define-name x) (library-define-name y))
+ (ir1=? (library-define-expression x) (library-define-expression y))
+ (equal? (library-define-library x) (library-define-library y))))
((and (if? x) (if? y))
(and
(ir1=? (if-test x) (if-test y))