more comments in t.scm

This commit is contained in:
dermagen 2024-05-26 19:01:04 -04:00
parent 6631ac582e
commit 715d633ad0
2 changed files with 26 additions and 5 deletions

4
.gitignore vendored
View file

@ -56,3 +56,7 @@ save/
tests/r5rstest.ss tests/r5rstest.ss
tests/r7rstest.ss tests/r7rstest.ss
tmp1
tmp2
tmp3
skint

View file

@ -134,7 +134,6 @@
; <core> -> (set& <id>) ; <core> -> (set& <id>)
; <core> -> (lambda <ids> <core>) where <ids> -> (<id> ...) | (<id> ... . <id>) | <id> ; <core> -> (lambda <ids> <core>) where <ids> -> (<id> ...) | (<id> ... . <id>) | <id>
; <core> -> (lambda* (<arity> <core>) ...) where <arity> -> (<cnt> <rest?>) ; <core> -> (lambda* (<arity> <core>) ...) where <arity> -> (<cnt> <rest?>)
; <core> -> (syntax-lambda (<id> ...) <core>)
; <core> -> (letcc <id> <core>) ; <core> -> (letcc <id> <core>)
; <core> -> (withcc <core> <core>) ; <core> -> (withcc <core> <core>)
; <core> -> (begin <core> ...) ; <core> -> (begin <core> ...)
@ -148,6 +147,16 @@
; <core> -> (define <id> <core>) ; <core> -> (define <id> <core>)
; <core> -> (define-syntax <id> <transformer>) ; <core> -> (define-syntax <id> <transformer>)
; These names are bound to specials never returned by xform:
; (syntax <value>)
; (body <expr or def> ...)
; (syntax-lambda (<id> ...) <expr>)
; (syntax-rules (<id> ...) <rule> ...)
; (syntax-length <form>)
; (syntax-error <msg> <arg> ...)
(define idslist? (define idslist?
(lambda (x) (lambda (x)
(cond [(null? x) #t] (cond [(null? x) #t]
@ -192,10 +201,11 @@
; <denotation> -> <location> ; <denotation> -> <location>
; <location> -> #&<value> ; <location> -> #&<value>
; <value> -> <special> | <core> ; <value> -> <special> | <core>
; <special> -> <builtin> | <transformer> ; <special> -> <builtin> | <integrable> | <transformer>
; <builtin> -> syntax | quote | set! | set& | if | lambda | lambda* | ; <builtin> -> syntax | quote | set! | set& | if | lambda | lambda* |
; letcc | withcc | body | begin | define | define-syntax | ; letcc | withcc | body | begin | define | define-syntax |
; syntax-lambda | syntax-rules | syntax-length | syntax-error ; syntax-lambda | syntax-rules | syntax-length | syntax-error
; <integrable> -> <fixnum serving as index in internal integrables table>
; <transformer> -> <procedure of exp and env returning exp> ; <transformer> -> <procedure of exp and env returning exp>
(define-syntax val-core? pair?) (define-syntax val-core? pair?)
@ -211,6 +221,12 @@
(define (id? x) (or (symbol? x) (procedure? x))) (define (id? x) (or (symbol? x) (procedure? x)))
(define (id->sym id) (if (symbol? id) id (old-sym id))) (define (id->sym id) (if (symbol? id) id (old-sym id)))
; Expand-time environments map identifiers (symbolic or thunked) to denotations, i.e. locations
; containing either a <special> or a <core> value. In normal case, <core> value is (ref <gid>),
; where <gid> is a key in run-time store, aka *globals*. Environments should allocate new locations
; as needed, so every identifier gets mapped to one. Expand-time environments are represented as
; one-argument procedures.
(define (extend-xenv env id bnd) (lambda (i) (if (eq? id i) bnd (env i)))) (define (extend-xenv env id bnd) (lambda (i) (if (eq? id i) bnd (env i))))
(define (add-location key val env) ; adds as-is (define (add-location key val env) ; adds as-is
@ -232,7 +248,7 @@
; xform receives Scheme s-expressions and returns either Core Scheme <core> ; xform receives Scheme s-expressions and returns either Core Scheme <core>
; (always a pair) or special-form, which is either a builtin (a symbol) or ; (always a pair) or special-form, which is either a builtin (a symbol) or
; a transformer (a procedure). Appos? flag is true when the context can ; a transformer (a procedure). Appos? flag is true when the context can
; allow xform to return a transformer; otherwise, only <core> is accepted. ; allow xform to return a special; otherwise, only <core> is returned.
(define (xform appos? sexp env) (define (xform appos? sexp env)
(cond [(id? sexp) (cond [(id? sexp)
@ -468,6 +484,7 @@
(if (and (list2+? tail) (andmap id? (car tail))) (if (and (list2+? tail) (andmap id? (car tail)))
(let ([vars (car tail)] [macenv env] [forms (cdr tail)]) (let ([vars (car tail)] [macenv env] [forms (cdr tail)])
; return a transformer that wraps xformed body in (syntax ...) ; return a transformer that wraps xformed body in (syntax ...)
; to make sure xform treats it as final <core> form and exits the loop
(lambda (use useenv) (lambda (use useenv)
(if (and (list1+? use) (fx=? (length vars) (length (cdr use)))) (if (and (list1+? use) (fx=? (length vars) (length (cdr use))))
(let loop ([vars vars] [exps (cdr use)] [env macenv]) (let loop ([vars vars] [exps (cdr use)] [env macenv])
@ -476,7 +493,7 @@
(loop (cdr vars) (cdr exps) (loop (cdr vars) (cdr exps)
(add-location (car vars) (add-location (car vars)
(xform #t (car exps) useenv) env)))) (xform #t (car exps) useenv) env))))
(x-error "invalif syntax-lambda application" use)))) (x-error "invalid syntax-lambda application" use))))
(x-error "improper syntax-lambda body" (cons 'syntax-lambda tail)))) (x-error "improper syntax-lambda body" (cons 'syntax-lambda tail))))
(define (xform-syntax-rules tail env) (define (xform-syntax-rules tail env)