diff --git a/Makefile b/Makefile index 125d5dd3..e72145aa 100644 --- a/Makefile +++ b/Makefile @@ -78,7 +78,7 @@ src/init_contrib.c: # $(CC) -shared $(CFLAGS) -o $@ $(LIBPICRIN_OBJS) $(LDFLAGS) lib/ext/boot.c: piclib/boot.scm piclib/library.scm - bin/picrin-bootstrap tools/mkboot.scm > lib/ext/boot.c + cat piclib/boot.scm piclib/library.scm | bin/picrin-bootstrap tools/mkboot.scm > lib/ext/boot.c $(LIBPICRIN_OBJS) $(PICRIN_OBJS) $(CONTRIB_OBJS): lib/include/picrin.h lib/include/picrin/*.h lib/khash.h lib/object.h lib/state.h lib/vm.h diff --git a/bin/picrin-bootstrap b/bin/picrin-bootstrap index 6859c6af..0b46e5ca 100755 Binary files a/bin/picrin-bootstrap and b/bin/picrin-bootstrap differ diff --git a/lib/ext/boot.c b/lib/ext/boot.c index 9b9ffee3..1b564b6d 100644 --- a/lib/ext/boot.c +++ b/lib/ext/boot.c @@ -2,409 +2,489 @@ #include "picrin/extra.h" static const char boot_rom[][80] = { -"(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 ()))))))))))))))))))))))))))))))))))", -")))))))))))))))))))))))))) ", +"(core#begin (core#define transformer (core#lambda (.f.2252) (core#lambda (.form.", +"2253 .env.2254) ((core#lambda (.ephemeron1.2255 .ephemeron2.2256) ((core#lambda ", +"(.wrap.2257 .unwrap.2258 .walk.2259) (core#begin (core#set! .wrap.2257 (core#lam", +"bda (.var1.2260) ((core#lambda (.var2.2261) (core#if .var2.2261 (cdr .var2.2261)", +" ((core#lambda (.var2.2262) (core#begin (.ephemeron1.2255 .var1.2260 .var2.2262)", +" (core#begin (.ephemeron2.2256 .var2.2262 .var1.2260) .var2.2262))) (make-identi", +"fier .var1.2260 .env.2254)))) (.ephemeron1.2255 .var1.2260)))) (core#begin (core", +"#set! .unwrap.2258 (core#lambda (.var2.2263) ((core#lambda (.var1.2264) (core#if", +" .var1.2264 (cdr .var1.2264) .var2.2263)) (.ephemeron2.2256 .var2.2263)))) (core", +"#begin (core#set! .walk.2259 (core#lambda (.f.2265 .form.2266) (core#if (identif", +"ier? .form.2266) (.f.2265 .form.2266) (core#if (pair? .form.2266) (cons (.walk.2", +"259 .f.2265 (car .form.2266)) (.walk.2259 .f.2265 (cdr .form.2266))) (core#if (v", +"ector? .form.2266) (list->vector (.walk.2259 .f.2265 (vector->list .form.2266)))", +" .form.2266))))) ((core#lambda (.form.2267) (.walk.2259 .unwrap.2258 (apply .f.2", +"252 (.walk.2259 .wrap.2257 .form.2267)))) (cdr .form.2253)))))) #undefined #unde", +"fined #undefined)) (make-ephemeron-table) (make-ephemeron-table))))) ((core#lamb", +"da () (core#begin (core#define .define-transformer.2268 (core#lambda (.name.2288", +" .transformer.2289) (add-macro! .name.2288 .transformer.2289))) (core#begin (cor", +"e#define .the.2269 (core#lambda (.var.2290) (make-identifier .var.2290 default-e", +"nvironment))) (core#begin (core#define .the-core-define.2270 (.the.2269 (core#qu", +"ote core#define))) (core#begin (core#define .the-core-lambda.2271 (.the.2269 (co", +"re#quote core#lambda))) (core#begin (core#define .the-core-begin.2272 (.the.2269", +" (core#quote core#begin))) (core#begin (core#define .the-core-quote.2273 (.the.2", +"269 (core#quote core#quote))) (core#begin (core#define .the-core-set!.2274 (.the", +".2269 (core#quote core#set!))) (core#begin (core#define .the-core-if.2275 (.the.", +"2269 (core#quote core#if))) (core#begin (core#define .the-core-define-macro.2276", +" (.the.2269 (core#quote core#define-macro))) (core#begin (core#define .the-defin", +"e.2277 (.the.2269 (core#quote define))) (core#begin (core#define .the-lambda.227", +"8 (.the.2269 (core#quote lambda))) (core#begin (core#define .the-begin.2279 (.th", +"e.2269 (core#quote begin))) (core#begin (core#define .the-quote.2280 (.the.2269 ", +"(core#quote quote))) (core#begin (core#define .the-set!.2281 (.the.2269 (core#qu", +"ote set!))) (core#begin (core#define .the-if.2282 (.the.2269 (core#quote if))) (", +"core#begin (core#define .the-define-macro.2283 (.the.2269 (core#quote define-mac", +"ro))) (core#begin (.define-transformer.2268 (core#quote quote) (core#lambda (.fo", +"rm.2291 .env.2292) (core#if (= (length .form.2291) 2) (cons .the-core-quote.2273", +" (cons (cadr .form.2291) (core#quote ()))) (error \"malformed quote\" .form.2291))", +")) (core#begin (.define-transformer.2268 (core#quote if) (core#lambda (.form.229", +"3 .env.2294) ((core#lambda (.len.2295) (core#if (= .len.2295 3) (append .form.22", +"93 (cons (core#quote #undefined) (core#quote ()))) (core#if (= .len.2295 4) (con", +"s .the-core-if.2275 (cdr .form.2293)) (error \"malformed if\" .form.2293)))) (leng", +"th .form.2293)))) (core#begin (.define-transformer.2268 (core#quote begin) (core", +"#lambda (.form.2296 .env.2297) ((core#lambda (.len.2298) (core#if (= .len.2298 1", +") #undefined (core#if (= .len.2298 2) (cadr .form.2296) (core#if (= .len.2298 3)", +" (cons .the-core-begin.2272 (cdr .form.2296)) (cons .the-core-begin.2272 (cons (", +"cadr .form.2296) (cons (cons .the-begin.2279 (cddr .form.2296)) (core#quote ()))", +")))))) (length .form.2296)))) (core#begin (.define-transformer.2268 (core#quote ", +"set!) (core#lambda (.form.2299 .env.2300) (core#if (core#if (= (length .form.229", +"9) 3) (identifier? (cadr .form.2299)) #f) (cons .the-core-set!.2274 (cdr .form.2", +"299)) (error \"malformed set!\" .form.2299)))) (core#begin (core#define .check-for", +"mal.2284 (core#lambda (.formal.2301) ((core#lambda (.it.2302) (core#if .it.2302 ", +".it.2302 ((core#lambda (.it.2303) (core#if .it.2303 .it.2303 ((core#lambda (.it.", +"2304) (core#if .it.2304 .it.2304 #f)) (core#if (pair? .formal.2301) (core#if (id", +"entifier? (car .formal.2301)) (.check-formal.2284 (cdr .formal.2301)) #f) #f))))", +" (identifier? .formal.2301)))) (null? .formal.2301)))) (core#begin (.define-tran", +"sformer.2268 (core#quote lambda) (core#lambda (.form.2305 .env.2306) (core#if (=", +" (length .form.2305) 1) (error \"malformed lambda\" .form.2305) (core#if (.check-f", +"ormal.2284 (cadr .form.2305)) (cons .the-core-lambda.2271 (cons (cadr .form.2305", +") (cons (cons .the-begin.2279 (cddr .form.2305)) (core#quote ())))) (error \"malf", +"ormed lambda\" .form.2305))))) (core#begin (.define-transformer.2268 (core#quote ", +"define) (core#lambda (.form.2307 .env.2308) ((core#lambda (.len.2309) (core#if (", +"= .len.2309 1) (error \"malformed define\" .form.2307) ((core#lambda (.formal.2310", +") (core#if (identifier? .formal.2310) (core#if (= .len.2309 3) (cons .the-core-d", +"efine.2270 (cdr .form.2307)) (error \"malformed define\" .form.2307)) (core#if (pa", +"ir? .formal.2310) (cons .the-define.2277 (cons (car .formal.2310) (cons (cons .t", +"he-lambda.2278 (cons (cdr .formal.2310) (cddr .form.2307))) (core#quote ())))) (", +"error \"define: binding to non-varaible object\" .form.2307)))) (cadr .form.2307))", +")) (length .form.2307)))) (core#begin (.define-transformer.2268 (core#quote defi", +"ne-macro) (core#lambda (.form.2311 .env.2312) (core#if (= (length .form.2311) 3)", +" (core#if (identifier? (cadr .form.2311)) (cons .the-core-define-macro.2276 (cdr", +" .form.2311)) (error \"define-macro: binding to non-variable object\" .form.2311))", +" (error \"malformed define-macro\" .form.2311)))) (core#begin (.define-transformer", +".2268 (core#quote syntax-error) (core#lambda (.form.2313 ._.2314) (apply error (", +"cdr .form.2313)))) (core#begin #undefined (core#begin (.define-transformer.2268 ", +"(core#quote else) (core#lambda ._.2315 (error \"invalid use of auxiliary syntax\" ", +"(core#quote else)))) (core#begin (.define-transformer.2268 (core#quote =>) (core", +"#lambda ._.2316 (error \"invalid use of auxiliary syntax\" (core#quote =>)))) (cor", +"e#begin (.define-transformer.2268 (core#quote unquote) (core#lambda ._.2317 (err", +"or \"invalid use of auxiliary syntax\" (core#quote unquote)))) (core#begin (.defin", +"e-transformer.2268 (core#quote unquote-splicing) (core#lambda ._.2318 (error \"in", +"valid use of auxiliary syntax\" (core#quote unquote-splicing)))) (core#begin (.de", +"fine-transformer.2268 (core#quote syntax-unquote) (core#lambda ._.2319 (error \"i", +"nvalid use of auxiliary syntax\" (core#quote syntax-unquote)))) (core#begin (.def", +"ine-transformer.2268 (core#quote syntax-unquote-splicing) (core#lambda ._.2320 (", +"error \"invalid use of auxiliary syntax\" (core#quote syntax-unquote-splicing)))) ", +"(core#begin (.define-transformer.2268 (core#quote let) (core#lambda (.form.2321 ", +".env.2322) (core#if (identifier? (cadr .form.2321)) ((core#lambda (.name.2323 .f", +"ormal.2324 .body.2325) (cons (cons .the-lambda.2278 (cons (core#quote ()) (cons ", +"(cons .the-define.2277 (cons (cons .name.2323 (map car .formal.2324)) .body.2325", +")) (cons (cons .name.2323 (map cadr .formal.2324)) (core#quote ()))))) (core#quo", +"te ()))) (car (cdr .form.2321)) (car (cdr (cdr .form.2321))) (cdr (cdr (cdr .for", +"m.2321)))) ((core#lambda (.formal.2326 .body.2327) (cons (cons .the-lambda.2278 ", +"(cons (map car .formal.2326) .body.2327)) (map cadr .formal.2326))) (car (cdr .f", +"orm.2321)) (cdr (cdr .form.2321)))))) (core#begin (.define-transformer.2268 (cor", +"e#quote and) (core#lambda (.form.2328 .env.2329) (core#if (null? (cdr .form.2328", +")) #t (core#if (null? (cddr .form.2328)) (cadr .form.2328) (cons .the-if.2282 (c", +"ons (cadr .form.2328) (cons (cons (.the.2269 (core#quote and)) (cddr .form.2328)", +") (cons (core#quote #f) (core#quote ()))))))))) (core#begin (.define-transformer", +".2268 (core#quote or) (core#lambda (.form.2330 .env.2331) (core#if (null? (cdr .", +"form.2330)) #f ((core#lambda (.tmp.2332) (cons (.the.2269 (core#quote let)) (con", +"s (cons (cons .tmp.2332 (cons (cadr .form.2330) (core#quote ()))) (core#quote ()", +")) (cons (cons .the-if.2282 (cons .tmp.2332 (cons .tmp.2332 (cons (cons (.the.22", +"69 (core#quote or)) (cddr .form.2330)) (core#quote ()))))) (core#quote ()))))) (", +"make-identifier (core#quote it) .env.2331))))) (core#begin (.define-transformer.", +"2268 (core#quote cond) (core#lambda (.form.2333 .env.2334) ((core#lambda (.claus", +"es.2335) (core#if (null? .clauses.2335) #undefined ((core#lambda (.clause.2336) ", +"(core#if (core#if (identifier? (car .clause.2336)) (identifier=? (.the.2269 (cor", +"e#quote else)) (make-identifier (car .clause.2336) .env.2334)) #f) (cons .the-be", +"gin.2279 (cdr .clause.2336)) (core#if (null? (cdr .clause.2336)) (cons (.the.226", +"9 (core#quote or)) (cons (car .clause.2336) (cons (cons (.the.2269 (core#quote c", +"ond)) (cdr .clauses.2335)) (core#quote ())))) (core#if (core#if (identifier? (ca", +"dr .clause.2336)) (identifier=? (.the.2269 (core#quote =>)) (make-identifier (ca", +"dr .clause.2336) .env.2334)) #f) ((core#lambda (.tmp.2337) (cons (.the.2269 (cor", +"e#quote let)) (cons (cons (cons .tmp.2337 (cons (car .clause.2336) (core#quote (", +")))) (core#quote ())) (cons (cons .the-if.2282 (cons .tmp.2337 (cons (cons (cadr", +" (cdr .clause.2336)) (cons .tmp.2337 (core#quote ()))) (cons (cons (.the.2269 (c", +"ore#quote cond)) (cddr .form.2333)) (core#quote ()))))) (core#quote ()))))) (mak", +"e-identifier (core#quote tmp) .env.2334)) (cons .the-if.2282 (cons (car .clause.", +"2336) (cons (cons .the-begin.2279 (cdr .clause.2336)) (cons (cons (.the.2269 (co", +"re#quote cond)) (cdr .clauses.2335)) (core#quote ()))))))))) (car .clauses.2335)", +"))) (cdr .form.2333)))) (core#begin (.define-transformer.2268 (core#quote quasiq", +"uote) (core#lambda (.form.2338 .env.2339) (core#begin (core#define .quasiquote?.", +"2340 (core#lambda (.form.2344) (core#if (pair? .form.2344) (core#if (identifier?", +" (car .form.2344)) (identifier=? (.the.2269 (core#quote quasiquote)) (make-ident", +"ifier (car .form.2344) .env.2339)) #f) #f))) (core#begin (core#define .unquote?.", +"2341 (core#lambda (.form.2345) (core#if (pair? .form.2345) (core#if (identifier?", +" (car .form.2345)) (identifier=? (.the.2269 (core#quote unquote)) (make-identifi", +"er (car .form.2345) .env.2339)) #f) #f))) (core#begin (core#define .unquote-spli", +"cing?.2342 (core#lambda (.form.2346) (core#if (pair? .form.2346) (core#if (pair?", +" (car .form.2346)) (core#if (identifier? (caar .form.2346)) (identifier=? (.the.", +"2269 (core#quote unquote-splicing)) (make-identifier (caar .form.2346) .env.2339", +")) #f) #f) #f))) (core#begin (core#define .qq.2343 (core#lambda (.depth.2347 .ex", +"pr.2348) (core#if (.unquote?.2341 .expr.2348) (core#if (= .depth.2347 1) (cadr .", +"expr.2348) (list (.the.2269 (core#quote list)) (list (.the.2269 (core#quote quot", +"e)) (.the.2269 (core#quote unquote))) (.qq.2343 (- .depth.2347 1) (car (cdr .exp", +"r.2348))))) (core#if (.unquote-splicing?.2342 .expr.2348) (core#if (= .depth.234", +"7 1) (list (.the.2269 (core#quote append)) (car (cdr (car .expr.2348))) (.qq.234", +"3 .depth.2347 (cdr .expr.2348))) (list (.the.2269 (core#quote cons)) (list (.the", +".2269 (core#quote list)) (list (.the.2269 (core#quote quote)) (.the.2269 (core#q", +"uote unquote-splicing))) (.qq.2343 (- .depth.2347 1) (car (cdr (car .expr.2348))", +"))) (.qq.2343 .depth.2347 (cdr .expr.2348)))) (core#if (.quasiquote?.2340 .expr.", +"2348) (list (.the.2269 (core#quote list)) (list (.the.2269 (core#quote quote)) (", +".the.2269 (core#quote quasiquote))) (.qq.2343 (+ .depth.2347 1) (car (cdr .expr.", +"2348)))) (core#if (pair? .expr.2348) (list (.the.2269 (core#quote cons)) (.qq.23", +"43 .depth.2347 (car .expr.2348)) (.qq.2343 .depth.2347 (cdr .expr.2348))) (core#", +"if (vector? .expr.2348) (list (.the.2269 (core#quote list->vector)) (.qq.2343 .d", +"epth.2347 (vector->list .expr.2348))) (list (.the.2269 (core#quote quote)) .expr", +".2348)))))))) ((core#lambda (.x.2349) (.qq.2343 1 .x.2349)) (cadr .form.2338))))", +")))) (core#begin (.define-transformer.2268 (core#quote let*) (core#lambda (.form", +".2350 .env.2351) ((core#lambda (.bindings.2352 .body.2353) (core#if (null? .bind", +"ings.2352) (cons (.the.2269 (core#quote let)) (cons (core#quote ()) .body.2353))", +" (cons (.the.2269 (core#quote let)) (cons (cons (cons (car (car .bindings.2352))", +" (cdr (car .bindings.2352))) (core#quote ())) (cons (cons (.the.2269 (core#quote", +" let*)) (cons (cdr .bindings.2352) .body.2353)) (core#quote ())))))) (car (cdr .", +"form.2350)) (cdr (cdr .form.2350))))) (core#begin (.define-transformer.2268 (cor", +"e#quote letrec) (core#lambda (.form.2354 .env.2355) (cons (.the.2269 (core#quote", +" letrec*)) (cdr .form.2354)))) (core#begin (.define-transformer.2268 (core#quote", +" letrec*) (core#lambda (.form.2356 .env.2357) ((core#lambda (.bindings.2358 .bod", +"y.2359) ((core#lambda (.variables.2360 .initials.2361) (cons (.the.2269 (core#qu", +"ote let)) (cons .variables.2360 (append .initials.2361 (append .body.2359 (core#", +"quote ())))))) (map (core#lambda (.v.2362) (cons .v.2362 (cons (core#quote #unde", +"fined) (core#quote ())))) (map car .bindings.2358)) (map (core#lambda (.v.2363) ", +"(cons (.the.2269 (core#quote set!)) (append .v.2363 (core#quote ())))) .bindings", +".2358))) (car (cdr .form.2356)) (cdr (cdr .form.2356))))) (core#begin (.define-t", +"ransformer.2268 (core#quote let-values) (core#lambda (.form.2364 .env.2365) (con", +"s (.the.2269 (core#quote let*-values)) (append (cdr .form.2364) (core#quote ()))", +"))) (core#begin (.define-transformer.2268 (core#quote let*-values) (core#lambda ", +"(.form.2366 .env.2367) ((core#lambda (.formal.2368 .body.2369) (core#if (null? .", +"formal.2368) (cons (.the.2269 (core#quote let)) (cons (core#quote ()) (append .b", +"ody.2369 (core#quote ())))) (cons (.the.2269 (core#quote call-with-values)) (con", +"s (cons .the-lambda.2278 (cons (core#quote ()) (append (cdr (car .formal.2368)) ", +"(core#quote ())))) (cons (cons (.the.2269 (core#quote lambda)) (cons (append (ca", +"r (car .formal.2368)) (core#quote ())) (cons (cons (.the.2269 (core#quote let*-v", +"alues)) (cons (append (cdr .formal.2368) (core#quote ())) (append .body.2369 (co", +"re#quote ())))) (core#quote ())))) (core#quote ())))))) (car (cdr .form.2366)) (", +"cdr (cdr .form.2366))))) (core#begin (.define-transformer.2268 (core#quote defin", +"e-values) (core#lambda (.form.2370 .env.2371) ((core#lambda (.formal.2372 .body.", +"2373) ((core#lambda (.arguments.2374) (cons .the-begin.2279 (append ((core#lambd", +"a () (core#begin (core#define .loop.2375 (core#lambda (.formal.2376) (core#if (p", +"air? .formal.2376) (cons (cons .the-define.2277 (cons (car .formal.2376) (cons (", +"core#quote #undefined) (core#quote ())))) (append (.loop.2375 (cdr .formal.2376)", +") (core#quote ()))) (core#if (identifier? .formal.2376) (cons (cons .the-define.", +"2277 (cons .formal.2376 (cons (core#quote #undefined) (core#quote ())))) (core#q", +"uote ())) (core#quote ()))))) (.loop.2375 .formal.2372)))) (cons (cons (.the.226", +"9 (core#quote call-with-values)) (cons (cons .the-lambda.2278 (cons (core#quote ", +"()) (append .body.2373 (core#quote ())))) (cons (cons .the-lambda.2278 (cons .ar", +"guments.2374 (append ((core#lambda () (core#begin (core#define .loop.2377 (core#", +"lambda (.formal.2378 .args.2379) (core#if (pair? .formal.2378) (cons (cons .the-", +"set!.2281 (cons (car .formal.2378) (cons (cons (.the.2269 (core#quote car)) (con", +"s .args.2379 (core#quote ()))) (core#quote ())))) (append (.loop.2377 (cdr .form", +"al.2378) (cons (.the.2269 (core#quote cdr)) (cons .args.2379 (core#quote ())))) ", +"(core#quote ()))) (core#if (identifier? .formal.2378) (cons (cons .the-set!.2281", +" (cons .formal.2378 (cons .args.2379 (core#quote ())))) (core#quote ())) (core#q", +"uote ()))))) (.loop.2377 .formal.2372 .arguments.2374)))) (core#quote ())))) (co", +"re#quote ())))) (core#quote ()))))) (make-identifier (core#quote arguments) .env", +".2371))) (car (cdr .form.2370)) (cdr (cdr .form.2370))))) (core#begin (.define-t", +"ransformer.2268 (core#quote do) (core#lambda (.form.2380 .env.2381) ((core#lambd", +"a (.bindings.2382 .test.2383 .cleanup.2384 .body.2385) ((core#lambda (.loop.2386", +") (cons (.the.2269 (core#quote let)) (cons .loop.2386 (cons (map (core#lambda (.", +"x.2387) (cons (car .x.2387) (cons (cadr .x.2387) (core#quote ())))) .bindings.23", +"82) (cons (cons .the-if.2282 (cons .test.2383 (cons (cons .the-begin.2279 .clean", +"up.2384) (cons (cons .the-begin.2279 (append .body.2385 (cons (cons .loop.2386 (", +"map (core#lambda (.x.2388) (core#if (null? (cdr (cdr .x.2388))) (car .x.2388) (c", +"ar (cdr (cdr .x.2388))))) .bindings.2382)) (core#quote ())))) (core#quote ()))))", +") (core#quote ())))))) (make-identifier (core#quote loop) .env.2381))) (car (cdr", +" .form.2380)) (car (car (cdr (cdr .form.2380)))) (cdr (car (cdr (cdr .form.2380)", +"))) (cdr (cdr (cdr .form.2380)))))) (core#begin (.define-transformer.2268 (core#", +"quote when) (core#lambda (.form.2389 .env.2390) ((core#lambda (.test.2391 .body.", +"2392) (cons .the-if.2282 (cons .test.2391 (cons (cons .the-begin.2279 (append .b", +"ody.2392 (core#quote ()))) (cons (core#quote #undefined) (core#quote ())))))) (c", +"ar (cdr .form.2389)) (cdr (cdr .form.2389))))) (core#begin (.define-transformer.", +"2268 (core#quote unless) (core#lambda (.form.2393 .env.2394) ((core#lambda (.tes", +"t.2395 .body.2396) (cons .the-if.2282 (cons .test.2395 (cons (core#quote #undefi", +"ned) (cons (cons .the-begin.2279 (append .body.2396 (core#quote ()))) (core#quot", +"e ())))))) (car (cdr .form.2393)) (cdr (cdr .form.2393))))) (core#begin (.define", +"-transformer.2268 (core#quote case) (core#lambda (.form.2397 .env.2398) ((core#l", +"ambda (.key.2399 .clauses.2400) ((core#lambda (.the-key.2401) (cons (.the.2269 (", +"core#quote let)) (cons (cons (cons .the-key.2401 (cons .key.2399 (core#quote ())", +")) (core#quote ())) (cons ((core#lambda () (core#begin (core#define .loop.2402 (", +"core#lambda (.clauses.2403) (core#if (null? .clauses.2403) #undefined ((core#lam", +"bda (.clause.2404) (cons .the-if.2282 (cons (core#if (core#if (identifier? (car ", +".clause.2404)) (identifier=? (.the.2269 (core#quote else)) (make-identifier (car", +" .clause.2404) .env.2398)) #f) #t (cons (.the.2269 (core#quote or)) (append (map", +" (core#lambda (.x.2405) (cons (.the.2269 (core#quote eqv?)) (cons .the-key.2401 ", +"(cons (cons .the-quote.2280 (cons .x.2405 (core#quote ()))) (core#quote ()))))) ", +"(car .clause.2404)) (core#quote ())))) (cons (core#if (core#if (identifier? (cad", +"r .clause.2404)) (identifier=? (.the.2269 (core#quote =>)) (make-identifier (cad", +"r .clause.2404) .env.2398)) #f) (cons (car (cdr (cdr .clause.2404))) (cons .the-", +"key.2401 (core#quote ()))) (cons .the-begin.2279 (append (cdr .clause.2404) (cor", +"e#quote ())))) (cons (.loop.2402 (cdr .clauses.2403)) (core#quote ())))))) (car ", +".clauses.2403))))) (.loop.2402 .clauses.2400)))) (core#quote ()))))) (make-ident", +"ifier (core#quote key) .env.2398))) (car (cdr .form.2397)) (cdr (cdr .form.2397)", +")))) (core#begin (.define-transformer.2268 (core#quote parameterize) (core#lambd", +"a (.form.2406 .env.2407) ((core#lambda (.formal.2408 .body.2409) (cons (.the.226", +"9 (core#quote with-dynamic-environment)) (cons (cons (.the.2269 (core#quote list", +")) (append (map (core#lambda (.x.2410) (cons (.the.2269 (core#quote cons)) (cons", +" (car .x.2410) (cons (cadr .x.2410) (core#quote ()))))) .formal.2408) (core#quot", +"e ()))) (cons (cons .the-lambda.2278 (cons (core#quote ()) (append .body.2409 (c", +"ore#quote ())))) (core#quote ()))))) (car (cdr .form.2406)) (cdr (cdr .form.2406", +"))))) (core#begin (.define-transformer.2268 (core#quote syntax-quote) (core#lamb", +"da (.form.2411 .env.2412) ((core#lambda (.renames.2413) ((core#lambda (.rename.2", +"414 .walk.2415) (core#begin (core#set! .rename.2414 (core#lambda (.var.2416) ((c", +"ore#lambda (.x.2417) (core#if .x.2417 (cadr .x.2417) (core#begin (core#set! .ren", +"ames.2413 (cons (cons .var.2416 (cons (make-identifier .var.2416 .env.2412) (con", +"s (cons (.the.2269 (core#quote make-identifier)) (cons (cons (core#quote quote) ", +"(cons .var.2416 (core#quote ()))) (cons (cons (core#quote quote) (cons .env.2412", +" (core#quote ()))) (core#quote ())))) (core#quote ())))) .renames.2413)) (.renam", +"e.2414 .var.2416)))) (assq .var.2416 .renames.2413)))) (core#begin (core#set! .w", +"alk.2415 (core#lambda (.f.2418 .form.2419) (core#if (identifier? .form.2419) (.f", +".2418 .form.2419) (core#if (pair? .form.2419) (cons (.the.2269 (core#quote cons)", +") (cons (cons (core#quote walk) (cons (core#quote f) (cons (cons (core#quote car", +") (cons (core#quote 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.2419) (cons (.the.2269 (core#quote list->vector)) (cons (cons (core#quote", +" walk) (cons (core#quote f) (cons (cons (core#quote vector->list) (cons (core#qu", +"ote form) (core#quote ()))) (core#quote ())))) (core#quote ()))) (cons (.the.226", +"9 (core#quote quote)) (cons .form.2419 (core#quote ())))))))) ((core#lambda (.fo", +"rm.2420) (cons (.the.2269 (core#quote let)) (cons (map cdr .renames.2413) (cons ", +".form.2420 (core#quote ()))))) (.walk.2415 .rename.2414 (cadr .form.2411)))))) #", +"undefined #undefined)) (core#quote ())))) (core#begin (.define-transformer.2268 ", +"(core#quote syntax-quasiquote) (core#lambda (.form.2421 .env.2422) ((core#lambda", +" (.renames.2423) ((core#lambda (.rename.2424) (core#begin (core#set! .rename.242", +"4 (core#lambda (.var.2429) ((core#lambda (.x.2430) (core#if .x.2430 (cadr .x.243", +"0) (core#begin (core#set! .renames.2423 (cons (cons .var.2429 (cons (make-identi", +"fier .var.2429 .env.2422) (cons (cons (.the.2269 (core#quote make-identifier)) (", +"cons (cons (core#quote quote) (cons .var.2429 (core#quote ()))) (cons (cons (cor", +"e#quote quote) (cons .env.2422 (core#quote ()))) (core#quote ())))) (core#quote ", +"())))) .renames.2423)) (.rename.2424 .var.2429)))) (assq .var.2429 .renames.2423", +")))) (core#begin (core#define .syntax-quasiquote?.2425 (core#lambda (.form.2431)", +" (core#if (pair? .form.2431) (core#if (identifier? (car .form.2431)) (identifier", +"=? (.the.2269 (core#quote syntax-quasiquote)) (make-identifier (car .form.2431) ", +".env.2422)) #f) #f))) (core#begin (core#define .syntax-unquote?.2426 (core#lambd", +"a (.form.2432) (core#if (pair? .form.2432) (core#if (identifier? (car .form.2432", +")) (identifier=? (.the.2269 (core#quote syntax-unquote)) (make-identifier (car .", +"form.2432) .env.2422)) #f) #f))) (core#begin (core#define .syntax-unquote-splici", +"ng?.2427 (core#lambda (.form.2433) (core#if (pair? .form.2433) (core#if (pair? (", +"car .form.2433)) (core#if (identifier? (caar .form.2433)) (identifier=? (.the.22", +"69 (core#quote syntax-unquote-splicing)) (make-identifier (caar .form.2433) .env", +".2422)) #f) #f) #f))) (core#begin (core#define .qq.2428 (core#lambda (.depth.243", +"4 .expr.2435) (core#if (.syntax-unquote?.2426 .expr.2435) (core#if (= .depth.243", +"4 1) (car (cdr .expr.2435)) (list (.the.2269 (core#quote list)) (list (.the.2269", +" (core#quote quote)) (.the.2269 (core#quote syntax-unquote))) (.qq.2428 (- .dept", +"h.2434 1) (car (cdr .expr.2435))))) (core#if (.syntax-unquote-splicing?.2427 .ex", +"pr.2435) (core#if (= .depth.2434 1) (list (.the.2269 (core#quote append)) (car (", +"cdr (car .expr.2435))) (.qq.2428 .depth.2434 (cdr .expr.2435))) (list (.the.2269", +" (core#quote cons)) (list (.the.2269 (core#quote list)) (list (.the.2269 (core#q", +"uote quote)) (.the.2269 (core#quote syntax-unquote-splicing))) (.qq.2428 (- .dep", +"th.2434 1) (car (cdr (car .expr.2435))))) (.qq.2428 .depth.2434 (cdr .expr.2435)", +"))) (core#if (.syntax-quasiquote?.2425 .expr.2435) (list (.the.2269 (core#quote ", +"list)) (list (.the.2269 (core#quote quote)) (.the.2269 (core#quote quasiquote)))", +" (.qq.2428 (+ .depth.2434 1) (car (cdr .expr.2435)))) (core#if (pair? .expr.2435", +") (list (.the.2269 (core#quote cons)) (.qq.2428 .depth.2434 (car .expr.2435)) (.", +"qq.2428 .depth.2434 (cdr .expr.2435))) (core#if (vector? .expr.2435) (list (.the", +".2269 (core#quote list->vector)) (.qq.2428 .depth.2434 (vector->list .expr.2435)", +")) (core#if (identifier? .expr.2435) (.rename.2424 .expr.2435) (list (.the.2269 ", +"(core#quote quote)) .expr.2435))))))))) ((core#lambda (.body.2436) (cons (.the.2", +"269 (core#quote let)) (cons (map cdr .renames.2423) (cons .body.2436 (core#quote", +" ()))))) (.qq.2428 1 (cadr .form.2421))))))))) #undefined)) (core#quote ())))) (", +"core#begin (.define-transformer.2268 (core#quote define-syntax) (core#lambda (.f", +"orm.2437 .env.2438) ((core#lambda (.formal.2439 .body.2440) (core#if (pair? .for", +"mal.2439) (cons (.the.2269 (core#quote define-syntax)) (cons (car .formal.2439) ", +"(cons (cons .the-lambda.2278 (cons (cdr .formal.2439) (append .body.2440 (core#q", +"uote ())))) (core#quote ())))) (cons .the-define-macro.2283 (cons .formal.2439 (", +"cons (cons (.the.2269 (core#quote transformer)) (cons (cons .the-begin.2279 (app", +"end .body.2440 (core#quote ()))) (core#quote ()))) (core#quote ())))))) (car (cd", +"r .form.2437)) (cdr (cdr .form.2437))))) (core#begin (.define-transformer.2268 (", +"core#quote letrec-syntax) (core#lambda (.form.2441 .env.2442) ((core#lambda (.fo", +"rmal.2443 .body.2444) (cons (core#quote let) (cons (core#quote ()) (append (map ", +"(core#lambda (.x.2445) (cons (.the.2269 (core#quote define-syntax)) (cons (car .", +"x.2445) (cons (cadr .x.2445) (core#quote ()))))) .formal.2443) (append .body.244", +"4 (core#quote ())))))) (car (cdr .form.2441)) (cdr (cdr .form.2441))))) (.define", +"-transformer.2268 (core#quote let-syntax) (core#lambda (.form.2446 .env.2447) (c", +"ons (.the.2269 (core#quote letrec-syntax)) (append (cdr .form.2446) (core#quote ", +"()))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))", }; #if PIC_USE_LIBRARY static const char boot_library_rom[][80] = { -"(define (mangle name) (when (null? name) (error \"library name should be a list o", -"f at least one symbols\" name)) (define (->string n) (cond ((symbol? n) (let ((st", -"r (symbol->string n))) (string-for-each (lambda (c) (when (or (char=? c #\\.) (ch", -"ar=? c #\\:)) (error \"elements of library name may not contain '.' or ':'\" n))) s", -"tr) str)) ((and (number? n) (exact? n) (<= 0 n)) (number->string n)) (else (erro", -"r \"symbol or non-negative integer is required\" n)))) (define (join strs delim) (", -"let loop ((res (car strs)) (strs (cdr strs))) (if (null? strs) res (loop (string", -"-append res delim (car strs)) (cdr strs))))) (if (symbol? name) name (string->sy", -"mbol (join (map ->string name) \".\")))) (define current-library (make-parameter '", -"(picrin base) mangle)) (define *libraries* (make-dictionary)) (define (find-libr", -"ary name) (dictionary-has? *libraries* (mangle name))) (define (make-library nam", -"e) (let ((name (mangle name))) (let ((env (make-environment (string->symbol (str", -"ing-append (symbol->string name) \":\")))) (exports (make-dictionary))) (set-ident", -"ifier! 'define-library 'define-library env) (set-identifier! 'import 'import env", -") (set-identifier! 'export 'export env) (set-identifier! 'cond-expand 'cond-expa", -"nd env) (dictionary-set! *libraries* name `(,env unquote exports))))) (define (l", -"ibrary-environment name) (car (dictionary-ref *libraries* (mangle name)))) (defi", -"ne (library-exports name) (cdr (dictionary-ref *libraries* (mangle name)))) (def", -"ine (library-import name sym alias) (let ((uid (dictionary-ref (library-exports ", -"name) sym))) (let ((env (library-environment (current-library)))) (set-identifie", -"r! alias uid env)))) (define (library-export sym alias) (let ((env (library-envi", -"ronment (current-library))) (exports (library-exports (current-library)))) (dict", -"ionary-set! exports alias (find-identifier sym env)))) (define-macro define-libr", -"ary (lambda (form _) (let ((name (cadr form)) (body (cddr form))) (or (find-libr", -"ary name) (make-library name)) (parameterize ((current-library name)) (for-each ", -"(lambda (expr) (eval expr name)) body))))) (define-macro cond-expand (lambda (fo", -"rm _) (letrec ((test (lambda (form) (or (eq? form 'else) (and (symbol? form) (me", -"mq form (features))) (and (pair? form) (case (car form) ((library) (find-library", -" (cadr form))) ((not) (not (test (cadr form)))) ((and) (let loop ((form (cdr for", -"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)) `(,(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>=? 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>=? 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))) ", +"(core#begin (core#define mangle (core#lambda (.name.2448) (core#begin (core#if (", +"null? .name.2448) (error \"library name should be a list of at least one symbols\"", +" .name.2448) #undefined) (core#begin (core#define .->string.2449 (core#lambda (.", +"n.2451) (core#if (symbol? .n.2451) ((core#lambda (.str.2452) (core#begin (string", +"-for-each (core#lambda (.c.2453) (core#if ((core#lambda (.it.2454) (core#if .it.", +"2454 .it.2454 ((core#lambda (.it.2455) (core#if .it.2455 .it.2455 #f)) (char=? .", +"c.2453 #\\:)))) (char=? .c.2453 #\\.)) (error \"elements of library name may not co", +"ntain '.' or ':'\" .n.2451) #undefined)) .str.2452) .str.2452)) (symbol->string .", +"n.2451)) (core#if (core#if (number? .n.2451) (core#if (exact? .n.2451) (<= 0 .n.", +"2451) #f) #f) (number->string .n.2451) (error \"symbol or non-negative integer is", +" required\" .n.2451))))) (core#begin (core#define .join.2450 (core#lambda (.strs.", +"2456 .delim.2457) ((core#lambda () (core#begin (core#define .loop.2458 (core#lam", +"bda (.res.2459 .strs.2460) (core#if (null? .strs.2460) .res.2459 (.loop.2458 (st", +"ring-append .res.2459 .delim.2457 (car .strs.2460)) (cdr .strs.2460))))) (.loop.", +"2458 (car .strs.2456) (cdr .strs.2456))))))) (core#if (symbol? .name.2448) .name", +".2448 (string->symbol (.join.2450 (map .->string.2449 .name.2448) \".\")))))))) (c", +"ore#begin (core#define current-library (make-parameter (core#quote (picrin base)", +") mangle)) (core#begin (core#define *libraries* (make-dictionary)) (core#begin (", +"core#define find-library (core#lambda (.name.2461) (dictionary-has? *libraries* ", +"(mangle .name.2461)))) (core#begin (core#define make-library (core#lambda (.name", +".2462) ((core#lambda (.name.2463) ((core#lambda (.env.2464 .exports.2465) (core#", +"begin (set-identifier! (core#quote define-library) (core#quote define-library) .", +"env.2464) (core#begin (set-identifier! (core#quote import) (core#quote import) .", +"env.2464) (core#begin (set-identifier! (core#quote export) (core#quote export) .", +"env.2464) (core#begin (set-identifier! (core#quote cond-expand) (core#quote cond", +"-expand) .env.2464) (dictionary-set! *libraries* .name.2463 (cons .env.2464 .exp", +"orts.2465))))))) (make-environment (string->symbol (string-append (symbol->strin", +"g .name.2463) \":\"))) (make-dictionary))) (mangle .name.2462)))) (core#begin (cor", +"e#define library-environment (core#lambda (.name.2466) (car (dictionary-ref *lib", +"raries* (mangle .name.2466))))) (core#begin (core#define library-exports (core#l", +"ambda (.name.2467) (cdr (dictionary-ref *libraries* (mangle .name.2467))))) (cor", +"e#begin (core#define library-import (core#lambda (.name.2468 .sym.2469 .alias.24", +"70) ((core#lambda (.uid.2471) ((core#lambda (.env.2472) (set-identifier! .alias.", +"2470 .uid.2471 .env.2472)) (library-environment (current-library)))) (dictionary", +"-ref (library-exports .name.2468) .sym.2469)))) (core#begin (core#define library", +"-export (core#lambda (.sym.2473 .alias.2474) ((core#lambda (.env.2475 .exports.2", +"476) (dictionary-set! .exports.2476 .alias.2474 (find-identifier .sym.2473 .env.", +"2475))) (library-environment (current-library)) (library-exports (current-librar", +"y))))) (core#begin ((core#lambda (.define-transformer.2477) (core#begin (.define", +"-transformer.2477 (core#quote define-library) (core#lambda (.form.2478 ._.2479) ", +"((core#lambda (.name.2480 .body.2481) (core#begin ((core#lambda (.it.2482) (core", +"#if .it.2482 .it.2482 ((core#lambda (.it.2483) (core#if .it.2483 .it.2483 #f)) (", +"make-library .name.2480)))) (find-library .name.2480)) (with-dynamic-environment", +" (list (cons current-library .name.2480)) (core#lambda () (for-each (core#lambda", +" (.expr.2484) (eval .expr.2484 .name.2480)) .body.2481))))) (cadr .form.2478) (c", +"ddr .form.2478)))) (core#begin (.define-transformer.2477 (core#quote cond-expand", +") (core#lambda (.form.2485 ._.2486) ((core#lambda (.test.2487) (core#begin (core", +"#set! .test.2487 (core#lambda (.form.2488) ((core#lambda (.it.2489) (core#if .it", +".2489 .it.2489 ((core#lambda (.it.2490) (core#if .it.2490 .it.2490 ((core#lambda", +" (.it.2491) (core#if .it.2491 .it.2491 #f)) (core#if (pair? .form.2488) ((core#l", +"ambda (.key.2492) (core#if ((core#lambda (.it.2493) (core#if .it.2493 .it.2493 #", +"f)) (eqv? .key.2492 (core#quote library))) (find-library (cadr .form.2488)) (cor", +"e#if ((core#lambda (.it.2494) (core#if .it.2494 .it.2494 #f)) (eqv? .key.2492 (c", +"ore#quote not))) (not (.test.2487 (cadr .form.2488))) (core#if ((core#lambda (.i", +"t.2495) (core#if .it.2495 .it.2495 #f)) (eqv? .key.2492 (core#quote and))) ((cor", +"e#lambda () (core#begin (core#define .loop.2496 (core#lambda (.form.2497) ((core", +"#lambda (.it.2498) (core#if .it.2498 .it.2498 ((core#lambda (.it.2499) (core#if ", +".it.2499 .it.2499 #f)) (core#if (.test.2487 (car .form.2497)) (.loop.2496 (cdr .", +"form.2497)) #f)))) (null? .form.2497)))) (.loop.2496 (cdr .form.2488))))) (core#", +"if ((core#lambda (.it.2500) (core#if .it.2500 .it.2500 #f)) (eqv? .key.2492 (cor", +"e#quote or))) ((core#lambda () (core#begin (core#define .loop.2501 (core#lambda ", +"(.form.2502) (core#if (pair? .form.2502) ((core#lambda (.it.2503) (core#if .it.2", +"503 .it.2503 ((core#lambda (.it.2504) (core#if .it.2504 .it.2504 #f)) (.loop.250", +"1 (cdr .form.2502))))) (.test.2487 (car .form.2502))) #f))) (.loop.2501 (cdr .fo", +"rm.2488))))) (core#if #t #f #undefined)))))) (car .form.2488)) #f)))) (core#if (", +"symbol? .form.2488) (memq .form.2488 (features)) #f)))) (eq? .form.2488 (core#qu", +"ote else))))) ((core#lambda () (core#begin (core#define .loop.2505 (core#lambda ", +"(.clauses.2506) (core#if (null? .clauses.2506) #undefined (core#if (.test.2487 (", +"caar .clauses.2506)) (cons (make-identifier (core#quote begin) default-environme", +"nt) (append (cdar .clauses.2506) (core#quote ()))) (.loop.2505 (cdr .clauses.250", +"6)))))) (.loop.2505 (cdr .form.2485))))))) #undefined))) (core#begin (.define-tr", +"ansformer.2477 (core#quote import) (core#lambda (.form.2507 ._.2508) ((core#lamb", +"da (.caddr.2509 .prefix.2510 .getlib.2511) ((core#lambda (.extract.2512 .collect", +".2513) (core#begin (core#set! .extract.2512 (core#lambda (.spec.2514) ((core#lam", +"bda (.key.2515) (core#if ((core#lambda (.it.2516) (core#if .it.2516 .it.2516 ((c", +"ore#lambda (.it.2517) (core#if .it.2517 .it.2517 ((core#lambda (.it.2518) (core#", +"if .it.2518 .it.2518 ((core#lambda (.it.2519) (core#if .it.2519 .it.2519 #f)) (e", +"qv? .key.2515 (core#quote except))))) (eqv? .key.2515 (core#quote prefix))))) (e", +"qv? .key.2515 (core#quote rename))))) (eqv? .key.2515 (core#quote only))) (.extr", +"act.2512 (cadr .spec.2514)) (core#if #t (.getlib.2511 .spec.2514) #undefined))) ", +"(car .spec.2514)))) (core#begin (core#set! .collect.2513 (core#lambda (.spec.252", +"0) ((core#lambda (.key.2521) (core#if ((core#lambda (.it.2522) (core#if .it.2522", +" .it.2522 #f)) (eqv? .key.2521 (core#quote only))) ((core#lambda (.alist.2523) (", +"map (core#lambda (.var.2524) (assq .var.2524 .alist.2523)) (cddr .spec.2520))) (", +".collect.2513 (cadr .spec.2520))) (core#if ((core#lambda (.it.2525) (core#if .it", +".2525 .it.2525 #f)) (eqv? .key.2521 (core#quote rename))) ((core#lambda (.alist.", +"2526 .renames.2527) (map (core#lambda (.s.2528) ((core#lambda (.it.2529) (core#i", +"f .it.2529 .it.2529 ((core#lambda (.it.2530) (core#if .it.2530 .it.2530 #f)) .s.", +"2528))) (assq (car .s.2528) .renames.2527))) .alist.2526)) (.collect.2513 (cadr ", +".spec.2520)) (map (core#lambda (.x.2531) (cons (car .x.2531) (cadr .x.2531))) (c", +"ddr .spec.2520))) (core#if ((core#lambda (.it.2532) (core#if .it.2532 .it.2532 #", +"f)) (eqv? .key.2521 (core#quote prefix))) ((core#lambda (.alist.2533) (map (core", +"#lambda (.s.2534) (cons (.prefix.2510 (.caddr.2509 .spec.2520) (car .s.2534)) (c", +"dr .s.2534))) .alist.2533)) (.collect.2513 (cadr .spec.2520))) (core#if ((core#l", +"ambda (.it.2535) (core#if .it.2535 .it.2535 #f)) (eqv? .key.2521 (core#quote exc", +"ept))) ((core#lambda (.alist.2536) ((core#lambda () (core#begin (core#define .lo", +"op.2537 (core#lambda (.alist.2538) (core#if (null? .alist.2538) (core#quote ()) ", +"(core#if (memq (caar .alist.2538) (cddr .spec.2520)) (.loop.2537 (cdr .alist.253", +"8)) (cons (car .alist.2538) (.loop.2537 (cdr .alist.2538))))))) (.loop.2537 .ali", +"st.2536))))) (.collect.2513 (cadr .spec.2520))) (core#if #t (dictionary-map (cor", +"e#lambda (.x.2539) (cons .x.2539 .x.2539)) (library-exports (.getlib.2511 .spec.", +"2520))) #undefined)))))) (car .spec.2520)))) ((core#lambda (.import.2540) (core#", +"begin (core#set! .import.2540 (core#lambda (.spec.2541) ((core#lambda (.lib.2542", +" .alist.2543) (for-each (core#lambda (.slot.2544) (library-import .lib.2542 (cdr", +" .slot.2544) (car .slot.2544))) .alist.2543)) (.extract.2512 .spec.2541) (.colle", +"ct.2513 .spec.2541)))) (for-each .import.2540 (cdr .form.2507)))) #undefined))))", +" #undefined #undefined)) (core#lambda (.x.2545) (car (cdr (cdr .x.2545)))) (core", +"#lambda (.prefix.2546 .symbol.2547) (string->symbol (string-append (symbol->stri", +"ng .prefix.2546) (symbol->string .symbol.2547)))) (core#lambda (.name.2548) (cor", +"e#if (find-library .name.2548) .name.2548 (error \"library not found\" .name.2548)", +"))))) (.define-transformer.2477 (core#quote export) (core#lambda (.form.2549 ._.", +"2550) ((core#lambda (.collect.2551 .export.2552) (core#begin (core#set! .collect", +".2551 (core#lambda (.spec.2553) (core#if (symbol? .spec.2553) (cons .spec.2553 .", +"spec.2553) (core#if (core#if (list? .spec.2553) (core#if (= (length .spec.2553) ", +"3) (eq? (car .spec.2553) (core#quote rename)) #f) #f) (cons (list-ref .spec.2553", +" 1) (list-ref .spec.2553 2)) (error \"malformed export\"))))) (core#begin (core#se", +"t! .export.2552 (core#lambda (.spec.2554) ((core#lambda (.slot.2555) (library-ex", +"port (car .slot.2555) (cdr .slot.2555))) (.collect.2551 .spec.2554)))) (for-each", +" .export.2552 (cdr .form.2549))))) #undefined #undefined))))))) (core#lambda (.n", +"ame.2556 .macro.2557) (add-macro! .name.2556 .macro.2557))) ((core#lambda () (co", +"re#begin (make-library (core#quote (picrin base))) (core#begin (set-car! (dictio", +"nary-ref *libraries* (mangle (core#quote (picrin base)))) default-environment) (", +"core#begin ((core#lambda (.export-keywords.2558) (core#begin (.export-keywords.2", +"558 (core#quote (define lambda quote set! if begin define-macro let let* letrec ", +"letrec* let-values let*-values define-values quasiquote unquote unquote-splicing", +" and or cond case else => do when unless parameterize define-syntax syntax-quote", +" syntax-unquote syntax-quasiquote syntax-unquote-splicing let-syntax letrec-synt", +"ax syntax-error))) (core#begin (.export-keywords.2558 (core#quote (features eq? ", +"eqv? equal? not boolean? boolean=? pair? cons car cdr null? set-car! set-cdr! ca", +"ar 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 current-output-port current-error-port port? input-port? output-port? port-", +"open? close-port eof-object? eof-object read-u8 peek-u8 read-bytevector! write-u", +"8 write-bytevector flush-output-port open-input-bytevector open-output-bytevecto", +"r get-output-bytevector number? exact? inexact? inexact exact = < > <= >= + - * ", +"/ number->string string->number procedure? apply symbol? symbol=? symbol->string", +" string->symbol make-identifier identifier? identifier=? identifier-base identif", +"ier-environment vector? vector make-vector vector-length vector-ref vector-set! ", +"vector-copy! vector-copy vector-append vector-fill! vector-map vector-for-each l", +"ist->vector vector->list string->vector vector->string bytevector? bytevector ma", +"ke-bytevector bytevector-length bytevector-u8-ref bytevector-u8-set! bytevector-", +"copy! bytevector-copy bytevector-append bytevector->list list->bytevector call-w", +"ith-current-continuation call/cc values call-with-values char? char->integer int", +"eger->char char=? char? char<=? char>=? current-exception-handlers with-", +"exception-handler raise raise-continuable error error-object? error-object-messa", +"ge error-object-irritants error-object-type string? string make-string string-le", +"ngth string-ref string-set! string-copy string-copy! string-fill! string-append ", +"string-map string-for-each list->string string->list string=? string? ", +"string<=? string>=? make-parameter with-dynamic-environment read make-dictionary", +" dictionary? dictionary dictionary-has? dictionary-ref dictionary-set! dictionar", +"y-delete! dictionary-size dictionary-map dictionary-for-each dictionary->alist a", +"list->dictionary dictionary->plist plist->dictionary make-record record? record-", +"type record-datum default-environment make-environment find-identifier set-ident", +"ifier! eval compile add-macro! make-ephemeron-table write write-simple write-sha", +"red display))) (.export-keywords.2558 (core#quote (find-library make-library cur", +"rent-library)))))) (core#lambda (.keywords.2559) ((core#lambda (.env.2560 .expor", +"ts.2561) (for-each (core#lambda (.keyword.2562) (dictionary-set! .exports.2561 .", +"keyword.2562 .keyword.2562)) .keywords.2559)) (library-environment (core#quote (", +"picrin base))) (library-exports (core#quote (picrin base)))))) (core#begin (core", +"#set! eval ((core#lambda (.e.2563) (core#lambda (.expr.2564 . .lib.2565) ((core#", +"lambda (.lib.2566) (.e.2563 .expr.2564 (library-environment .lib.2566))) (core#i", +"f (null? .lib.2565) (current-library) (car .lib.2565))))) eval)) (core#begin (ma", +"ke-library (core#quote (picrin user))) (current-library (core#quote (picrin user", +"))))))))))))))))))))", }; #endif @@ -414,6 +494,6 @@ pic_boot(pic_state *pic) { 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]); + pic_call(pic, pic_compile(pic, pic_read_cstr(pic, &boot_library_rom[0][0])), 0); #endif } diff --git a/piclib/boot.scm b/piclib/boot.scm index 1980979d..d4e91a40 100644 --- a/piclib/boot.scm +++ b/piclib/boot.scm @@ -1,457 +1,232 @@ -(core#define-macro call-with-current-environment - (core#lambda (form env) - (list (cadr form) env))) +(begin + ;; FIXME + (define (transformer f) + (lambda (form env) + (let ((ephemeron1 (make-ephemeron-table)) + (ephemeron2 (make-ephemeron-table))) + (letrec + ((wrap (lambda (var1) + (let ((var2 (ephemeron1 var1))) + (if var2 + (cdr var2) + (let ((var2 (make-identifier var1 env))) + (ephemeron1 var1 var2) + (ephemeron2 var2 var1) + var2))))) + (unwrap (lambda (var2) + (let ((var1 (ephemeron2 var2))) + (if var1 + (cdr var1) + var2)))) + (walk (lambda (f form) + (cond + ((identifier? form) + (f form)) + ((pair? form) + (cons (walk f (car form)) (walk f (cdr form)))) + ((vector? form) + (list->vector (walk f (vector->list form)))) + (else + form))))) + (let ((form (cdr form))) + (walk unwrap (apply f (walk wrap form)))))))) + (let () + (define (define-transformer name transformer) + (add-macro! name transformer)) -(core#define here - (call-with-current-environment - (core#lambda (env) - env))) + (define (the var) ; synonym for #'var + (make-identifier var default-environment)) -(core#define the ; synonym for #'var - (core#lambda (var) - (make-identifier var here))) + (define the-core-define (the 'core#define)) + (define the-core-lambda (the 'core#lambda)) + (define the-core-begin (the 'core#begin)) + (define the-core-quote (the 'core#quote)) + (define the-core-set! (the 'core#set!)) + (define the-core-if (the 'core#if)) + (define the-core-define-macro (the 'core#define-macro)) + + (define the-define (the 'define)) + (define the-lambda (the 'lambda)) + (define the-begin (the 'begin)) + (define the-quote (the 'quote)) + (define the-set! (the 'set!)) + (define the-if (the 'if)) + (define the-define-macro (the 'define-macro)) + + (define-transformer 'quote + (lambda (form env) + (if (= (length form) 2) + `(,the-core-quote ,(cadr form)) + (error "malformed quote" form)))) + + (define-transformer 'if + (lambda (form env) + (let ((len (length form))) + (cond + ((= len 3) `(,@form #undefined)) + ((= len 4) `(,the-core-if . ,(cdr form))) + (else (error "malformed if" form)))))) + + (define-transformer 'begin + (lambda (form env) + (let ((len (length form))) + (cond + ((= len 1) #undefined) + ((= len 2) (cadr form)) + ((= len 3) `(,the-core-begin . ,(cdr form))) + (else `(,the-core-begin ,(cadr form) (,the-begin . ,(cddr form)))))))) + + (define-transformer 'set! + (lambda (form env) + (if (and (= (length form) 3) (identifier? (cadr form))) + `(,the-core-set! . ,(cdr form)) + (error "malformed set!" form)))) + + (define (check-formal formal) + (or (null? formal) + (identifier? formal) + (and (pair? formal) + (identifier? (car formal)) + (check-formal (cdr formal))))) + + (define-transformer 'lambda + (lambda (form env) + (if (= (length form) 1) + (error "malformed lambda" form) + (if (check-formal (cadr form)) + `(,the-core-lambda ,(cadr form) (,the-begin . ,(cddr form))) + (error "malformed lambda" form))))) + + (define-transformer 'define + (lambda (form env) + (let ((len (length form))) + (if (= len 1) + (error "malformed define" form) + (let ((formal (cadr form))) + (if (identifier? formal) + (if (= len 3) + `(,the-core-define . ,(cdr form)) + (error "malformed define" form)) + (if (pair? formal) + `(,the-define ,(car formal) (,the-lambda ,(cdr formal) . ,(cddr form))) + (error "define: binding to non-varaible object" form)))))))) + + (define-transformer 'define-macro + (lambda (form env) + (if (= (length form) 3) + (if (identifier? (cadr form)) + `(,the-core-define-macro . ,(cdr form)) + (error "define-macro: binding to non-variable object" form)) + (error "malformed define-macro" form)))) -(core#define the-builtin-define (the (core#quote core#define))) -(core#define the-builtin-lambda (the (core#quote core#lambda))) -(core#define the-builtin-begin (the (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#define the-builtin-if (the (core#quote core#if))) -(core#define the-builtin-define-macro (the (core#quote core#define-macro))) + (define-transformer 'syntax-error + (lambda (form _) + (apply error (cdr form)))) -(core#define the-define (the (core#quote 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))) + (define-macro define-auxiliary-syntax + (lambda (form _) + `(define-transformer ',(cadr form) + (lambda _ + (error "invalid use of auxiliary syntax" ',(cadr form)))))) -(core#define-macro quote - (core#lambda (form env) - (core#if (= (length form) 2) - (list the-builtin-quote (cadr form)) - (error "illegal quote form" form)))) + (define-auxiliary-syntax else) + (define-auxiliary-syntax =>) + (define-auxiliary-syntax unquote) + (define-auxiliary-syntax unquote-splicing) + (define-auxiliary-syntax syntax-unquote) + (define-auxiliary-syntax syntax-unquote-splicing) -(core#define-macro if - (core#lambda (form env) - ((core#lambda (len) - (core#if (= len 4) - (cons the-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-begin (cdr form)) - (list the-builtin-begin - (cadr form) - (cons the-begin (cddr form))))))) - (length form)))) - -(core#define-macro set! - (core#lambda (form env) - (if (= (length form) 3) + (define-transformer 'let + (lambda (form env) (if (identifier? (cadr form)) - (cons the-builtin-set! (cdr form)) - (error "illegal set! form" form)) - (error "illegal set! form" form)))) + (let ((name (car (cdr form))) + (formal (car (cdr (cdr form)))) + (body (cdr (cdr (cdr form))))) + `((,the-lambda () + (,the-define (,name . ,(map car formal)) . ,body) + (,name . ,(map cadr formal))))) + (let ((formal (car (cdr form))) + (body (cdr (cdr form)))) + `((,the-lambda ,(map car formal) . ,body) . ,(map cadr formal)))))) -(core#define check-formal - (core#lambda (formal) - (if (null? formal) - #t - (if (identifier? formal) + (define-transformer 'and + (lambda (form env) + (if (null? (cdr form)) #t - (if (pair? formal) - (if (identifier? (car formal)) - (check-formal (cdr formal)) - #f) - #f))))) + (if (null? (cddr form)) + (cadr form) + `(,the-if ,(cadr form) (,(the 'and) . ,(cddr form)) #f))))) -(core#define-macro lambda - (core#lambda (form env) - (if (= (length form) 1) - (error "illegal lambda form" form) - (if (check-formal (cadr form)) - (list the-builtin-lambda (cadr form) (cons the-begin (cddr form))) - (error "illegal lambda form" form))))) + (define-transformer 'or + (lambda (form env) + (if (null? (cdr form)) + #f + (let ((tmp (make-identifier 'it env))) ; should we use #f as the env for tmp? + `(,(the 'let) ((,tmp ,(cadr form))) + (,the-if ,tmp ,tmp (,(the 'or) . ,(cddr 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-lambda (cons (cdr (cadr form)) (cddr form)))) - (error "define: binding to non-varaible object" form))))) - (length form)))) + (define-transformer 'cond + (lambda (form env) + (let ((clauses (cdr form))) + (if (null? clauses) + #undefined + (let ((clause (car clauses))) + (if (and (identifier? (car clause)) + (identifier=? (the 'else) (make-identifier (car clause) env))) + `(,the-begin . ,(cdr clause)) + (if (null? (cdr clause)) + `(,(the 'or) ,(car clause) (,(the 'cond) . ,(cdr clauses))) + (if (and (identifier? (cadr clause)) + (identifier=? (the '=>) (make-identifier (cadr clause) env))) + (let ((tmp (make-identifier 'tmp env))) + `(,(the 'let) ((,tmp ,(car clause))) + (,the-if ,tmp (,(cadr (cdr clause)) ,tmp) (,(the 'cond) . ,(cddr form))))) + `(,the-if ,(car clause) + (,the-begin . ,(cdr clause)) + (,(the 'cond) . ,(cdr clauses))))))))))) -(core#define-macro define-macro - (lambda (form 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-transformer 'quasiquote + (lambda (form env) - -(define-macro syntax-error - (lambda (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) -(define-auxiliary-syntax =>) -(define-auxiliary-syntax unquote) -(define-auxiliary-syntax unquote-splicing) -(define-auxiliary-syntax syntax-unquote) -(define-auxiliary-syntax syntax-unquote-splicing) - -(define-macro let - (lambda (form env) - (if (identifier? (cadr form)) - (list - (list the-lambda '() - (list the-define (cadr form) - (cons the-lambda - (cons (map car (car (cddr form))) - (cdr (cddr form))))) - (cons (cadr form) (map cadr (car (cddr form)))))) - (cons - (cons - the-lambda - (cons (map car (cadr form)) - (cddr form))) - (map cadr (cadr form)))))) - -(define-macro and - (lambda (form 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 (identifier? (car clause)) - (identifier=? (the 'else) (make-identifier (car clause) env))) - (cons the-begin (cdr clause)) - (if (null? (cdr clause)) - (let ((tmp (make-identifier '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 the-if tmp - (list (car (cddr clause)) tmp) - (cons (the 'cond) (cdr clauses))))) - (list the-if (car clause) - (cons the-begin (cdr clause)) - (cons (the 'cond) (cdr clauses))))))))))) - -(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 - ((unquote? expr) - (if (= depth 1) - (car (cdr expr)) - (list (the 'list) - (list (the 'quote) (the 'unquote)) - (qq (- depth 1) (car (cdr expr)))))) - ;; unquote-splicing - ((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 'unquote-splicing)) - (qq (- depth 1) (car (cdr (car expr))))) - (qq depth (cdr expr))))) - ;; quasiquote - ((quasiquote? expr) - (list (the 'list) - (list (the 'quote) (the 'quasiquote)) - (qq (+ depth 1) (car (cdr expr))))) - ;; list - ((pair? expr) - (list (the 'cons) - (qq depth (car expr)) - (qq depth (cdr expr)))) - ;; vector - ((vector? expr) - (list (the 'list->vector) (qq depth (vector->list expr)))) - ;; simple datum - (else - (list (the 'quote) expr)))) - - (let ((x (cadr form))) - (qq 1 x)))) - -(define-macro let* - (lambda (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-macro letrec - (lambda (form env) - `(,(the 'letrec*) ,@(cdr form)))) - -(define-macro letrec* - (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) - ,@initials - ,@body))))) - -(define-macro let-values - (lambda (form env) - `(,(the 'let*-values) ,@(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 () ,@body) - (,the-lambda - ,arguments - ,@(let loop ((formal formal) (args arguments)) - (if (pair? formal) - `((,the-set! ,(car formal) (,(the 'car) ,args)) ,@(loop (cdr formal) `(,(the 'cdr) ,args))) - (if (identifier? formal) - `((,the-set! ,formal ,args)) - '())))))))))) - -(define-macro do - (lambda (form env) - (let ((bindings (car (cdr form))) - (test (car (car (cdr (cdr form))))) - (cleanup (cdr (car (cdr (cdr form))))) - (body (cdr (cdr (cdr form))))) - (let ((loop (make-identifier 'loop here))) - `(,(the '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)))) - `(,the-if ,test - (,the-begin ,@body) - #undefined)))) - -(define-macro unless - (lambda (form env) - (let ((test (car (cdr form))) - (body (cdr (cdr form)))) - `(,the-if ,test - #undefined - (,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 (identifier? (car clause)) - (identifier=? (the 'else) (make-identifier (car clause) env))) - #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 parameterize - (lambda (form env) - (let ((formal (car (cdr form))) - (body (cdr (cdr form)))) - `(,(the 'with-dynamic-environment) - (,(the 'list) ,@(map (lambda (x) `(,(the 'cons) ,(car x) ,(cadr x))) formal)) - (,the-lambda () ,@body))))) - -(define-macro syntax-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)) . ,renames)) - (rename var)))))) - (walk (lambda (f form) - (cond - ((identifier? form) - (f form)) - ((pair? form) - `(,(the 'cons) (walk f (car form)) (walk f (cdr form)))) - ((vector? form) - `(,(the 'list->vector) (walk f (vector->list form)))) - (else - `(,(the 'quote) ,form)))))) - (let ((form (walk rename (cadr form)))) - `(,(the 'let) - ,(map cdr renames) - ,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-identifier) ',var ',env)) . ,renames)) - (rename var))))))) - - (define (syntax-quasiquote? form) + (define (quasiquote? form) (and (pair? form) (identifier? (car form)) - (identifier=? (the 'syntax-quasiquote) (make-identifier (car form) env)))) + (identifier=? (the 'quasiquote) (make-identifier (car form) env)))) - (define (syntax-unquote? form) + (define (unquote? form) (and (pair? form) (identifier? (car form)) - (identifier=? (the 'syntax-unquote) (make-identifier (car form) env)))) + (identifier=? (the 'unquote) (make-identifier (car form) env)))) - (define (syntax-unquote-splicing? form) + (define (unquote-splicing? form) (and (pair? form) (pair? (car form)) (identifier? (caar form)) - (identifier=? (the 'syntax-unquote-splicing) (make-identifier (caar form) env)))) + (identifier=? (the 'unquote-splicing) (make-identifier (caar form) env)))) (define (qq depth expr) (cond - ;; syntax-unquote - ((syntax-unquote? expr) + ;; unquote + ((unquote? expr) (if (= depth 1) - (car (cdr expr)) + (cadr expr) (list (the 'list) - (list (the 'quote) (the 'syntax-unquote)) + (list (the 'quote) (the 'unquote)) (qq (- depth 1) (car (cdr expr)))))) - ;; syntax-unquote-splicing - ((syntax-unquote-splicing? expr) + ;; unquote-splicing + ((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)) + (list (the 'quote) (the 'unquote-splicing)) (qq (- depth 1) (car (cdr (car expr))))) (qq depth (cdr expr))))) - ;; syntax-quasiquote - ((syntax-quasiquote? expr) + ;; quasiquote + ((quasiquote? expr) (list (the 'list) (list (the 'quote) (the 'quasiquote)) (qq (+ depth 1) (car (cdr expr))))) @@ -463,67 +238,252 @@ ;; vector ((vector? expr) (list (the 'list->vector) (qq depth (vector->list expr)))) - ;; identifier - ((identifier? expr) - (rename expr)) ;; simple datum (else (list (the 'quote) expr)))) - (let ((body (qq 1 (cadr form)))) - `(,(the 'let) - ,(map cdr renames) - ,body)))))) + (let ((x (cadr form))) + (qq 1 x)))) -(define (transformer f) - (lambda (form env) - (let ((ephemeron1 (make-ephemeron-table)) - (ephemeron2 (make-ephemeron-table))) - (letrec - ((wrap (lambda (var1) - (let ((var2 (ephemeron1 var1))) - (if var2 - (cdr var2) - (let ((var2 (make-identifier var1 env))) - (ephemeron1 var1 var2) - (ephemeron2 var2 var1) - var2))))) - (unwrap (lambda (var2) - (let ((var1 (ephemeron2 var2))) - (if var1 - (cdr var1) - var2)))) - (walk (lambda (f form) - (cond - ((identifier? form) - (f form)) - ((pair? form) - (cons (walk f (car form)) (walk f (cdr form)))) - ((vector? form) - (list->vector (walk f (vector->list form)))) - (else - form))))) - (let ((form (cdr form))) - (walk unwrap (apply f (walk wrap form)))))))) + (define-transformer 'let* + (lambda (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-macro define-syntax - (lambda (form env) - (let ((formal (car (cdr form))) - (body (cdr (cdr form)))) - (if (pair? formal) - `(,(the 'define-syntax) ,(car formal) (,the-lambda ,(cdr formal) ,@body)) - `(,the-define-macro ,formal (,(the 'transformer) (,the-begin ,@body))))))) + (define-transformer 'letrec + (lambda (form env) + `(,(the 'letrec*) . ,(cdr form)))) -(define-macro letrec-syntax - (lambda (form env) - (let ((formal (car (cdr form))) - (body (cdr (cdr form)))) - `(let () - ,@(map (lambda (x) - `(,(the 'define-syntax) ,(car x) ,(cadr x))) - formal) - ,@body)))) + (define-transformer 'letrec* + (lambda (form env) + (let ((bindings (car (cdr form))) + (body (cdr (cdr form)))) + (let ((variables (map (lambda (v) `(,v #undefined)) (map car bindings))) + (initials (map (lambda (v) `(,(the 'set!) ,@v)) bindings))) + `(,(the 'let) ,variables + ,@initials + ,@body))))) -(define-macro let-syntax - (lambda (form env) - `(,(the 'letrec-syntax) ,@(cdr form)))) + (define-transformer 'let-values + (lambda (form env) + `(,(the 'let*-values) ,@(cdr form)))) + + (define-transformer '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-transformer 'define-values + (lambda (form env) + (let ((formal (car (cdr form))) + (body (cdr (cdr form)))) + (let ((arguments (make-identifier 'arguments env))) + `(,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 () ,@body) + (,the-lambda + ,arguments + ,@(let loop ((formal formal) (args arguments)) + (if (pair? formal) + `((,the-set! ,(car formal) (,(the 'car) ,args)) ,@(loop (cdr formal) `(,(the 'cdr) ,args))) + (if (identifier? formal) + `((,the-set! ,formal ,args)) + '())))))))))) + + (define-transformer 'do + (lambda (form env) + (let ((bindings (car (cdr form))) + (test (car (car (cdr (cdr form))))) + (cleanup (cdr (car (cdr (cdr form))))) + (body (cdr (cdr (cdr form))))) + (let ((loop (make-identifier 'loop env))) + `(,(the '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-transformer 'when + (lambda (form env) + (let ((test (car (cdr form))) + (body (cdr (cdr form)))) + `(,the-if ,test + (,the-begin ,@body) + #undefined)))) + + (define-transformer 'unless + (lambda (form env) + (let ((test (car (cdr form))) + (body (cdr (cdr form)))) + `(,the-if ,test + #undefined + (,the-begin ,@body))))) + + (define-transformer 'case + (lambda (form env) + (let ((key (car (cdr form))) + (clauses (cdr (cdr form)))) + (let ((the-key (make-identifier 'key env))) + `(,(the 'let) ((,the-key ,key)) + ,(let loop ((clauses clauses)) + (if (null? clauses) + #undefined + (let ((clause (car clauses))) + `(,the-if ,(if (and (identifier? (car clause)) + (identifier=? (the 'else) (make-identifier (car clause) env))) + #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-transformer 'parameterize + (lambda (form env) + (let ((formal (car (cdr form))) + (body (cdr (cdr form)))) + `(,(the 'with-dynamic-environment) + (,(the 'list) ,@(map (lambda (x) `(,(the 'cons) ,(car x) ,(cadr x))) formal)) + (,the-lambda () ,@body))))) + + (define-transformer 'syntax-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)) . ,renames)) + (rename var)))))) + (walk (lambda (f form) + (cond + ((identifier? form) + (f form)) + ((pair? form) + `(,(the 'cons) (walk f (car form)) (walk f (cdr form)))) + ((vector? form) + `(,(the 'list->vector) (walk f (vector->list form)))) + (else + `(,(the 'quote) ,form)))))) + (let ((form (walk rename (cadr form)))) + `(,(the 'let) + ,(map cdr renames) + ,form)))))) + + (define-transformer '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-identifier) ',var ',env)) . ,renames)) + (rename var))))))) + + (define (syntax-quasiquote? form) + (and (pair? form) + (identifier? (car form)) + (identifier=? (the 'syntax-quasiquote) (make-identifier (car form) env)))) + + (define (syntax-unquote? form) + (and (pair? form) + (identifier? (car form)) + (identifier=? (the 'syntax-unquote) (make-identifier (car form) env)))) + + (define (syntax-unquote-splicing? form) + (and (pair? form) + (pair? (car form)) + (identifier? (caar form)) + (identifier=? (the 'syntax-unquote-splicing) (make-identifier (caar form) env)))) + + (define (qq depth expr) + (cond + ;; syntax-unquote + ((syntax-unquote? expr) + (if (= depth 1) + (car (cdr expr)) + (list (the 'list) + (list (the 'quote) (the 'syntax-unquote)) + (qq (- depth 1) (car (cdr expr)))))) + ;; syntax-unquote-splicing + ((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 + ((syntax-quasiquote? expr) + (list (the 'list) + (list (the 'quote) (the 'quasiquote)) + (qq (+ depth 1) (car (cdr expr))))) + ;; list + ((pair? expr) + (list (the 'cons) + (qq depth (car expr)) + (qq depth (cdr expr)))) + ;; vector + ((vector? expr) + (list (the 'list->vector) (qq depth (vector->list expr)))) + ;; identifier + ((identifier? expr) + (rename expr)) + ;; simple datum + (else + (list (the 'quote) expr)))) + + (let ((body (qq 1 (cadr form)))) + `(,(the 'let) + ,(map cdr renames) + ,body)))))) + + (define-transformer 'define-syntax + (lambda (form env) + (let ((formal (car (cdr form))) + (body (cdr (cdr form)))) + (if (pair? formal) + `(,(the 'define-syntax) ,(car formal) (,the-lambda ,(cdr formal) ,@body)) + `(,the-define-macro ,formal (,(the 'transformer) (,the-begin ,@body))))))) + + (define-transformer 'letrec-syntax + (lambda (form env) + (let ((formal (car (cdr form))) + (body (cdr (cdr form)))) + `(let () + ,@(map (lambda (x) + `(,(the 'define-syntax) ,(car x) ,(cadr x))) + formal) + ,@body)))) + + (define-transformer 'let-syntax + (lambda (form env) + `(,(the 'letrec-syntax) ,@(cdr form)))))) diff --git a/piclib/boot2.scm b/piclib/boot2.scm deleted file mode 100644 index d4e91a40..00000000 --- a/piclib/boot2.scm +++ /dev/null @@ -1,489 +0,0 @@ -(begin - ;; FIXME - (define (transformer f) - (lambda (form env) - (let ((ephemeron1 (make-ephemeron-table)) - (ephemeron2 (make-ephemeron-table))) - (letrec - ((wrap (lambda (var1) - (let ((var2 (ephemeron1 var1))) - (if var2 - (cdr var2) - (let ((var2 (make-identifier var1 env))) - (ephemeron1 var1 var2) - (ephemeron2 var2 var1) - var2))))) - (unwrap (lambda (var2) - (let ((var1 (ephemeron2 var2))) - (if var1 - (cdr var1) - var2)))) - (walk (lambda (f form) - (cond - ((identifier? form) - (f form)) - ((pair? form) - (cons (walk f (car form)) (walk f (cdr form)))) - ((vector? form) - (list->vector (walk f (vector->list form)))) - (else - form))))) - (let ((form (cdr form))) - (walk unwrap (apply f (walk wrap form)))))))) - (let () - (define (define-transformer name transformer) - (add-macro! name transformer)) - - (define (the var) ; synonym for #'var - (make-identifier var default-environment)) - - (define the-core-define (the 'core#define)) - (define the-core-lambda (the 'core#lambda)) - (define the-core-begin (the 'core#begin)) - (define the-core-quote (the 'core#quote)) - (define the-core-set! (the 'core#set!)) - (define the-core-if (the 'core#if)) - (define the-core-define-macro (the 'core#define-macro)) - - (define the-define (the 'define)) - (define the-lambda (the 'lambda)) - (define the-begin (the 'begin)) - (define the-quote (the 'quote)) - (define the-set! (the 'set!)) - (define the-if (the 'if)) - (define the-define-macro (the 'define-macro)) - - (define-transformer 'quote - (lambda (form env) - (if (= (length form) 2) - `(,the-core-quote ,(cadr form)) - (error "malformed quote" form)))) - - (define-transformer 'if - (lambda (form env) - (let ((len (length form))) - (cond - ((= len 3) `(,@form #undefined)) - ((= len 4) `(,the-core-if . ,(cdr form))) - (else (error "malformed if" form)))))) - - (define-transformer 'begin - (lambda (form env) - (let ((len (length form))) - (cond - ((= len 1) #undefined) - ((= len 2) (cadr form)) - ((= len 3) `(,the-core-begin . ,(cdr form))) - (else `(,the-core-begin ,(cadr form) (,the-begin . ,(cddr form)))))))) - - (define-transformer 'set! - (lambda (form env) - (if (and (= (length form) 3) (identifier? (cadr form))) - `(,the-core-set! . ,(cdr form)) - (error "malformed set!" form)))) - - (define (check-formal formal) - (or (null? formal) - (identifier? formal) - (and (pair? formal) - (identifier? (car formal)) - (check-formal (cdr formal))))) - - (define-transformer 'lambda - (lambda (form env) - (if (= (length form) 1) - (error "malformed lambda" form) - (if (check-formal (cadr form)) - `(,the-core-lambda ,(cadr form) (,the-begin . ,(cddr form))) - (error "malformed lambda" form))))) - - (define-transformer 'define - (lambda (form env) - (let ((len (length form))) - (if (= len 1) - (error "malformed define" form) - (let ((formal (cadr form))) - (if (identifier? formal) - (if (= len 3) - `(,the-core-define . ,(cdr form)) - (error "malformed define" form)) - (if (pair? formal) - `(,the-define ,(car formal) (,the-lambda ,(cdr formal) . ,(cddr form))) - (error "define: binding to non-varaible object" form)))))))) - - (define-transformer 'define-macro - (lambda (form env) - (if (= (length form) 3) - (if (identifier? (cadr form)) - `(,the-core-define-macro . ,(cdr form)) - (error "define-macro: binding to non-variable object" form)) - (error "malformed define-macro" form)))) - - - (define-transformer 'syntax-error - (lambda (form _) - (apply error (cdr form)))) - - (define-macro define-auxiliary-syntax - (lambda (form _) - `(define-transformer ',(cadr form) - (lambda _ - (error "invalid use of auxiliary syntax" ',(cadr form)))))) - - (define-auxiliary-syntax else) - (define-auxiliary-syntax =>) - (define-auxiliary-syntax unquote) - (define-auxiliary-syntax unquote-splicing) - (define-auxiliary-syntax syntax-unquote) - (define-auxiliary-syntax syntax-unquote-splicing) - - (define-transformer 'let - (lambda (form env) - (if (identifier? (cadr form)) - (let ((name (car (cdr form))) - (formal (car (cdr (cdr form)))) - (body (cdr (cdr (cdr form))))) - `((,the-lambda () - (,the-define (,name . ,(map car formal)) . ,body) - (,name . ,(map cadr formal))))) - (let ((formal (car (cdr form))) - (body (cdr (cdr form)))) - `((,the-lambda ,(map car formal) . ,body) . ,(map cadr formal)))))) - - (define-transformer 'and - (lambda (form env) - (if (null? (cdr form)) - #t - (if (null? (cddr form)) - (cadr form) - `(,the-if ,(cadr form) (,(the 'and) . ,(cddr form)) #f))))) - - (define-transformer 'or - (lambda (form env) - (if (null? (cdr form)) - #f - (let ((tmp (make-identifier 'it env))) ; should we use #f as the env for tmp? - `(,(the 'let) ((,tmp ,(cadr form))) - (,the-if ,tmp ,tmp (,(the 'or) . ,(cddr form)))))))) - - (define-transformer 'cond - (lambda (form env) - (let ((clauses (cdr form))) - (if (null? clauses) - #undefined - (let ((clause (car clauses))) - (if (and (identifier? (car clause)) - (identifier=? (the 'else) (make-identifier (car clause) env))) - `(,the-begin . ,(cdr clause)) - (if (null? (cdr clause)) - `(,(the 'or) ,(car clause) (,(the 'cond) . ,(cdr clauses))) - (if (and (identifier? (cadr clause)) - (identifier=? (the '=>) (make-identifier (cadr clause) env))) - (let ((tmp (make-identifier 'tmp env))) - `(,(the 'let) ((,tmp ,(car clause))) - (,the-if ,tmp (,(cadr (cdr clause)) ,tmp) (,(the 'cond) . ,(cddr form))))) - `(,the-if ,(car clause) - (,the-begin . ,(cdr clause)) - (,(the 'cond) . ,(cdr clauses))))))))))) - - (define-transformer '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 - ((unquote? expr) - (if (= depth 1) - (cadr expr) - (list (the 'list) - (list (the 'quote) (the 'unquote)) - (qq (- depth 1) (car (cdr expr)))))) - ;; unquote-splicing - ((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 'unquote-splicing)) - (qq (- depth 1) (car (cdr (car expr))))) - (qq depth (cdr expr))))) - ;; quasiquote - ((quasiquote? expr) - (list (the 'list) - (list (the 'quote) (the 'quasiquote)) - (qq (+ depth 1) (car (cdr expr))))) - ;; list - ((pair? expr) - (list (the 'cons) - (qq depth (car expr)) - (qq depth (cdr expr)))) - ;; vector - ((vector? expr) - (list (the 'list->vector) (qq depth (vector->list expr)))) - ;; simple datum - (else - (list (the 'quote) expr)))) - - (let ((x (cadr form))) - (qq 1 x)))) - - (define-transformer 'let* - (lambda (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-transformer 'letrec - (lambda (form env) - `(,(the 'letrec*) . ,(cdr form)))) - - (define-transformer 'letrec* - (lambda (form env) - (let ((bindings (car (cdr form))) - (body (cdr (cdr form)))) - (let ((variables (map (lambda (v) `(,v #undefined)) (map car bindings))) - (initials (map (lambda (v) `(,(the 'set!) ,@v)) bindings))) - `(,(the 'let) ,variables - ,@initials - ,@body))))) - - (define-transformer 'let-values - (lambda (form env) - `(,(the 'let*-values) ,@(cdr form)))) - - (define-transformer '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-transformer 'define-values - (lambda (form env) - (let ((formal (car (cdr form))) - (body (cdr (cdr form)))) - (let ((arguments (make-identifier 'arguments env))) - `(,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 () ,@body) - (,the-lambda - ,arguments - ,@(let loop ((formal formal) (args arguments)) - (if (pair? formal) - `((,the-set! ,(car formal) (,(the 'car) ,args)) ,@(loop (cdr formal) `(,(the 'cdr) ,args))) - (if (identifier? formal) - `((,the-set! ,formal ,args)) - '())))))))))) - - (define-transformer 'do - (lambda (form env) - (let ((bindings (car (cdr form))) - (test (car (car (cdr (cdr form))))) - (cleanup (cdr (car (cdr (cdr form))))) - (body (cdr (cdr (cdr form))))) - (let ((loop (make-identifier 'loop env))) - `(,(the '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-transformer 'when - (lambda (form env) - (let ((test (car (cdr form))) - (body (cdr (cdr form)))) - `(,the-if ,test - (,the-begin ,@body) - #undefined)))) - - (define-transformer 'unless - (lambda (form env) - (let ((test (car (cdr form))) - (body (cdr (cdr form)))) - `(,the-if ,test - #undefined - (,the-begin ,@body))))) - - (define-transformer 'case - (lambda (form env) - (let ((key (car (cdr form))) - (clauses (cdr (cdr form)))) - (let ((the-key (make-identifier 'key env))) - `(,(the 'let) ((,the-key ,key)) - ,(let loop ((clauses clauses)) - (if (null? clauses) - #undefined - (let ((clause (car clauses))) - `(,the-if ,(if (and (identifier? (car clause)) - (identifier=? (the 'else) (make-identifier (car clause) env))) - #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-transformer 'parameterize - (lambda (form env) - (let ((formal (car (cdr form))) - (body (cdr (cdr form)))) - `(,(the 'with-dynamic-environment) - (,(the 'list) ,@(map (lambda (x) `(,(the 'cons) ,(car x) ,(cadr x))) formal)) - (,the-lambda () ,@body))))) - - (define-transformer 'syntax-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)) . ,renames)) - (rename var)))))) - (walk (lambda (f form) - (cond - ((identifier? form) - (f form)) - ((pair? form) - `(,(the 'cons) (walk f (car form)) (walk f (cdr form)))) - ((vector? form) - `(,(the 'list->vector) (walk f (vector->list form)))) - (else - `(,(the 'quote) ,form)))))) - (let ((form (walk rename (cadr form)))) - `(,(the 'let) - ,(map cdr renames) - ,form)))))) - - (define-transformer '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-identifier) ',var ',env)) . ,renames)) - (rename var))))))) - - (define (syntax-quasiquote? form) - (and (pair? form) - (identifier? (car form)) - (identifier=? (the 'syntax-quasiquote) (make-identifier (car form) env)))) - - (define (syntax-unquote? form) - (and (pair? form) - (identifier? (car form)) - (identifier=? (the 'syntax-unquote) (make-identifier (car form) env)))) - - (define (syntax-unquote-splicing? form) - (and (pair? form) - (pair? (car form)) - (identifier? (caar form)) - (identifier=? (the 'syntax-unquote-splicing) (make-identifier (caar form) env)))) - - (define (qq depth expr) - (cond - ;; syntax-unquote - ((syntax-unquote? expr) - (if (= depth 1) - (car (cdr expr)) - (list (the 'list) - (list (the 'quote) (the 'syntax-unquote)) - (qq (- depth 1) (car (cdr expr)))))) - ;; syntax-unquote-splicing - ((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 - ((syntax-quasiquote? expr) - (list (the 'list) - (list (the 'quote) (the 'quasiquote)) - (qq (+ depth 1) (car (cdr expr))))) - ;; list - ((pair? expr) - (list (the 'cons) - (qq depth (car expr)) - (qq depth (cdr expr)))) - ;; vector - ((vector? expr) - (list (the 'list->vector) (qq depth (vector->list expr)))) - ;; identifier - ((identifier? expr) - (rename expr)) - ;; simple datum - (else - (list (the 'quote) expr)))) - - (let ((body (qq 1 (cadr form)))) - `(,(the 'let) - ,(map cdr renames) - ,body)))))) - - (define-transformer 'define-syntax - (lambda (form env) - (let ((formal (car (cdr form))) - (body (cdr (cdr form)))) - (if (pair? formal) - `(,(the 'define-syntax) ,(car formal) (,the-lambda ,(cdr formal) ,@body)) - `(,the-define-macro ,formal (,(the 'transformer) (,the-begin ,@body))))))) - - (define-transformer 'letrec-syntax - (lambda (form env) - (let ((formal (car (cdr form))) - (body (cdr (cdr form)))) - `(let () - ,@(map (lambda (x) - `(,(the 'define-syntax) ,(car x) ,(cadr x))) - formal) - ,@body)))) - - (define-transformer 'let-syntax - (lambda (form env) - `(,(the 'letrec-syntax) ,@(cdr form)))))) diff --git a/piclib/library.scm b/piclib/library.scm index 96a58f33..c84202f0 100644 --- a/piclib/library.scm +++ b/piclib/library.scm @@ -1,271 +1,275 @@ -;;; There are two ways to name a library: (foo bar) or foo.bar -;;; The former is normalized to the latter. +(begin + ;; There are two ways to name a library: (foo bar) or foo.bar + ;; The former is normalized to the latter. -(define (mangle name) - (when (null? name) - (error "library name should be a list of at least one symbols" name)) + (define (mangle name) + (when (null? name) + (error "library name should be a list of at least one symbols" name)) - (define (->string n) - (cond - ((symbol? n) - (let ((str (symbol->string n))) - (string-for-each - (lambda (c) - (when (or (char=? c #\.) (char=? c #\:)) - (error "elements of library name may not contain '.' or ':'" n))) - str) - str)) - ((and (number? n) (exact? n) (<= 0 n)) - (number->string n)) - (else - (error "symbol or non-negative integer is required" n)))) + (define (->string n) + (cond + ((symbol? n) + (let ((str (symbol->string n))) + (string-for-each + (lambda (c) + (when (or (char=? c #\.) (char=? c #\:)) + (error "elements of library name may not contain '.' or ':'" n))) + str) + str)) + ((and (number? n) (exact? n) (<= 0 n)) + (number->string n)) + (else + (error "symbol or non-negative integer is required" n)))) - (define (join strs delim) - (let loop ((res (car strs)) (strs (cdr strs))) - (if (null? strs) - res - (loop (string-append res delim (car strs)) (cdr strs))))) + (define (join strs delim) + (let loop ((res (car strs)) (strs (cdr strs))) + (if (null? strs) + res + (loop (string-append res delim (car strs)) (cdr strs))))) - (if (symbol? name) - name ; TODO: check symbol names - (string->symbol (join (map ->string name) ".")))) + (if (symbol? name) + name ; TODO: check symbol names + (string->symbol (join (map ->string name) ".")))) -(define current-library - (make-parameter '(picrin base) mangle)) + (define current-library + (make-parameter '(picrin base) mangle)) -(define *libraries* - (make-dictionary)) + (define *libraries* + (make-dictionary)) -(define (find-library name) - (dictionary-has? *libraries* (mangle name))) + (define (find-library name) + (dictionary-has? *libraries* (mangle name))) -(define (make-library name) - (let ((name (mangle name))) - (let ((env (make-environment - (string->symbol (string-append (symbol->string name) ":")))) - (exports (make-dictionary))) - ;; set up initial environment - (set-identifier! 'define-library 'define-library env) - (set-identifier! 'import 'import env) - (set-identifier! 'export 'export env) - (set-identifier! 'cond-expand 'cond-expand env) - (dictionary-set! *libraries* name `(,env . ,exports))))) + (define (make-library name) + (let ((name (mangle name))) + (let ((env (make-environment + (string->symbol (string-append (symbol->string name) ":")))) + (exports (make-dictionary))) + ;; set up initial environment + (set-identifier! 'define-library 'define-library env) + (set-identifier! 'import 'import env) + (set-identifier! 'export 'export env) + (set-identifier! 'cond-expand 'cond-expand env) + (dictionary-set! *libraries* name `(,env . ,exports))))) -(define (library-environment name) - (car (dictionary-ref *libraries* (mangle name)))) + (define (library-environment name) + (car (dictionary-ref *libraries* (mangle name)))) -(define (library-exports name) - (cdr (dictionary-ref *libraries* (mangle name)))) + (define (library-exports name) + (cdr (dictionary-ref *libraries* (mangle name)))) -(define (library-import name sym alias) - (let ((uid (dictionary-ref (library-exports name) sym))) - (let ((env (library-environment (current-library)))) - (set-identifier! alias uid env)))) + (define (library-import name sym alias) + (let ((uid (dictionary-ref (library-exports name) sym))) + (let ((env (library-environment (current-library)))) + (set-identifier! alias uid env)))) -(define (library-export sym alias) - (let ((env (library-environment (current-library))) - (exports (library-exports (current-library)))) - (dictionary-set! exports alias (find-identifier sym env)))) + (define (library-export sym alias) + (let ((env (library-environment (current-library))) + (exports (library-exports (current-library)))) + (dictionary-set! exports alias (find-identifier sym env)))) -;;; R7RS library syntax + ;; R7RS library syntax -(define-macro define-library - (lambda (form _) - (let ((name (cadr form)) - (body (cddr form))) - (or (find-library name) (make-library name)) - (parameterize ((current-library name)) - (for-each - (lambda (expr) - (eval expr name)) ; TODO parse library declarations - body))))) + (let ((define-transformer + (lambda (name macro) + (add-macro! name macro)))) -(define-macro cond-expand - (lambda (form _) - (letrec - ((test (lambda (form) - (or - (eq? form 'else) - (and (symbol? form) - (memq form (features))) - (and (pair? form) - (case (car form) - ((library) (find-library (cadr form))) - ((not) (not (test (cadr form)))) - ((and) (let loop ((form (cdr form))) - (or (null? form) - (and (test (car form)) (loop (cdr form)))))) - ((or) (let loop ((form (cdr form))) - (and (pair? form) - (or (test (car form)) (loop (cdr form)))))) - (else #f))))))) - (let loop ((clauses (cdr form))) - (if (null? clauses) - #undefined - (if (test (caar clauses)) - `(,(make-identifier 'begin default-environment) ,@(cdar clauses)) - (loop (cdr clauses)))))))) + (define-transformer 'define-library + (lambda (form _) + (let ((name (cadr form)) + (body (cddr form))) + (or (find-library name) (make-library name)) + (parameterize ((current-library name)) + (for-each + (lambda (expr) + (eval expr name)) ; TODO parse library declarations + body))))) -(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 found" name))))) - (letrec - ((extract - (lambda (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) `(,(car x) . ,(cadr x))) (cddr spec)))) - (map (lambda (s) (or (assq (car s) renames) s)) alist))) - ((prefix) - (let ((alist (collect (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) (cons x x)) - (library-exports (getlib spec)))))))) + (define-transformer 'cond-expand + (lambda (form _) (letrec - ((import + ((test (lambda (form) + (or + (eq? form 'else) + (and (symbol? form) + (memq form (features))) + (and (pair? form) + (case (car form) + ((library) (find-library (cadr form))) + ((not) (not (test (cadr form)))) + ((and) (let loop ((form (cdr form))) + (or (null? form) + (and (test (car form)) (loop (cdr form)))))) + ((or) (let loop ((form (cdr form))) + (and (pair? form) + (or (test (car form)) (loop (cdr form)))))) + (else #f))))))) + (let loop ((clauses (cdr form))) + (if (null? clauses) + #undefined + (if (test (caar clauses)) + `(,(make-identifier 'begin default-environment) ,@(cdar clauses)) + (loop (cdr clauses)))))))) + + (define-transformer '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 found" name))))) + (letrec + ((extract + (lambda (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) `(,(car x) . ,(cadr x))) (cddr spec)))) + (map (lambda (s) (or (assq (car s) renames) s)) alist))) + ((prefix) + (let ((alist (collect (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) (cons x x)) + (library-exports (getlib spec)))))))) + (letrec + ((import + (lambda (spec) + (let ((lib (extract spec)) + (alist (collect spec))) + (for-each + (lambda (slot) + (library-import lib (cdr slot) (car slot))) + alist))))) + (for-each import (cdr form))))))) + + (define-transformer 'export + (lambda (form _) + (letrec + ((collect + (lambda (spec) + (cond + ((symbol? spec) + `(,spec . ,spec)) + ((and (list? spec) (= (length spec) 3) (eq? (car spec) 'rename)) + `(,(list-ref spec 1) . ,(list-ref spec 2))) + (else + (error "malformed export"))))) + (export (lambda (spec) - (let ((lib (extract spec)) - (alist (collect spec))) - (for-each - (lambda (slot) - (library-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 . ,spec)) - ((and (list? spec) (= (length spec) 3) (eq? (car spec) 'rename)) - `(,(list-ref spec 1) . ,(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))))) + (let ((slot (collect spec))) + (library-export (car slot) (cdr slot)))))) + (for-each export (cdr form)))))) -;;; bootstrap... -(let () - (make-library '(picrin base)) - (set-car! (dictionary-ref *libraries* (mangle '(picrin base))) default-environment) - (let ((export-keywords - (lambda (keywords) - (let ((env (library-environment '(picrin base))) - (exports (library-exports '(picrin base)))) - (for-each - (lambda (keyword) - (dictionary-set! exports keyword keyword)) - keywords))))) - (export-keywords - '(define lambda quote set! if begin define-macro - let let* letrec letrec* - let-values let*-values define-values - quasiquote unquote unquote-splicing - and or - cond case else => - do when unless - parameterize - define-syntax - syntax-quote syntax-unquote - syntax-quasiquote syntax-unquote-splicing - let-syntax letrec-syntax - syntax-error)) - (export-keywords - '(features - eq? eqv? equal? 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 current-output-port current-error-port - port? input-port? output-port? port-open? close-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-output-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-environment - vector? vector make-vector vector-length vector-ref vector-set! - vector-copy! vector-copy vector-append vector-fill! vector-map vector-for-each - list->vector vector->list string->vector vector->string - bytevector? bytevector make-bytevector - bytevector-length bytevector-u8-ref bytevector-u8-set! - bytevector-copy! bytevector-copy bytevector-append - bytevector->list list->bytevector - call-with-current-continuation call/cc values call-with-values - char? char->integer integer->char char=? char? char<=? char>=? - current-exception-handlers with-exception-handler - raise raise-continuable error - error-object? error-object-message error-object-irritants - error-object-type - string? string make-string string-length string-ref string-set! - string-copy string-copy! string-fill! string-append - string-map string-for-each list->string string->list - string=? string? string<=? string>=? - make-parameter with-dynamic-environment - read - make-dictionary dictionary? dictionary dictionary-has? - dictionary-ref dictionary-set! dictionary-delete! dictionary-size - dictionary-map dictionary-for-each - dictionary->alist alist->dictionary dictionary->plist plist->dictionary - make-record record? record-type record-datum - default-environment make-environment find-identifier set-identifier! - eval compile add-macro! - make-ephemeron-table - write write-simple write-shared display)) - (export-keywords - '(find-library make-library current-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))) - + ;; bootstrap... + (let () + (make-library '(picrin base)) + (set-car! (dictionary-ref *libraries* (mangle '(picrin base))) default-environment) + (let ((export-keywords + (lambda (keywords) + (let ((env (library-environment '(picrin base))) + (exports (library-exports '(picrin base)))) + (for-each + (lambda (keyword) + (dictionary-set! exports keyword keyword)) + keywords))))) + (export-keywords + '(define lambda quote set! if begin define-macro + let let* letrec letrec* + let-values let*-values define-values + quasiquote unquote unquote-splicing + and or + cond case else => + do when unless + parameterize + define-syntax + syntax-quote syntax-unquote + syntax-quasiquote syntax-unquote-splicing + let-syntax letrec-syntax + syntax-error)) + (export-keywords + '(features + eq? eqv? equal? 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 current-output-port current-error-port + port? input-port? output-port? port-open? close-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-output-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-environment + vector? vector make-vector vector-length vector-ref vector-set! + vector-copy! vector-copy vector-append vector-fill! vector-map vector-for-each + list->vector vector->list string->vector vector->string + bytevector? bytevector make-bytevector + bytevector-length bytevector-u8-ref bytevector-u8-set! + bytevector-copy! bytevector-copy bytevector-append + bytevector->list list->bytevector + call-with-current-continuation call/cc values call-with-values + char? char->integer integer->char char=? char? char<=? char>=? + current-exception-handlers with-exception-handler + raise raise-continuable error + error-object? error-object-message error-object-irritants + error-object-type + string? string make-string string-length string-ref string-set! + string-copy string-copy! string-fill! string-append + string-map string-for-each list->string string->list + string=? string? string<=? string>=? + make-parameter with-dynamic-environment + read + make-dictionary dictionary? dictionary dictionary-has? + dictionary-ref dictionary-set! dictionary-delete! dictionary-size + dictionary-map dictionary-for-each + dictionary->alist alist->dictionary dictionary->plist plist->dictionary + make-record record? record-type record-datum + default-environment make-environment find-identifier set-identifier! + eval compile add-macro! + make-ephemeron-table + write write-simple write-shared display)) + (export-keywords + '(find-library make-library current-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)))) diff --git a/src/tiny-main.c b/src/tiny-main.c index 253af54e..a2997566 100644 --- a/src/tiny-main.c +++ b/src/tiny-main.c @@ -14,6 +14,9 @@ main() pic = pic_open(pic_default_allocf, NULL); + pic_printf(pic, "~s\n", pic_funcall(pic, "compile", 1, pic_read(pic, pic_stdin(pic)))); + return 0; + pic_try { while (1) { size_t ai = pic_enter(pic); diff --git a/tools/mkboot.scm b/tools/mkboot.scm index dcac2e2a..fbca5cec 100644 --- a/tools/mkboot.scm +++ b/tools/mkboot.scm @@ -1,9 +1,9 @@ (import (scheme base) (scheme read) (scheme write) - (scheme file)) + (only (picrin base) compile)) -(define (generate-rom filename) +(define (generate-rom) (define (with-output-to-string thunk) (let ((port (open-output-string))) @@ -13,23 +13,10 @@ (close-port port) s)))) - (define exprs - (with-input-from-file filename - (lambda () - (let loop ((acc '())) - (let ((e (read))) - (if (eof-object? e) - (reverse acc) - (loop (cons e acc)))))))) - (define text (with-output-to-string (lambda () - (for-each - (lambda (e) - (write e) - (write-string " ")) - exprs)))) + (write (compile (read)))))) (define (escape-string s) (with-output-to-string @@ -65,12 +52,12 @@ "#include \"picrin/extra.h\"" "" "static const char boot_rom[][80] = {" - ,(generate-rom "piclib/boot3.scm") + ,(generate-rom) "};" "" "#if PIC_USE_LIBRARY" "static const char boot_library_rom[][80] = {" - ,(generate-rom "piclib/library.scm") + ,(generate-rom) "};" "#endif" "" @@ -79,7 +66,7 @@ "{" " 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]);" + " pic_call(pic, pic_compile(pic, pic_read_cstr(pic, &boot_library_rom[0][0])), 0);" "#endif" "}"))