|
|
|
@ -2,169 +2,310 @@
|
|
|
|
|
#include "picrin/extra.h"
|
|
|
|
|
|
|
|
|
|
static const char boot_rom[][80] = {
|
|
|
|
|
"(core#define-macro call-with-current-environment (core#lambda (form env) (list (",
|
|
|
|
|
"cadr form) env))) (core#define here (call-with-current-environment (core#lambda ",
|
|
|
|
|
"(env) env))) (core#define the (core#lambda (var) (make-identifier var here))) (c",
|
|
|
|
|
"ore#define the-builtin-define (the (core#quote core#define))) (core#define the-b",
|
|
|
|
|
"uiltin-lambda (the (core#quote core#lambda))) (core#define the-builtin-begin (th",
|
|
|
|
|
"e (core#quote core#begin))) (core#define the-builtin-quote (the (core#quote core",
|
|
|
|
|
"#quote))) (core#define the-builtin-set! (the (core#quote core#set!))) (core#defi",
|
|
|
|
|
"ne the-builtin-if (the (core#quote core#if))) (core#define the-builtin-define-ma",
|
|
|
|
|
"cro (the (core#quote core#define-macro))) (core#define the-define (the (core#quo",
|
|
|
|
|
"te define))) (core#define the-lambda (the (core#quote lambda))) (core#define the",
|
|
|
|
|
"-begin (the (core#quote begin))) (core#define the-quote (the (core#quote quote))",
|
|
|
|
|
") (core#define the-set! (the (core#quote set!))) (core#define the-if (the (core#",
|
|
|
|
|
"quote if))) (core#define the-define-macro (the (core#quote define-macro))) (core",
|
|
|
|
|
"#define-macro quote (core#lambda (form env) (core#if (= (length form) 2) (list t",
|
|
|
|
|
"he-builtin-quote (cadr form)) (error \"illegal quote form\" form)))) (core#define-",
|
|
|
|
|
"macro if (core#lambda (form env) ((core#lambda (len) (core#if (= len 4) (cons th",
|
|
|
|
|
"e-builtin-if (cdr form)) (core#if (= len 3) (list the-builtin-if (list-ref form ",
|
|
|
|
|
"1) (list-ref form 2) #undefined) (error \"illegal if form\" form)))) (length form)",
|
|
|
|
|
"))) (core#define-macro begin (core#lambda (form env) ((core#lambda (len) (if (= ",
|
|
|
|
|
"len 1) #undefined (if (= len 2) (cadr form) (if (= len 3) (cons the-builtin-begi",
|
|
|
|
|
"n (cdr form)) (list the-builtin-begin (cadr form) (cons the-begin (cddr form))))",
|
|
|
|
|
"))) (length form)))) (core#define-macro set! (core#lambda (form env) (if (= (len",
|
|
|
|
|
"gth form) 3) (if (identifier? (cadr form)) (cons the-builtin-set! (cdr form)) (e",
|
|
|
|
|
"rror \"illegal set! form\" form)) (error \"illegal set! form\" form)))) (core#define",
|
|
|
|
|
" check-formal (core#lambda (formal) (if (null? formal) #t (if (identifier? forma",
|
|
|
|
|
"l) #t (if (pair? formal) (if (identifier? (car formal)) (check-formal (cdr forma",
|
|
|
|
|
"l)) #f) #f))))) (core#define-macro lambda (core#lambda (form env) (if (= (length",
|
|
|
|
|
" form) 1) (error \"illegal lambda form\" form) (if (check-formal (cadr form)) (lis",
|
|
|
|
|
"t the-builtin-lambda (cadr form) (cons the-begin (cddr form))) (error \"illegal l",
|
|
|
|
|
"ambda form\" form))))) (core#define-macro define (lambda (form env) ((lambda (len",
|
|
|
|
|
") (if (= len 1) (error \"illegal define form\" form) (if (identifier? (cadr form))",
|
|
|
|
|
" (if (= len 3) (cons the-builtin-define (cdr form)) (error \"illegal define form\"",
|
|
|
|
|
" form)) (if (pair? (cadr form)) (list the-define (car (cadr form)) (cons the-lam",
|
|
|
|
|
"bda (cons (cdr (cadr form)) (cddr form)))) (error \"define: binding to non-varaib",
|
|
|
|
|
"le object\" form))))) (length form)))) (core#define-macro define-macro (lambda (f",
|
|
|
|
|
"orm env) (if (= (length form) 3) (if (identifier? (cadr form)) (cons the-builtin",
|
|
|
|
|
"-define-macro (cdr form)) (error \"define-macro: binding to non-variable object\" ",
|
|
|
|
|
"form)) (error \"illegal define-macro form\" form)))) (define-macro syntax-error (l",
|
|
|
|
|
"ambda (form _) (apply error (cdr form)))) (define-macro define-auxiliary-syntax ",
|
|
|
|
|
"(lambda (form _) (define message (string-append \"invalid use of auxiliary syntax",
|
|
|
|
|
": '\" (symbol->string (cadr form)) \"'\")) (list the-define-macro (cadr form) (list",
|
|
|
|
|
" the-lambda '_ (list (the 'error) message))))) (define-auxiliary-syntax else) (d",
|
|
|
|
|
"efine-auxiliary-syntax =>) (define-auxiliary-syntax unquote) (define-auxiliary-s",
|
|
|
|
|
"yntax unquote-splicing) (define-auxiliary-syntax syntax-unquote) (define-auxilia",
|
|
|
|
|
"ry-syntax syntax-unquote-splicing) (define-macro let (lambda (form env) (if (ide",
|
|
|
|
|
"ntifier? (cadr form)) (list (list the-lambda '() (list the-define (cadr form) (c",
|
|
|
|
|
"ons the-lambda (cons (map car (car (cddr form))) (cdr (cddr form))))) (cons (cad",
|
|
|
|
|
"r form) (map cadr (car (cddr form)))))) (cons (cons the-lambda (cons (map car (c",
|
|
|
|
|
"adr form)) (cddr form))) (map cadr (cadr form)))))) (define-macro and (lambda (f",
|
|
|
|
|
"orm env) (if (null? (cdr form)) #t (if (null? (cddr form)) (cadr form) (list the",
|
|
|
|
|
"-if (cadr form) (cons (the 'and) (cddr form)) #f))))) (define-macro or (lambda (",
|
|
|
|
|
"form env) (if (null? (cdr form)) #f (let ((tmp (make-identifier 'it env))) (list",
|
|
|
|
|
" (the 'let) (list (list tmp (cadr form))) (list the-if tmp tmp (cons (the 'or) (",
|
|
|
|
|
"cddr form)))))))) (define-macro cond (lambda (form env) (let ((clauses (cdr form",
|
|
|
|
|
"))) (if (null? clauses) #undefined (let ((clause (car clauses))) (if (and (ident",
|
|
|
|
|
"ifier? (car clause)) (identifier=? (the 'else) (make-identifier (car clause) env",
|
|
|
|
|
"))) (cons the-begin (cdr clause)) (if (null? (cdr clause)) (let ((tmp (make-iden",
|
|
|
|
|
"tifier 'tmp here))) (list (the 'let) (list (list tmp (car clause))) (list the-if",
|
|
|
|
|
" tmp tmp (cons (the 'cond) (cdr clauses))))) (if (and (identifier? (cadr clause)",
|
|
|
|
|
") (identifier=? (the '=>) (make-identifier (cadr clause) env))) (let ((tmp (make",
|
|
|
|
|
"-identifier 'tmp here))) (list (the 'let) (list (list tmp (car clause))) (list t",
|
|
|
|
|
"he-if tmp (list (car (cddr clause)) tmp) (cons (the 'cond) (cdr clauses))))) (li",
|
|
|
|
|
"st the-if (car clause) (cons the-begin (cdr clause)) (cons (the 'cond) (cdr clau",
|
|
|
|
|
"ses))))))))))) (define-macro quasiquote (lambda (form env) (define (quasiquote? ",
|
|
|
|
|
"form) (and (pair? form) (identifier? (car form)) (identifier=? (the 'quasiquote)",
|
|
|
|
|
" (make-identifier (car form) env)))) (define (unquote? form) (and (pair? form) (",
|
|
|
|
|
"identifier? (car form)) (identifier=? (the 'unquote) (make-identifier (car form)",
|
|
|
|
|
" env)))) (define (unquote-splicing? form) (and (pair? form) (pair? (car form)) (",
|
|
|
|
|
"identifier? (caar form)) (identifier=? (the 'unquote-splicing) (make-identifier ",
|
|
|
|
|
"(caar form) env)))) (define (qq depth expr) (cond ((unquote? expr) (if (= depth ",
|
|
|
|
|
"1) (car (cdr expr)) (list (the 'list) (list (the 'quote) (the 'unquote)) (qq (- ",
|
|
|
|
|
"depth 1) (car (cdr expr)))))) ((unquote-splicing? expr) (if (= depth 1) (list (t",
|
|
|
|
|
"he 'append) (car (cdr (car expr))) (qq depth (cdr expr))) (list (the 'cons) (lis",
|
|
|
|
|
"t (the 'list) (list (the 'quote) (the 'unquote-splicing)) (qq (- depth 1) (car (",
|
|
|
|
|
"cdr (car expr))))) (qq depth (cdr expr))))) ((quasiquote? expr) (list (the 'list",
|
|
|
|
|
") (list (the 'quote) (the 'quasiquote)) (qq (+ depth 1) (car (cdr expr))))) ((pa",
|
|
|
|
|
"ir? expr) (list (the 'cons) (qq depth (car expr)) (qq depth (cdr expr)))) ((vect",
|
|
|
|
|
"or? expr) (list (the 'list->vector) (qq depth (vector->list expr)))) (else (list",
|
|
|
|
|
" (the 'quote) expr)))) (let ((x (cadr form))) (qq 1 x)))) (define-macro let* (la",
|
|
|
|
|
"mbda (form env) (let ((bindings (car (cdr form))) (body (cdr (cdr form)))) (if (",
|
|
|
|
|
"null? bindings) `(,(the 'let) () ,@body) `(,(the 'let) ((,(car (car bindings)) ,",
|
|
|
|
|
"@(cdr (car bindings)))) (,(the 'let*) (,@(cdr bindings)) ,@body)))))) (define-ma",
|
|
|
|
|
"cro letrec (lambda (form env) `(,(the 'letrec*) ,@(cdr form)))) (define-macro le",
|
|
|
|
|
"trec* (lambda (form env) (let ((bindings (car (cdr form))) (body (cdr (cdr form)",
|
|
|
|
|
"))) (let ((variables (map (lambda (v) `(,v #f)) (map car bindings))) (initials (",
|
|
|
|
|
"map (lambda (v) `(,(the 'set!) ,@v)) bindings))) `(,(the 'let) (,@variables) ,@i",
|
|
|
|
|
"nitials ,@body))))) (define-macro let-values (lambda (form env) `(,(the 'let*-va",
|
|
|
|
|
"lues) ,@(cdr form)))) (define-macro let*-values (lambda (form env) (let ((formal",
|
|
|
|
|
" (car (cdr form))) (body (cdr (cdr form)))) (if (null? formal) `(,(the 'let) () ",
|
|
|
|
|
",@body) `(,(the 'call-with-values) (,the-lambda () ,@(cdr (car formal))) (,(the ",
|
|
|
|
|
"'lambda) (,@(car (car formal))) (,(the 'let*-values) (,@(cdr formal)) ,@body))))",
|
|
|
|
|
"))) (define-macro define-values (lambda (form env) (let ((formal (car (cdr form)",
|
|
|
|
|
")) (body (cdr (cdr form)))) (let ((arguments (make-identifier 'arguments here)))",
|
|
|
|
|
" `(,the-begin ,@(let loop ((formal formal)) (if (pair? formal) `((,the-define ,(",
|
|
|
|
|
"car formal) #undefined) ,@(loop (cdr formal))) (if (identifier? formal) `((,the-",
|
|
|
|
|
"define ,formal #undefined)) '()))) (,(the 'call-with-values) (,the-lambda () ,@b",
|
|
|
|
|
"ody) (,the-lambda ,arguments ,@(let loop ((formal formal) (args arguments)) (if ",
|
|
|
|
|
"(pair? formal) `((,the-set! ,(car formal) (,(the 'car) ,args)) ,@(loop (cdr form",
|
|
|
|
|
"al) `(,(the 'cdr) ,args))) (if (identifier? formal) `((,the-set! ,formal ,args))",
|
|
|
|
|
" '())))))))))) (define-macro do (lambda (form env) (let ((bindings (car (cdr for",
|
|
|
|
|
"m))) (test (car (car (cdr (cdr form))))) (cleanup (cdr (car (cdr (cdr form))))) ",
|
|
|
|
|
"(body (cdr (cdr (cdr form))))) (let ((loop (make-identifier 'loop here))) `(,(th",
|
|
|
|
|
"e 'let) ,loop ,(map (lambda (x) `(,(car x) ,(cadr x))) bindings) (,the-if ,test ",
|
|
|
|
|
"(,the-begin ,@cleanup) (,the-begin ,@body (,loop ,@(map (lambda (x) (if (null? (",
|
|
|
|
|
"cdr (cdr x))) (car x) (car (cdr (cdr x))))) bindings))))))))) (define-macro when",
|
|
|
|
|
" (lambda (form env) (let ((test (car (cdr form))) (body (cdr (cdr form)))) `(,th",
|
|
|
|
|
"e-if ,test (,the-begin ,@body) #undefined)))) (define-macro unless (lambda (form",
|
|
|
|
|
" env) (let ((test (car (cdr form))) (body (cdr (cdr form)))) `(,the-if ,test #un",
|
|
|
|
|
"defined (,the-begin ,@body))))) (define-macro case (lambda (form env) (let ((key",
|
|
|
|
|
" (car (cdr form))) (clauses (cdr (cdr form)))) (let ((the-key (make-identifier '",
|
|
|
|
|
"key here))) `(,(the 'let) ((,the-key ,key)) ,(let loop ((clauses clauses)) (if (",
|
|
|
|
|
"null? clauses) #undefined (let ((clause (car clauses))) `(,the-if ,(if (and (ide",
|
|
|
|
|
"ntifier? (car clause)) (identifier=? (the 'else) (make-identifier (car clause) e",
|
|
|
|
|
"nv))) #t `(,(the 'or) ,@(map (lambda (x) `(,(the 'eqv?) ,the-key (,the-quote ,x)",
|
|
|
|
|
")) (car clause)))) ,(if (and (identifier? (cadr clause)) (identifier=? (the '=>)",
|
|
|
|
|
" (make-identifier (cadr clause) env))) `(,(car (cdr (cdr clause))) ,the-key) `(,",
|
|
|
|
|
"the-begin ,@(cdr clause))) ,(loop (cdr clauses))))))))))) (define-macro paramete",
|
|
|
|
|
"rize (lambda (form env) (let ((formal (car (cdr form))) (body (cdr (cdr form))))",
|
|
|
|
|
" `(,(the 'with-dynamic-environment) (,(the 'list) ,@(map (lambda (x) `(,(the 'co",
|
|
|
|
|
"ns) ,(car x) ,(cadr x))) formal)) (,the-lambda () ,@body))))) (define-macro synt",
|
|
|
|
|
"ax-quote (lambda (form env) (let ((renames '())) (letrec ((rename (lambda (var) ",
|
|
|
|
|
"(let ((x (assq var renames))) (if x (cadr x) (begin (set! renames `((,var ,(make",
|
|
|
|
|
"-identifier var env) (,(the 'make-identifier) ',var ',env)) unquote renames)) (r",
|
|
|
|
|
"ename var)))))) (walk (lambda (f form) (cond ((identifier? form) (f form)) ((pai",
|
|
|
|
|
"r? form) `(,(the 'cons) (walk f (car form)) (walk f (cdr form)))) ((vector? form",
|
|
|
|
|
") `(,(the 'list->vector) (walk f (vector->list form)))) (else `(,(the 'quote) ,f",
|
|
|
|
|
"orm)))))) (let ((form (walk rename (cadr form)))) `(,(the 'let) ,(map cdr rename",
|
|
|
|
|
"s) ,form)))))) (define-macro syntax-quasiquote (lambda (form env) (let ((renames",
|
|
|
|
|
" '())) (letrec ((rename (lambda (var) (let ((x (assq var renames))) (if x (cadr ",
|
|
|
|
|
"x) (begin (set! renames `((,var ,(make-identifier var env) (,(the 'make-identifi",
|
|
|
|
|
"er) ',var ',env)) unquote renames)) (rename var))))))) (define (syntax-quasiquot",
|
|
|
|
|
"e? form) (and (pair? form) (identifier? (car form)) (identifier=? (the 'syntax-q",
|
|
|
|
|
"uasiquote) (make-identifier (car form) env)))) (define (syntax-unquote? form) (a",
|
|
|
|
|
"nd (pair? form) (identifier? (car form)) (identifier=? (the 'syntax-unquote) (ma",
|
|
|
|
|
"ke-identifier (car form) env)))) (define (syntax-unquote-splicing? form) (and (p",
|
|
|
|
|
"air? form) (pair? (car form)) (identifier? (caar form)) (identifier=? (the 'synt",
|
|
|
|
|
"ax-unquote-splicing) (make-identifier (caar form) env)))) (define (qq depth expr",
|
|
|
|
|
") (cond ((syntax-unquote? expr) (if (= depth 1) (car (cdr expr)) (list (the 'lis",
|
|
|
|
|
"t) (list (the 'quote) (the 'syntax-unquote)) (qq (- depth 1) (car (cdr expr)))))",
|
|
|
|
|
") ((syntax-unquote-splicing? expr) (if (= depth 1) (list (the 'append) (car (cdr",
|
|
|
|
|
" (car expr))) (qq depth (cdr expr))) (list (the 'cons) (list (the 'list) (list (",
|
|
|
|
|
"the 'quote) (the 'syntax-unquote-splicing)) (qq (- depth 1) (car (cdr (car expr)",
|
|
|
|
|
")))) (qq depth (cdr expr))))) ((syntax-quasiquote? expr) (list (the 'list) (list",
|
|
|
|
|
" (the 'quote) (the 'quasiquote)) (qq (+ depth 1) (car (cdr expr))))) ((pair? exp",
|
|
|
|
|
"r) (list (the 'cons) (qq depth (car expr)) (qq depth (cdr expr)))) ((vector? exp",
|
|
|
|
|
"r) (list (the 'list->vector) (qq depth (vector->list expr)))) ((identifier? expr",
|
|
|
|
|
") (rename expr)) (else (list (the 'quote) expr)))) (let ((body (qq 1 (cadr form)",
|
|
|
|
|
"))) `(,(the 'let) ,(map cdr renames) ,body)))))) (define (transformer f) (lambda",
|
|
|
|
|
" (form env) (let ((ephemeron1 (make-ephemeron-table)) (ephemeron2 (make-ephemero",
|
|
|
|
|
"n-table))) (letrec ((wrap (lambda (var1) (let ((var2 (ephemeron1 var1))) (if var",
|
|
|
|
|
"2 (cdr var2) (let ((var2 (make-identifier var1 env))) (ephemeron1 var1 var2) (ep",
|
|
|
|
|
"hemeron2 var2 var1) var2))))) (unwrap (lambda (var2) (let ((var1 (ephemeron2 var",
|
|
|
|
|
"2))) (if var1 (cdr var1) var2)))) (walk (lambda (f form) (cond ((identifier? for",
|
|
|
|
|
"m) (f form)) ((pair? form) (cons (walk f (car form)) (walk f (cdr form)))) ((vec",
|
|
|
|
|
"tor? form) (list->vector (walk f (vector->list form)))) (else form))))) (let ((f",
|
|
|
|
|
"orm (cdr form))) (walk unwrap (apply f (walk wrap form)))))))) (define-macro def",
|
|
|
|
|
"ine-syntax (lambda (form env) (let ((formal (car (cdr form))) (body (cdr (cdr fo",
|
|
|
|
|
"rm)))) (if (pair? formal) `(,(the 'define-syntax) ,(car formal) (,the-lambda ,(c",
|
|
|
|
|
"dr formal) ,@body)) `(,the-define-macro ,formal (,(the 'transformer) (,the-begin",
|
|
|
|
|
" ,@body))))))) (define-macro letrec-syntax (lambda (form env) (let ((formal (car",
|
|
|
|
|
" (cdr form))) (body (cdr (cdr form)))) `(let () ,@(map (lambda (x) `(,(the 'defi",
|
|
|
|
|
"ne-syntax) ,(car x) ,(cadr x))) formal) ,@body)))) (define-macro let-syntax (lam",
|
|
|
|
|
"bda (form env) `(,(the 'letrec-syntax) ,@(cdr form)))) ",
|
|
|
|
|
"(core#begin (core#define transformer (core#lambda (.f.172) (core#lambda (.form.1",
|
|
|
|
|
"73 .env.174) ((core#lambda (.ephemeron1.175 .ephemeron2.176) ((core#lambda (.wra",
|
|
|
|
|
"p.177 .unwrap.178 .walk.179) (core#begin (core#set! .wrap.177 (core#lambda (.var",
|
|
|
|
|
"1.180) ((core#lambda (.var2.181) (core#if .var2.181 (cdr .var2.181) ((core#lambd",
|
|
|
|
|
"a (.var2.182) (core#begin (.ephemeron1.175 .var1.180 .var2.182) (core#begin (.ep",
|
|
|
|
|
"hemeron2.176 .var2.182 .var1.180) .var2.182))) (make-identifier .var1.180 .env.1",
|
|
|
|
|
"74)))) (.ephemeron1.175 .var1.180)))) (core#begin (core#set! .unwrap.178 (core#l",
|
|
|
|
|
"ambda (.var2.183) ((core#lambda (.var1.184) (core#if .var1.184 (cdr .var1.184) .",
|
|
|
|
|
"var2.183)) (.ephemeron2.176 .var2.183)))) (core#begin (core#set! .walk.179 (core",
|
|
|
|
|
"#lambda (.f.185 .form.186) (core#if (identifier? .form.186) (.f.185 .form.186) (",
|
|
|
|
|
"core#if (pair? .form.186) (cons (.walk.179 .f.185 (car .form.186)) (.walk.179 .f",
|
|
|
|
|
".185 (cdr .form.186))) (core#if (vector? .form.186) (list->vector (.walk.179 .f.",
|
|
|
|
|
"185 (vector->list .form.186))) .form.186))))) ((core#lambda (.form.187) (.walk.1",
|
|
|
|
|
"79 .unwrap.178 (apply .f.172 (.walk.179 .wrap.177 .form.187)))) (cdr .form.173))",
|
|
|
|
|
")))) #f #f #f)) (make-ephemeron-table) (make-ephemeron-table))))) ((core#lambda ",
|
|
|
|
|
"() (core#begin (core#define .define-transformer.188 (core#lambda (.name.208 .tra",
|
|
|
|
|
"nsformer.209) (add-macro! .name.208 .transformer.209))) (core#begin (core#define",
|
|
|
|
|
" .the.189 (core#lambda (.var.210) (make-identifier .var.210 default-environment)",
|
|
|
|
|
")) (core#begin (core#define .the-core-define.190 (.the.189 (core#quote core#defi",
|
|
|
|
|
"ne))) (core#begin (core#define .the-core-lambda.191 (.the.189 (core#quote core#l",
|
|
|
|
|
"ambda))) (core#begin (core#define .the-core-begin.192 (.the.189 (core#quote core",
|
|
|
|
|
"#begin))) (core#begin (core#define .the-core-quote.193 (.the.189 (core#quote cor",
|
|
|
|
|
"e#quote))) (core#begin (core#define .the-core-set!.194 (.the.189 (core#quote cor",
|
|
|
|
|
"e#set!))) (core#begin (core#define .the-core-if.195 (.the.189 (core#quote core#i",
|
|
|
|
|
"f))) (core#begin (core#define .the-core-define-macro.196 (.the.189 (core#quote c",
|
|
|
|
|
"ore#define-macro))) (core#begin (core#define .the-define.197 (.the.189 (core#quo",
|
|
|
|
|
"te define))) (core#begin (core#define .the-lambda.198 (.the.189 (core#quote lamb",
|
|
|
|
|
"da))) (core#begin (core#define .the-begin.199 (.the.189 (core#quote begin))) (co",
|
|
|
|
|
"re#begin (core#define .the-quote.200 (.the.189 (core#quote quote))) (core#begin ",
|
|
|
|
|
"(core#define .the-set!.201 (.the.189 (core#quote set!))) (core#begin (core#defin",
|
|
|
|
|
"e .the-if.202 (.the.189 (core#quote if))) (core#begin (core#define .the-define-m",
|
|
|
|
|
"acro.203 (.the.189 (core#quote define-macro))) (core#begin (.define-transformer.",
|
|
|
|
|
"188 (core#quote quote) (core#lambda (.form.211 .env.212) (core#if (= (length .fo",
|
|
|
|
|
"rm.211) 2) (cons .the-core-quote.193 (cons (cadr .form.211) (core#quote ()))) (e",
|
|
|
|
|
"rror \"malformed quote\" .form.211)))) (core#begin (.define-transformer.188 (core#",
|
|
|
|
|
"quote if) (core#lambda (.form.213 .env.214) ((core#lambda (.len.215) (core#if (=",
|
|
|
|
|
" .len.215 3) (append .form.213 (cons (core#quote #undefined) (core#quote ()))) (",
|
|
|
|
|
"core#if (= .len.215 4) (cons .the-core-if.195 (cdr .form.213)) (error \"malformed",
|
|
|
|
|
" if\" .form.213)))) (length .form.213)))) (core#begin (.define-transformer.188 (c",
|
|
|
|
|
"ore#quote begin) (core#lambda (.form.216 .env.217) ((core#lambda (.len.218) (cor",
|
|
|
|
|
"e#if (= .len.218 1) #undefined (core#if (= .len.218 2) (cadr .form.216) (core#if",
|
|
|
|
|
" (= .len.218 3) (cons .the-core-begin.192 (cdr .form.216)) (cons .the-core-begin",
|
|
|
|
|
".192 (cons (cadr .form.216) (cons (cons .the-begin.199 (cddr .form.216)) (core#q",
|
|
|
|
|
"uote ())))))))) (length .form.216)))) (core#begin (.define-transformer.188 (core",
|
|
|
|
|
"#quote set!) (core#lambda (.form.219 .env.220) (core#if (core#if (= (length .for",
|
|
|
|
|
"m.219) 3) (identifier? (cadr .form.219)) #f) (cons .the-core-set!.194 (cdr .form",
|
|
|
|
|
".219)) (error \"malformed set!\" .form.219)))) (core#begin (core#define .check-for",
|
|
|
|
|
"mal.204 (core#lambda (.formal.221) ((core#lambda (.it.222) (core#if .it.222 .it.",
|
|
|
|
|
"222 ((core#lambda (.it.223) (core#if .it.223 .it.223 ((core#lambda (.it.224) (co",
|
|
|
|
|
"re#if .it.224 .it.224 #f)) (core#if (pair? .formal.221) (core#if (identifier? (c",
|
|
|
|
|
"ar .formal.221)) (.check-formal.204 (cdr .formal.221)) #f) #f)))) (identifier? .",
|
|
|
|
|
"formal.221)))) (null? .formal.221)))) (core#begin (.define-transformer.188 (core",
|
|
|
|
|
"#quote lambda) (core#lambda (.form.225 .env.226) (core#if (= (length .form.225) ",
|
|
|
|
|
"1) (error \"malformed lambda\" .form.225) (core#if (.check-formal.204 (cadr .form.",
|
|
|
|
|
"225)) (cons .the-core-lambda.191 (cons (cadr .form.225) (cons (cons .the-begin.1",
|
|
|
|
|
"99 (cddr .form.225)) (core#quote ())))) (error \"malformed lambda\" .form.225)))))",
|
|
|
|
|
" (core#begin (.define-transformer.188 (core#quote define) (core#lambda (.form.22",
|
|
|
|
|
"7 .env.228) ((core#lambda (.len.229) (core#if (= .len.229 1) (error \"malformed d",
|
|
|
|
|
"efine\" .form.227) ((core#lambda (.formal.230) (core#if (identifier? .formal.230)",
|
|
|
|
|
" (core#if (= .len.229 3) (cons .the-core-define.190 (cdr .form.227)) (error \"mal",
|
|
|
|
|
"formed define\" .form.227)) (core#if (pair? .formal.230) (cons .the-define.197 (c",
|
|
|
|
|
"ons (car .formal.230) (cons (cons .the-lambda.198 (cons (cdr .formal.230) (cddr ",
|
|
|
|
|
".form.227))) (core#quote ())))) (error \"define: binding to non-varaible object\" ",
|
|
|
|
|
".form.227)))) (cadr .form.227)))) (length .form.227)))) (core#begin (.define-tra",
|
|
|
|
|
"nsformer.188 (core#quote define-macro) (core#lambda (.form.231 .env.232) (core#i",
|
|
|
|
|
"f (= (length .form.231) 3) (core#if (identifier? (cadr .form.231)) (cons .the-co",
|
|
|
|
|
"re-define-macro.196 (cdr .form.231)) (error \"define-macro: binding to non-variab",
|
|
|
|
|
"le object\" .form.231)) (error \"malformed define-macro\" .form.231)))) (core#begin",
|
|
|
|
|
" (.define-transformer.188 (core#quote syntax-error) (core#lambda (.form.233 ._.2",
|
|
|
|
|
"34) (apply error (cdr .form.233)))) (core#begin #undefined (core#begin (.define-",
|
|
|
|
|
"transformer.188 (core#quote else) (core#lambda ._.235 (error \"invalid use of aux",
|
|
|
|
|
"iliary syntax\" (core#quote else)))) (core#begin (.define-transformer.188 (core#q",
|
|
|
|
|
"uote =>) (core#lambda ._.236 (error \"invalid use of auxiliary syntax\" (core#quot",
|
|
|
|
|
"e =>)))) (core#begin (.define-transformer.188 (core#quote unquote) (core#lambda ",
|
|
|
|
|
"._.237 (error \"invalid use of auxiliary syntax\" (core#quote unquote)))) (core#be",
|
|
|
|
|
"gin (.define-transformer.188 (core#quote unquote-splicing) (core#lambda ._.238 (",
|
|
|
|
|
"error \"invalid use of auxiliary syntax\" (core#quote unquote-splicing)))) (core#b",
|
|
|
|
|
"egin (.define-transformer.188 (core#quote syntax-unquote) (core#lambda ._.239 (e",
|
|
|
|
|
"rror \"invalid use of auxiliary syntax\" (core#quote syntax-unquote)))) (core#begi",
|
|
|
|
|
"n (.define-transformer.188 (core#quote syntax-unquote-splicing) (core#lambda ._.",
|
|
|
|
|
"240 (error \"invalid use of auxiliary syntax\" (core#quote syntax-unquote-splicing",
|
|
|
|
|
")))) (core#begin (.define-transformer.188 (core#quote let) (core#lambda (.form.2",
|
|
|
|
|
"41 .env.242) (core#if (identifier? (cadr .form.241)) ((core#lambda (.name.243 .f",
|
|
|
|
|
"ormal.244 .body.245) (cons (cons .the-lambda.198 (cons (core#quote ()) (cons (co",
|
|
|
|
|
"ns .the-define.197 (cons (cons .name.243 (map car .formal.244)) .body.245)) (con",
|
|
|
|
|
"s (cons .name.243 (map cadr .formal.244)) (core#quote ()))))) (core#quote ()))) ",
|
|
|
|
|
"(car (cdr .form.241)) (car (cdr (cdr .form.241))) (cdr (cdr (cdr .form.241)))) (",
|
|
|
|
|
"(core#lambda (.formal.246 .body.247) (cons (cons .the-lambda.198 (cons (map car ",
|
|
|
|
|
".formal.246) .body.247)) (map cadr .formal.246))) (car (cdr .form.241)) (cdr (cd",
|
|
|
|
|
"r .form.241)))))) (core#begin (.define-transformer.188 (core#quote and) (core#la",
|
|
|
|
|
"mbda (.form.248 .env.249) (core#if (null? (cdr .form.248)) #t (core#if (null? (c",
|
|
|
|
|
"ddr .form.248)) (cadr .form.248) (cons .the-if.202 (cons (cadr .form.248) (cons ",
|
|
|
|
|
"(cons (.the.189 (core#quote and)) (cddr .form.248)) (cons (core#quote #f) (core#",
|
|
|
|
|
"quote ()))))))))) (core#begin (.define-transformer.188 (core#quote or) (core#lam",
|
|
|
|
|
"bda (.form.250 .env.251) (core#if (null? (cdr .form.250)) #f ((core#lambda (.tmp",
|
|
|
|
|
".252) (cons (.the.189 (core#quote let)) (cons (cons (cons .tmp.252 (cons (cadr .",
|
|
|
|
|
"form.250) (core#quote ()))) (core#quote ())) (cons (cons .the-if.202 (cons .tmp.",
|
|
|
|
|
"252 (cons .tmp.252 (cons (cons (.the.189 (core#quote or)) (cddr .form.250)) (cor",
|
|
|
|
|
"e#quote ()))))) (core#quote ()))))) (make-identifier (core#quote it) .env.251)))",
|
|
|
|
|
")) (core#begin (.define-transformer.188 (core#quote cond) (core#lambda (.form.25",
|
|
|
|
|
"3 .env.254) ((core#lambda (.clauses.255) (core#if (null? .clauses.255) #undefine",
|
|
|
|
|
"d ((core#lambda (.clause.256) (core#if (core#if (identifier? (car .clause.256)) ",
|
|
|
|
|
"(identifier=? (.the.189 (core#quote else)) (make-identifier (car .clause.256) .e",
|
|
|
|
|
"nv.254)) #f) (cons .the-begin.199 (cdr .clause.256)) (core#if (null? (cdr .claus",
|
|
|
|
|
"e.256)) (cons (.the.189 (core#quote or)) (cons (car .clause.256) (cons (cons (.t",
|
|
|
|
|
"he.189 (core#quote cond)) (cdr .clauses.255)) (core#quote ())))) (core#if (core#",
|
|
|
|
|
"if (identifier? (cadr .clause.256)) (identifier=? (.the.189 (core#quote =>)) (ma",
|
|
|
|
|
"ke-identifier (cadr .clause.256) .env.254)) #f) ((core#lambda (.tmp.257) (cons (",
|
|
|
|
|
".the.189 (core#quote let)) (cons (cons (cons .tmp.257 (cons (car .clause.256) (c",
|
|
|
|
|
"ore#quote ()))) (core#quote ())) (cons (cons .the-if.202 (cons .tmp.257 (cons (c",
|
|
|
|
|
"ons (cadr (cdr .clause.256)) (cons .tmp.257 (core#quote ()))) (cons (cons (.the.",
|
|
|
|
|
"189 (core#quote cond)) (cddr .form.253)) (core#quote ()))))) (core#quote ())))))",
|
|
|
|
|
" (make-identifier (core#quote tmp) .env.254)) (cons .the-if.202 (cons (car .clau",
|
|
|
|
|
"se.256) (cons (cons .the-begin.199 (cdr .clause.256)) (cons (cons (.the.189 (cor",
|
|
|
|
|
"e#quote cond)) (cdr .clauses.255)) (core#quote ()))))))))) (car .clauses.255))))",
|
|
|
|
|
" (cdr .form.253)))) (core#begin (.define-transformer.188 (core#quote quasiquote)",
|
|
|
|
|
" (core#lambda (.form.258 .env.259) (core#begin (core#define .quasiquote?.260 (co",
|
|
|
|
|
"re#lambda (.form.264) (core#if (pair? .form.264) (core#if (identifier? (car .for",
|
|
|
|
|
"m.264)) (identifier=? (.the.189 (core#quote quasiquote)) (make-identifier (car .",
|
|
|
|
|
"form.264) .env.259)) #f) #f))) (core#begin (core#define .unquote?.261 (core#lamb",
|
|
|
|
|
"da (.form.265) (core#if (pair? .form.265) (core#if (identifier? (car .form.265))",
|
|
|
|
|
" (identifier=? (.the.189 (core#quote unquote)) (make-identifier (car .form.265) ",
|
|
|
|
|
".env.259)) #f) #f))) (core#begin (core#define .unquote-splicing?.262 (core#lambd",
|
|
|
|
|
"a (.form.266) (core#if (pair? .form.266) (core#if (pair? (car .form.266)) (core#",
|
|
|
|
|
"if (identifier? (caar .form.266)) (identifier=? (.the.189 (core#quote unquote-sp",
|
|
|
|
|
"licing)) (make-identifier (caar .form.266) .env.259)) #f) #f) #f))) (core#begin ",
|
|
|
|
|
"(core#define .qq.263 (core#lambda (.depth.267 .expr.268) (core#if (.unquote?.261",
|
|
|
|
|
" .expr.268) (core#if (= .depth.267 1) (cadr .expr.268) (list (.the.189 (core#quo",
|
|
|
|
|
"te list)) (list (.the.189 (core#quote quote)) (.the.189 (core#quote unquote))) (",
|
|
|
|
|
".qq.263 (- .depth.267 1) (car (cdr .expr.268))))) (core#if (.unquote-splicing?.2",
|
|
|
|
|
"62 .expr.268) (core#if (= .depth.267 1) (list (.the.189 (core#quote append)) (ca",
|
|
|
|
|
"r (cdr (car .expr.268))) (.qq.263 .depth.267 (cdr .expr.268))) (list (.the.189 (",
|
|
|
|
|
"core#quote cons)) (list (.the.189 (core#quote list)) (list (.the.189 (core#quote",
|
|
|
|
|
" quote)) (.the.189 (core#quote unquote-splicing))) (.qq.263 (- .depth.267 1) (ca",
|
|
|
|
|
"r (cdr (car .expr.268))))) (.qq.263 .depth.267 (cdr .expr.268)))) (core#if (.qua",
|
|
|
|
|
"siquote?.260 .expr.268) (list (.the.189 (core#quote list)) (list (.the.189 (core",
|
|
|
|
|
"#quote quote)) (.the.189 (core#quote quasiquote))) (.qq.263 (+ .depth.267 1) (ca",
|
|
|
|
|
"r (cdr .expr.268)))) (core#if (pair? .expr.268) (list (.the.189 (core#quote cons",
|
|
|
|
|
")) (.qq.263 .depth.267 (car .expr.268)) (.qq.263 .depth.267 (cdr .expr.268))) (c",
|
|
|
|
|
"ore#if (vector? .expr.268) (list (.the.189 (core#quote list->vector)) (.qq.263 .",
|
|
|
|
|
"depth.267 (vector->list .expr.268))) (list (.the.189 (core#quote quote)) .expr.2",
|
|
|
|
|
"68)))))))) ((core#lambda (.x.269) (.qq.263 1 .x.269)) (cadr .form.258)))))))) (c",
|
|
|
|
|
"ore#begin (.define-transformer.188 (core#quote let*) (core#lambda (.form.270 .en",
|
|
|
|
|
"v.271) ((core#lambda (.bindings.272 .body.273) (core#if (null? .bindings.272) (c",
|
|
|
|
|
"ons (.the.189 (core#quote let)) (cons (core#quote ()) .body.273)) (cons (.the.18",
|
|
|
|
|
"9 (core#quote let)) (cons (cons (cons (car (car .bindings.272)) (cdr (car .bindi",
|
|
|
|
|
"ngs.272))) (core#quote ())) (cons (cons (.the.189 (core#quote let*)) (cons (cdr ",
|
|
|
|
|
".bindings.272) .body.273)) (core#quote ())))))) (car (cdr .form.270)) (cdr (cdr ",
|
|
|
|
|
".form.270))))) (core#begin (.define-transformer.188 (core#quote letrec) (core#la",
|
|
|
|
|
"mbda (.form.274 .env.275) (cons (.the.189 (core#quote letrec*)) (cdr .form.274))",
|
|
|
|
|
")) (core#begin (.define-transformer.188 (core#quote letrec*) (core#lambda (.form",
|
|
|
|
|
".276 .env.277) ((core#lambda (.bindings.278 .body.279) ((core#lambda (.variables",
|
|
|
|
|
".280 .initials.281) (cons (.the.189 (core#quote let)) (cons .variables.280 (appe",
|
|
|
|
|
"nd .initials.281 (append .body.279 (core#quote ())))))) (map (core#lambda (.v.28",
|
|
|
|
|
"2) (cons .v.282 (cons (core#quote #undefined) (core#quote ())))) (map car .bindi",
|
|
|
|
|
"ngs.278)) (map (core#lambda (.v.283) (cons (.the.189 (core#quote set!)) (append ",
|
|
|
|
|
".v.283 (core#quote ())))) .bindings.278))) (car (cdr .form.276)) (cdr (cdr .form",
|
|
|
|
|
".276))))) (core#begin (.define-transformer.188 (core#quote let-values) (core#lam",
|
|
|
|
|
"bda (.form.284 .env.285) (cons (.the.189 (core#quote let*-values)) (append (cdr ",
|
|
|
|
|
".form.284) (core#quote ()))))) (core#begin (.define-transformer.188 (core#quote ",
|
|
|
|
|
"let*-values) (core#lambda (.form.286 .env.287) ((core#lambda (.formal.288 .body.",
|
|
|
|
|
"289) (core#if (null? .formal.288) (cons (.the.189 (core#quote let)) (cons (core#",
|
|
|
|
|
"quote ()) (append .body.289 (core#quote ())))) (cons (.the.189 (core#quote call-",
|
|
|
|
|
"with-values)) (cons (cons .the-lambda.198 (cons (core#quote ()) (append (cdr (ca",
|
|
|
|
|
"r .formal.288)) (core#quote ())))) (cons (cons (.the.189 (core#quote lambda)) (c",
|
|
|
|
|
"ons (append (car (car .formal.288)) (core#quote ())) (cons (cons (.the.189 (core",
|
|
|
|
|
"#quote let*-values)) (cons (append (cdr .formal.288) (core#quote ())) (append .b",
|
|
|
|
|
"ody.289 (core#quote ())))) (core#quote ())))) (core#quote ())))))) (car (cdr .fo",
|
|
|
|
|
"rm.286)) (cdr (cdr .form.286))))) (core#begin (.define-transformer.188 (core#quo",
|
|
|
|
|
"te define-values) (core#lambda (.form.290 .env.291) ((core#lambda (.formal.292 .",
|
|
|
|
|
"body.293) ((core#lambda (.arguments.294) (cons .the-begin.199 (append ((core#lam",
|
|
|
|
|
"bda () (core#begin (core#define .loop.295 (core#lambda (.formal.296) (core#if (p",
|
|
|
|
|
"air? .formal.296) (cons (cons .the-define.197 (cons (car .formal.296) (cons (cor",
|
|
|
|
|
"e#quote #undefined) (core#quote ())))) (append (.loop.295 (cdr .formal.296)) (co",
|
|
|
|
|
"re#quote ()))) (core#if (identifier? .formal.296) (cons (cons .the-define.197 (c",
|
|
|
|
|
"ons .formal.296 (cons (core#quote #undefined) (core#quote ())))) (core#quote ())",
|
|
|
|
|
") (core#quote ()))))) (.loop.295 .formal.292)))) (cons (cons (.the.189 (core#quo",
|
|
|
|
|
"te call-with-values)) (cons (cons .the-lambda.198 (cons (core#quote ()) (append ",
|
|
|
|
|
".body.293 (core#quote ())))) (cons (cons .the-lambda.198 (cons .arguments.294 (a",
|
|
|
|
|
"ppend ((core#lambda () (core#begin (core#define .loop.297 (core#lambda (.formal.",
|
|
|
|
|
"298 .args.299) (core#if (pair? .formal.298) (cons (cons .the-set!.201 (cons (car",
|
|
|
|
|
" .formal.298) (cons (cons (.the.189 (core#quote car)) (cons .args.299 (core#quot",
|
|
|
|
|
"e ()))) (core#quote ())))) (append (.loop.297 (cdr .formal.298) (cons (.the.189 ",
|
|
|
|
|
"(core#quote cdr)) (cons .args.299 (core#quote ())))) (core#quote ()))) (core#if ",
|
|
|
|
|
"(identifier? .formal.298) (cons (cons .the-set!.201 (cons .formal.298 (cons .arg",
|
|
|
|
|
"s.299 (core#quote ())))) (core#quote ())) (core#quote ()))))) (.loop.297 .formal",
|
|
|
|
|
".292 .arguments.294)))) (core#quote ())))) (core#quote ())))) (core#quote ()))))",
|
|
|
|
|
") (make-identifier (core#quote arguments) .env.291))) (car (cdr .form.290)) (cdr",
|
|
|
|
|
" (cdr .form.290))))) (core#begin (.define-transformer.188 (core#quote do) (core#",
|
|
|
|
|
"lambda (.form.300 .env.301) ((core#lambda (.bindings.302 .test.303 .cleanup.304 ",
|
|
|
|
|
".body.305) ((core#lambda (.loop.306) (cons (.the.189 (core#quote let)) (cons .lo",
|
|
|
|
|
"op.306 (cons (map (core#lambda (.x.307) (cons (car .x.307) (cons (cadr .x.307) (",
|
|
|
|
|
"core#quote ())))) .bindings.302) (cons (cons .the-if.202 (cons .test.303 (cons (",
|
|
|
|
|
"cons .the-begin.199 .cleanup.304) (cons (cons .the-begin.199 (append .body.305 (",
|
|
|
|
|
"cons (cons .loop.306 (map (core#lambda (.x.308) (core#if (null? (cdr (cdr .x.308",
|
|
|
|
|
"))) (car .x.308) (car (cdr (cdr .x.308))))) .bindings.302)) (core#quote ())))) (",
|
|
|
|
|
"core#quote ()))))) (core#quote ())))))) (make-identifier (core#quote loop) .env.",
|
|
|
|
|
"301))) (car (cdr .form.300)) (car (car (cdr (cdr .form.300)))) (cdr (car (cdr (c",
|
|
|
|
|
"dr .form.300)))) (cdr (cdr (cdr .form.300)))))) (core#begin (.define-transformer",
|
|
|
|
|
".188 (core#quote when) (core#lambda (.form.309 .env.310) ((core#lambda (.test.31",
|
|
|
|
|
"1 .body.312) (cons .the-if.202 (cons .test.311 (cons (cons .the-begin.199 (appen",
|
|
|
|
|
"d .body.312 (core#quote ()))) (cons (core#quote #undefined) (core#quote ()))))))",
|
|
|
|
|
" (car (cdr .form.309)) (cdr (cdr .form.309))))) (core#begin (.define-transformer",
|
|
|
|
|
".188 (core#quote unless) (core#lambda (.form.313 .env.314) ((core#lambda (.test.",
|
|
|
|
|
"315 .body.316) (cons .the-if.202 (cons .test.315 (cons (core#quote #undefined) (",
|
|
|
|
|
"cons (cons .the-begin.199 (append .body.316 (core#quote ()))) (core#quote ()))))",
|
|
|
|
|
")) (car (cdr .form.313)) (cdr (cdr .form.313))))) (core#begin (.define-transform",
|
|
|
|
|
"er.188 (core#quote case) (core#lambda (.form.317 .env.318) ((core#lambda (.key.3",
|
|
|
|
|
"19 .clauses.320) ((core#lambda (.the-key.321) (cons (.the.189 (core#quote let)) ",
|
|
|
|
|
"(cons (cons (cons .the-key.321 (cons .key.319 (core#quote ()))) (core#quote ()))",
|
|
|
|
|
" (cons ((core#lambda () (core#begin (core#define .loop.322 (core#lambda (.clause",
|
|
|
|
|
"s.323) (core#if (null? .clauses.323) #undefined ((core#lambda (.clause.324) (con",
|
|
|
|
|
"s .the-if.202 (cons (core#if (core#if (identifier? (car .clause.324)) (identifie",
|
|
|
|
|
"r=? (.the.189 (core#quote else)) (make-identifier (car .clause.324) .env.318)) #",
|
|
|
|
|
"f) #t (cons (.the.189 (core#quote or)) (append (map (core#lambda (.x.325) (cons ",
|
|
|
|
|
"(.the.189 (core#quote eqv?)) (cons .the-key.321 (cons (cons .the-quote.200 (cons",
|
|
|
|
|
" .x.325 (core#quote ()))) (core#quote ()))))) (car .clause.324)) (core#quote ())",
|
|
|
|
|
"))) (cons (core#if (core#if (identifier? (cadr .clause.324)) (identifier=? (.the",
|
|
|
|
|
".189 (core#quote =>)) (make-identifier (cadr .clause.324) .env.318)) #f) (cons (",
|
|
|
|
|
"car (cdr (cdr .clause.324))) (cons .the-key.321 (core#quote ()))) (cons .the-beg",
|
|
|
|
|
"in.199 (append (cdr .clause.324) (core#quote ())))) (cons (.loop.322 (cdr .claus",
|
|
|
|
|
"es.323)) (core#quote ())))))) (car .clauses.323))))) (.loop.322 .clauses.320))))",
|
|
|
|
|
" (core#quote ()))))) (make-identifier (core#quote key) .env.318))) (car (cdr .fo",
|
|
|
|
|
"rm.317)) (cdr (cdr .form.317))))) (core#begin (.define-transformer.188 (core#quo",
|
|
|
|
|
"te parameterize) (core#lambda (.form.326 .env.327) ((core#lambda (.formal.328 .b",
|
|
|
|
|
"ody.329) (cons (.the.189 (core#quote with-dynamic-environment)) (cons (cons (.th",
|
|
|
|
|
"e.189 (core#quote list)) (append (map (core#lambda (.x.330) (cons (.the.189 (cor",
|
|
|
|
|
"e#quote cons)) (cons (car .x.330) (cons (cadr .x.330) (core#quote ()))))) .forma",
|
|
|
|
|
"l.328) (core#quote ()))) (cons (cons .the-lambda.198 (cons (core#quote ()) (appe",
|
|
|
|
|
"nd .body.329 (core#quote ())))) (core#quote ()))))) (car (cdr .form.326)) (cdr (",
|
|
|
|
|
"cdr .form.326))))) (core#begin (.define-transformer.188 (core#quote syntax-quote",
|
|
|
|
|
") (core#lambda (.form.331 .env.332) ((core#lambda (.renames.333) ((core#lambda (",
|
|
|
|
|
".rename.334 .walk.335) (core#begin (core#set! .rename.334 (core#lambda (.var.336",
|
|
|
|
|
") ((core#lambda (.x.337) (core#if .x.337 (cadr .x.337) (core#begin (core#set! .r",
|
|
|
|
|
"enames.333 (cons (cons .var.336 (cons (make-identifier .var.336 .env.332) (cons ",
|
|
|
|
|
"(cons (.the.189 (core#quote make-identifier)) (cons (cons (core#quote quote) (co",
|
|
|
|
|
"ns .var.336 (core#quote ()))) (cons (cons (core#quote quote) (cons .env.332 (cor",
|
|
|
|
|
"e#quote ()))) (core#quote ())))) (core#quote ())))) .renames.333)) (.rename.334 ",
|
|
|
|
|
".var.336)))) (assq .var.336 .renames.333)))) (core#begin (core#set! .walk.335 (c",
|
|
|
|
|
"ore#lambda (.f.338 .form.339) (core#if (identifier? .form.339) (.f.338 .form.339",
|
|
|
|
|
") (core#if (pair? .form.339) (cons (.the.189 (core#quote cons)) (cons (cons (cor",
|
|
|
|
|
"e#quote walk) (cons (core#quote f) (cons (cons (core#quote car) (cons (core#quot",
|
|
|
|
|
"e form) (core#quote ()))) (core#quote ())))) (cons (cons (core#quote walk) (cons",
|
|
|
|
|
" (core#quote f) (cons (cons (core#quote cdr) (cons (core#quote form) (core#quote",
|
|
|
|
|
" ()))) (core#quote ())))) (core#quote ())))) (core#if (vector? .form.339) (cons ",
|
|
|
|
|
"(.the.189 (core#quote list->vector)) (cons (cons (core#quote walk) (cons (core#q",
|
|
|
|
|
"uote f) (cons (cons (core#quote vector->list) (cons (core#quote form) (core#quot",
|
|
|
|
|
"e ()))) (core#quote ())))) (core#quote ()))) (cons (.the.189 (core#quote quote))",
|
|
|
|
|
" (cons .form.339 (core#quote ())))))))) ((core#lambda (.form.340) (cons (.the.18",
|
|
|
|
|
"9 (core#quote let)) (cons (map cdr .renames.333) (cons .form.340 (core#quote ())",
|
|
|
|
|
")))) (.walk.335 .rename.334 (cadr .form.331)))))) #f #f)) (core#quote ())))) (co",
|
|
|
|
|
"re#begin (.define-transformer.188 (core#quote syntax-quasiquote) (core#lambda (.",
|
|
|
|
|
"form.341 .env.342) ((core#lambda (.renames.343) ((core#lambda (.rename.344) (cor",
|
|
|
|
|
"e#begin (core#set! .rename.344 (core#lambda (.var.349) ((core#lambda (.x.350) (c",
|
|
|
|
|
"ore#if .x.350 (cadr .x.350) (core#begin (core#set! .renames.343 (cons (cons .var",
|
|
|
|
|
".349 (cons (make-identifier .var.349 .env.342) (cons (cons (.the.189 (core#quote",
|
|
|
|
|
" make-identifier)) (cons (cons (core#quote quote) (cons .var.349 (core#quote ())",
|
|
|
|
|
")) (cons (cons (core#quote quote) (cons .env.342 (core#quote ()))) (core#quote (",
|
|
|
|
|
"))))) (core#quote ())))) .renames.343)) (.rename.344 .var.349)))) (assq .var.349",
|
|
|
|
|
" .renames.343)))) (core#begin (core#define .syntax-quasiquote?.345 (core#lambda ",
|
|
|
|
|
"(.form.351) (core#if (pair? .form.351) (core#if (identifier? (car .form.351)) (i",
|
|
|
|
|
"dentifier=? (.the.189 (core#quote syntax-quasiquote)) (make-identifier (car .for",
|
|
|
|
|
"m.351) .env.342)) #f) #f))) (core#begin (core#define .syntax-unquote?.346 (core#",
|
|
|
|
|
"lambda (.form.352) (core#if (pair? .form.352) (core#if (identifier? (car .form.3",
|
|
|
|
|
"52)) (identifier=? (.the.189 (core#quote syntax-unquote)) (make-identifier (car ",
|
|
|
|
|
".form.352) .env.342)) #f) #f))) (core#begin (core#define .syntax-unquote-splicin",
|
|
|
|
|
"g?.347 (core#lambda (.form.353) (core#if (pair? .form.353) (core#if (pair? (car ",
|
|
|
|
|
".form.353)) (core#if (identifier? (caar .form.353)) (identifier=? (.the.189 (cor",
|
|
|
|
|
"e#quote syntax-unquote-splicing)) (make-identifier (caar .form.353) .env.342)) #",
|
|
|
|
|
"f) #f) #f))) (core#begin (core#define .qq.348 (core#lambda (.depth.354 .expr.355",
|
|
|
|
|
") (core#if (.syntax-unquote?.346 .expr.355) (core#if (= .depth.354 1) (car (cdr ",
|
|
|
|
|
".expr.355)) (list (.the.189 (core#quote list)) (list (.the.189 (core#quote quote",
|
|
|
|
|
")) (.the.189 (core#quote syntax-unquote))) (.qq.348 (- .depth.354 1) (car (cdr .",
|
|
|
|
|
"expr.355))))) (core#if (.syntax-unquote-splicing?.347 .expr.355) (core#if (= .de",
|
|
|
|
|
"pth.354 1) (list (.the.189 (core#quote append)) (car (cdr (car .expr.355))) (.qq",
|
|
|
|
|
".348 .depth.354 (cdr .expr.355))) (list (.the.189 (core#quote cons)) (list (.the",
|
|
|
|
|
".189 (core#quote list)) (list (.the.189 (core#quote quote)) (.the.189 (core#quot",
|
|
|
|
|
"e syntax-unquote-splicing))) (.qq.348 (- .depth.354 1) (car (cdr (car .expr.355)",
|
|
|
|
|
")))) (.qq.348 .depth.354 (cdr .expr.355)))) (core#if (.syntax-quasiquote?.345 .e",
|
|
|
|
|
"xpr.355) (list (.the.189 (core#quote list)) (list (.the.189 (core#quote quote)) ",
|
|
|
|
|
"(.the.189 (core#quote quasiquote))) (.qq.348 (+ .depth.354 1) (car (cdr .expr.35",
|
|
|
|
|
"5)))) (core#if (pair? .expr.355) (list (.the.189 (core#quote cons)) (.qq.348 .de",
|
|
|
|
|
"pth.354 (car .expr.355)) (.qq.348 .depth.354 (cdr .expr.355))) (core#if (vector?",
|
|
|
|
|
" .expr.355) (list (.the.189 (core#quote list->vector)) (.qq.348 .depth.354 (vect",
|
|
|
|
|
"or->list .expr.355))) (core#if (identifier? .expr.355) (.rename.344 .expr.355) (",
|
|
|
|
|
"list (.the.189 (core#quote quote)) .expr.355))))))))) ((core#lambda (.body.356) ",
|
|
|
|
|
"(cons (.the.189 (core#quote let)) (cons (map cdr .renames.343) (cons .body.356 (",
|
|
|
|
|
"core#quote ()))))) (.qq.348 1 (cadr .form.341))))))))) #f)) (core#quote ())))) (",
|
|
|
|
|
"core#begin (.define-transformer.188 (core#quote define-syntax) (core#lambda (.fo",
|
|
|
|
|
"rm.357 .env.358) ((core#lambda (.formal.359 .body.360) (core#if (pair? .formal.3",
|
|
|
|
|
"59) (cons (.the.189 (core#quote define-syntax)) (cons (car .formal.359) (cons (c",
|
|
|
|
|
"ons .the-lambda.198 (cons (cdr .formal.359) (append .body.360 (core#quote ()))))",
|
|
|
|
|
" (core#quote ())))) (cons .the-define-macro.203 (cons .formal.359 (cons (cons (.",
|
|
|
|
|
"the.189 (core#quote transformer)) (cons (cons .the-begin.199 (append .body.360 (",
|
|
|
|
|
"core#quote ()))) (core#quote ()))) (core#quote ())))))) (car (cdr .form.357)) (c",
|
|
|
|
|
"dr (cdr .form.357))))) (core#begin (.define-transformer.188 (core#quote letrec-s",
|
|
|
|
|
"yntax) (core#lambda (.form.361 .env.362) ((core#lambda (.formal.363 .body.364) (",
|
|
|
|
|
"cons (core#quote let) (cons (core#quote ()) (append (map (core#lambda (.x.365) (",
|
|
|
|
|
"cons (.the.189 (core#quote define-syntax)) (cons (car .x.365) (cons (cadr .x.365",
|
|
|
|
|
") (core#quote ()))))) .formal.363) (append .body.364 (core#quote ())))))) (car (",
|
|
|
|
|
"cdr .form.361)) (cdr (cdr .form.361))))) (.define-transformer.188 (core#quote le",
|
|
|
|
|
"t-syntax) (core#lambda (.form.366 .env.367) (cons (.the.189 (core#quote letrec-s",
|
|
|
|
|
"yntax)) (append (cdr .form.366) (core#quote ()))))))))))))))))))))))))))))))))))",
|
|
|
|
|
")))))))))))))))))))))))))) ",
|
|
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
@ -202,67 +343,68 @@ static const char boot_library_rom[][80] = {
|
|
|
|
|
"m))) (or (null? form) (and (test (car form)) (loop (cdr form)))))) ((or) (let lo",
|
|
|
|
|
"op ((form (cdr form))) (and (pair? form) (or (test (car form)) (loop (cdr form))",
|
|
|
|
|
")))) (else #f))))))) (let loop ((clauses (cdr form))) (if (null? clauses) #undef",
|
|
|
|
|
"ined (if (test (caar clauses)) `(,the-begin ,@(cdar clauses)) (loop (cdr clauses",
|
|
|
|
|
")))))))) (define-macro import (lambda (form _) (let ((caddr (lambda (x) (car (cd",
|
|
|
|
|
"r (cdr x))))) (prefix (lambda (prefix symbol) (string->symbol (string-append (sy",
|
|
|
|
|
"mbol->string prefix) (symbol->string symbol))))) (getlib (lambda (name) (if (fin",
|
|
|
|
|
"d-library name) name (error \"library not found\" name))))) (letrec ((extract (lam",
|
|
|
|
|
"bda (spec) (case (car spec) ((only rename prefix except) (extract (cadr spec))) ",
|
|
|
|
|
"(else (getlib spec))))) (collect (lambda (spec) (case (car spec) ((only) (let ((",
|
|
|
|
|
"alist (collect (cadr spec)))) (map (lambda (var) (assq var alist)) (cddr spec)))",
|
|
|
|
|
") ((rename) (let ((alist (collect (cadr spec))) (renames (map (lambda (x) `(,(ca",
|
|
|
|
|
"r x) unquote (cadr x))) (cddr spec)))) (map (lambda (s) (or (assq (car s) rename",
|
|
|
|
|
"s) s)) alist))) ((prefix) (let ((alist (collect (cadr spec)))) (map (lambda (s) ",
|
|
|
|
|
"(cons (prefix (caddr spec) (car s)) (cdr s))) alist))) ((except) (let ((alist (c",
|
|
|
|
|
"ollect (cadr spec)))) (let loop ((alist alist)) (if (null? alist) '() (if (memq ",
|
|
|
|
|
"(caar alist) (cddr spec)) (loop (cdr alist)) (cons (car alist) (loop (cdr alist)",
|
|
|
|
|
"))))))) (else (dictionary-map (lambda (x) (cons x x)) (library-exports (getlib s",
|
|
|
|
|
"pec)))))))) (letrec ((import (lambda (spec) (let ((lib (extract spec)) (alist (c",
|
|
|
|
|
"ollect spec))) (for-each (lambda (slot) (library-import lib (cdr slot) (car slot",
|
|
|
|
|
"))) alist))))) (for-each import (cdr form))))))) (define-macro export (lambda (f",
|
|
|
|
|
"orm _) (letrec ((collect (lambda (spec) (cond ((symbol? spec) `(,spec unquote sp",
|
|
|
|
|
"ec)) ((and (list? spec) (= (length spec) 3) (eq? (car spec) 'rename)) `(,(list-r",
|
|
|
|
|
"ef spec 1) unquote (list-ref spec 2))) (else (error \"malformed export\"))))) (exp",
|
|
|
|
|
"ort (lambda (spec) (let ((slot (collect spec))) (library-export (car slot) (cdr ",
|
|
|
|
|
"slot)))))) (for-each export (cdr form))))) (let () (make-library '(picrin base))",
|
|
|
|
|
" (set-car! (dictionary-ref *libraries* (mangle '(picrin base))) default-environm",
|
|
|
|
|
"ent) (let ((export-keywords (lambda (keywords) (let ((env (library-environment '",
|
|
|
|
|
"(picrin base))) (exports (library-exports '(picrin base)))) (for-each (lambda (k",
|
|
|
|
|
"eyword) (dictionary-set! exports keyword keyword)) keywords))))) (export-keyword",
|
|
|
|
|
"s '(define lambda quote set! if begin define-macro let let* letrec letrec* let-v",
|
|
|
|
|
"alues let*-values define-values quasiquote unquote unquote-splicing and or cond ",
|
|
|
|
|
"case else => do when unless parameterize define-syntax syntax-quote syntax-unquo",
|
|
|
|
|
"te syntax-quasiquote syntax-unquote-splicing let-syntax letrec-syntax syntax-err",
|
|
|
|
|
"or)) (export-keywords '(features eq? eqv? equal? not boolean? boolean=? pair? co",
|
|
|
|
|
"ns car cdr null? set-car! set-cdr! caar cadr cdar cddr list? make-list list leng",
|
|
|
|
|
"th append reverse list-tail list-ref list-set! list-copy map for-each memq memv ",
|
|
|
|
|
"member assq assv assoc current-input-port current-output-port current-error-port",
|
|
|
|
|
" port? input-port? output-port? port-open? close-port eof-object? eof-object rea",
|
|
|
|
|
"d-u8 peek-u8 read-bytevector! write-u8 write-bytevector flush-output-port open-i",
|
|
|
|
|
"nput-bytevector open-output-bytevector get-output-bytevector number? exact? inex",
|
|
|
|
|
"act? inexact exact = < > <= >= + - * / number->string string->number procedure? ",
|
|
|
|
|
"apply symbol? symbol=? symbol->string string->symbol make-identifier identifier?",
|
|
|
|
|
" identifier=? identifier-base identifier-environment vector? vector make-vector ",
|
|
|
|
|
"vector-length vector-ref vector-set! vector-copy! vector-copy vector-append vect",
|
|
|
|
|
"or-fill! vector-map vector-for-each list->vector vector->list string->vector vec",
|
|
|
|
|
"tor->string bytevector? bytevector make-bytevector bytevector-length bytevector-",
|
|
|
|
|
"u8-ref bytevector-u8-set! bytevector-copy! bytevector-copy bytevector-append byt",
|
|
|
|
|
"evector->list list->bytevector call-with-current-continuation call/cc values cal",
|
|
|
|
|
"l-with-values char? char->integer integer->char char=? char<? char>? char<=? cha",
|
|
|
|
|
"r>=? current-exception-handlers with-exception-handler raise raise-continuable e",
|
|
|
|
|
"rror error-object? error-object-message error-object-irritants error-object-type",
|
|
|
|
|
" string? string make-string string-length string-ref string-set! string-copy str",
|
|
|
|
|
"ing-copy! string-fill! string-append string-map string-for-each list->string str",
|
|
|
|
|
"ing->list string=? string<? string>? string<=? string>=? make-parameter with-dyn",
|
|
|
|
|
"amic-environment read make-dictionary dictionary? dictionary dictionary-has? dic",
|
|
|
|
|
"tionary-ref dictionary-set! dictionary-delete! dictionary-size dictionary-map di",
|
|
|
|
|
"ctionary-for-each dictionary->alist alist->dictionary dictionary->plist plist->d",
|
|
|
|
|
"ictionary make-record record? record-type record-datum default-environment make-",
|
|
|
|
|
"environment find-identifier set-identifier! eval make-ephemeron-table write writ",
|
|
|
|
|
"e-simple write-shared display)) (export-keywords '(find-library make-library cur",
|
|
|
|
|
"rent-library))) (set! eval (let ((e eval)) (lambda (expr . lib) (let ((lib (if (",
|
|
|
|
|
"null? lib) (current-library) (car lib)))) (e expr (library-environment lib))))))",
|
|
|
|
|
" (make-library '(picrin user)) (current-library '(picrin user))) ",
|
|
|
|
|
"ined (if (test (caar clauses)) `(,(make-identifier 'begin default-environment) ,",
|
|
|
|
|
"@(cdar clauses)) (loop (cdr clauses)))))))) (define-macro import (lambda (form _",
|
|
|
|
|
") (let ((caddr (lambda (x) (car (cdr (cdr x))))) (prefix (lambda (prefix symbol)",
|
|
|
|
|
" (string->symbol (string-append (symbol->string prefix) (symbol->string symbol))",
|
|
|
|
|
"))) (getlib (lambda (name) (if (find-library name) name (error \"library not foun",
|
|
|
|
|
"d\" name))))) (letrec ((extract (lambda (spec) (case (car spec) ((only rename pre",
|
|
|
|
|
"fix except) (extract (cadr spec))) (else (getlib spec))))) (collect (lambda (spe",
|
|
|
|
|
"c) (case (car spec) ((only) (let ((alist (collect (cadr spec)))) (map (lambda (v",
|
|
|
|
|
"ar) (assq var alist)) (cddr spec)))) ((rename) (let ((alist (collect (cadr spec)",
|
|
|
|
|
")) (renames (map (lambda (x) `(,(car x) unquote (cadr x))) (cddr spec)))) (map (",
|
|
|
|
|
"lambda (s) (or (assq (car s) renames) s)) alist))) ((prefix) (let ((alist (colle",
|
|
|
|
|
"ct (cadr spec)))) (map (lambda (s) (cons (prefix (caddr spec) (car s)) (cdr s)))",
|
|
|
|
|
" alist))) ((except) (let ((alist (collect (cadr spec)))) (let loop ((alist alist",
|
|
|
|
|
")) (if (null? alist) '() (if (memq (caar alist) (cddr spec)) (loop (cdr alist)) ",
|
|
|
|
|
"(cons (car alist) (loop (cdr alist)))))))) (else (dictionary-map (lambda (x) (co",
|
|
|
|
|
"ns x x)) (library-exports (getlib spec)))))))) (letrec ((import (lambda (spec) (",
|
|
|
|
|
"let ((lib (extract spec)) (alist (collect spec))) (for-each (lambda (slot) (libr",
|
|
|
|
|
"ary-import lib (cdr slot) (car slot))) alist))))) (for-each import (cdr form))))",
|
|
|
|
|
"))) (define-macro export (lambda (form _) (letrec ((collect (lambda (spec) (cond",
|
|
|
|
|
" ((symbol? spec) `(,spec unquote spec)) ((and (list? spec) (= (length spec) 3) (",
|
|
|
|
|
"eq? (car spec) 'rename)) `(,(list-ref spec 1) unquote (list-ref spec 2))) (else ",
|
|
|
|
|
"(error \"malformed export\"))))) (export (lambda (spec) (let ((slot (collect spec)",
|
|
|
|
|
")) (library-export (car slot) (cdr slot)))))) (for-each export (cdr form))))) (l",
|
|
|
|
|
"et () (make-library '(picrin base)) (set-car! (dictionary-ref *libraries* (mangl",
|
|
|
|
|
"e '(picrin base))) default-environment) (let ((export-keywords (lambda (keywords",
|
|
|
|
|
") (let ((env (library-environment '(picrin base))) (exports (library-exports '(p",
|
|
|
|
|
"icrin base)))) (for-each (lambda (keyword) (dictionary-set! exports keyword keyw",
|
|
|
|
|
"ord)) keywords))))) (export-keywords '(define lambda quote set! if begin define-",
|
|
|
|
|
"macro let let* letrec letrec* let-values let*-values define-values quasiquote un",
|
|
|
|
|
"quote unquote-splicing and or cond case else => do when unless parameterize defi",
|
|
|
|
|
"ne-syntax syntax-quote syntax-unquote syntax-quasiquote syntax-unquote-splicing ",
|
|
|
|
|
"let-syntax letrec-syntax syntax-error)) (export-keywords '(features eq? eqv? equ",
|
|
|
|
|
"al? not boolean? boolean=? pair? cons car cdr null? set-car! set-cdr! caar cadr ",
|
|
|
|
|
"cdar cddr list? make-list list length append reverse list-tail list-ref list-set",
|
|
|
|
|
"! list-copy map for-each memq memv member assq assv assoc current-input-port cur",
|
|
|
|
|
"rent-output-port current-error-port port? input-port? output-port? port-open? cl",
|
|
|
|
|
"ose-port eof-object? eof-object read-u8 peek-u8 read-bytevector! write-u8 write-",
|
|
|
|
|
"bytevector flush-output-port open-input-bytevector open-output-bytevector get-ou",
|
|
|
|
|
"tput-bytevector number? exact? inexact? inexact exact = < > <= >= + - * / number",
|
|
|
|
|
"->string string->number procedure? apply symbol? symbol=? symbol->string string-",
|
|
|
|
|
">symbol make-identifier identifier? identifier=? identifier-base identifier-envi",
|
|
|
|
|
"ronment vector? vector make-vector vector-length vector-ref vector-set! vector-c",
|
|
|
|
|
"opy! vector-copy vector-append vector-fill! vector-map vector-for-each list->vec",
|
|
|
|
|
"tor vector->list string->vector vector->string bytevector? bytevector make-bytev",
|
|
|
|
|
"ector bytevector-length bytevector-u8-ref bytevector-u8-set! bytevector-copy! by",
|
|
|
|
|
"tevector-copy bytevector-append bytevector->list list->bytevector call-with-curr",
|
|
|
|
|
"ent-continuation call/cc values call-with-values char? char->integer integer->ch",
|
|
|
|
|
"ar char=? char<? char>? char<=? char>=? current-exception-handlers with-exceptio",
|
|
|
|
|
"n-handler raise raise-continuable error error-object? error-object-message error",
|
|
|
|
|
"-object-irritants error-object-type string? string make-string string-length str",
|
|
|
|
|
"ing-ref string-set! string-copy string-copy! string-fill! string-append string-m",
|
|
|
|
|
"ap string-for-each list->string string->list string=? string<? string>? string<=",
|
|
|
|
|
"? string>=? make-parameter with-dynamic-environment read make-dictionary diction",
|
|
|
|
|
"ary? dictionary dictionary-has? dictionary-ref dictionary-set! dictionary-delete",
|
|
|
|
|
"! dictionary-size dictionary-map dictionary-for-each dictionary->alist alist->di",
|
|
|
|
|
"ctionary dictionary->plist plist->dictionary make-record record? record-type rec",
|
|
|
|
|
"ord-datum default-environment make-environment find-identifier set-identifier! e",
|
|
|
|
|
"val compile add-macro! make-ephemeron-table write write-simple write-shared disp",
|
|
|
|
|
"lay)) (export-keywords '(find-library make-library current-library))) (set! eval",
|
|
|
|
|
" (let ((e eval)) (lambda (expr . lib) (let ((lib (if (null? lib) (current-librar",
|
|
|
|
|
"y) (car lib)))) (e expr (library-environment lib)))))) (make-library '(picrin us",
|
|
|
|
|
"er)) (current-library '(picrin user))) ",
|
|
|
|
|
|
|
|
|
|
};
|
|
|
|
|
#endif
|
|
|
|
@ -270,7 +412,7 @@ static const char boot_library_rom[][80] = {
|
|
|
|
|
void
|
|
|
|
|
pic_boot(pic_state *pic)
|
|
|
|
|
{
|
|
|
|
|
pic_load_cstr(pic, &boot_rom[0][0]);
|
|
|
|
|
pic_call(pic, pic_compile(pic, pic_read_cstr(pic, &boot_rom[0][0])), 0);
|
|
|
|
|
#if PIC_USE_LIBRARY
|
|
|
|
|
pic_load_cstr(pic, &boot_library_rom[0][0]);
|
|
|
|
|
#endif
|
|
|
|
|