psyntax-pp.scm 238 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476
  1. (eval-when (compile) (set-current-module (resolve-module (quote (guile)))))
  2. (if #f #f)
  3. (let ((syntax? (module-ref (current-module) 'syntax?))
  4. (make-syntax (module-ref (current-module) 'make-syntax))
  5. (syntax-expression (module-ref (current-module) 'syntax-expression))
  6. (syntax-wrap (module-ref (current-module) 'syntax-wrap))
  7. (syntax-module (module-ref (current-module) 'syntax-module))
  8. (syntax-sourcev (module-ref (current-module) 'syntax-sourcev)))
  9. (letrec* ((make-void (lambda (src) (make-struct/simple (vector-ref %expanded-vtables 0) src)))
  10. (make-const (lambda (src exp) (make-struct/simple (vector-ref %expanded-vtables 1) src exp)))
  11. (make-primitive-ref (lambda (src name) (make-struct/simple (vector-ref %expanded-vtables 2) src name)))
  12. (make-lexical-ref
  13. (lambda (src name gensym) (make-struct/simple (vector-ref %expanded-vtables 3) src name gensym)))
  14. (make-lexical-set
  15. (lambda (src name gensym exp) (make-struct/simple (vector-ref %expanded-vtables 4) src name gensym exp)))
  16. (make-module-ref
  17. (lambda (src mod name public?) (make-struct/simple (vector-ref %expanded-vtables 5) src mod name public?)))
  18. (make-module-set
  19. (lambda (src mod name public? exp)
  20. (make-struct/simple (vector-ref %expanded-vtables 6) src mod name public? exp)))
  21. (make-toplevel-ref
  22. (lambda (src mod name) (make-struct/simple (vector-ref %expanded-vtables 7) src mod name)))
  23. (make-toplevel-set
  24. (lambda (src mod name exp) (make-struct/simple (vector-ref %expanded-vtables 8) src mod name exp)))
  25. (make-toplevel-define
  26. (lambda (src mod name exp) (make-struct/simple (vector-ref %expanded-vtables 9) src mod name exp)))
  27. (make-conditional
  28. (lambda (src test consequent alternate)
  29. (make-struct/simple (vector-ref %expanded-vtables 10) src test consequent alternate)))
  30. (make-call (lambda (src proc args) (make-struct/simple (vector-ref %expanded-vtables 11) src proc args)))
  31. (make-primcall
  32. (lambda (src name args) (make-struct/simple (vector-ref %expanded-vtables 12) src name args)))
  33. (make-seq (lambda (src head tail) (make-struct/simple (vector-ref %expanded-vtables 13) src head tail)))
  34. (make-lambda (lambda (src meta body) (make-struct/simple (vector-ref %expanded-vtables 14) src meta body)))
  35. (make-lambda-case
  36. (lambda (src req opt rest kw inits gensyms body alternate)
  37. (make-struct/simple (vector-ref %expanded-vtables 15) src req opt rest kw inits gensyms body alternate)))
  38. (make-let
  39. (lambda (src names gensyms vals body)
  40. (make-struct/simple (vector-ref %expanded-vtables 16) src names gensyms vals body)))
  41. (make-letrec
  42. (lambda (src in-order? names gensyms vals body)
  43. (make-struct/simple (vector-ref %expanded-vtables 17) src in-order? names gensyms vals body)))
  44. (lambda? (lambda (x) (and (struct? x) (eq? (struct-vtable x) (vector-ref %expanded-vtables 14)))))
  45. (lambda-src (lambda (x) (struct-ref x 0)))
  46. (lambda-meta (lambda (x) (struct-ref x 1)))
  47. (lambda-body (lambda (x) (struct-ref x 2)))
  48. (top-level-eval (lambda (x mod) (primitive-eval x)))
  49. (local-eval (lambda (x mod) (primitive-eval x)))
  50. (global-extend
  51. (lambda (type sym val) (module-define! (current-module) sym (make-syntax-transformer sym type val))))
  52. (sourcev-filename (lambda (s) (vector-ref s 0)))
  53. (sourcev-line (lambda (s) (vector-ref s 1)))
  54. (sourcev-column (lambda (s) (vector-ref s 2)))
  55. (sourcev->alist
  56. (lambda (sourcev)
  57. (letrec* ((maybe-acons (lambda (k v tail) (if v (acons k v tail) tail))))
  58. (and sourcev
  59. (maybe-acons
  60. 'filename
  61. (sourcev-filename sourcev)
  62. (list (cons 'line (sourcev-line sourcev)) (cons 'column (sourcev-column sourcev))))))))
  63. (maybe-name-value
  64. (lambda (name val)
  65. (if (lambda? val)
  66. (let ((meta (lambda-meta val)))
  67. (if (assq 'name meta) val (make-lambda (lambda-src val) (acons 'name name meta) (lambda-body val))))
  68. val)))
  69. (build-void make-void)
  70. (build-call make-call)
  71. (build-conditional make-conditional)
  72. (build-lexical-reference make-lexical-ref)
  73. (build-lexical-assignment
  74. (lambda (src name var exp) (make-lexical-set src name var (maybe-name-value name exp))))
  75. (analyze-variable
  76. (lambda (mod var modref-cont bare-cont)
  77. (let* ((v mod)
  78. (fk (lambda ()
  79. (let ((fk (lambda ()
  80. (let ((fk (lambda ()
  81. (let ((fk (lambda () (error "value failed to match" v))))
  82. (if (pair? v)
  83. (let ((vx (car v)) (vy (cdr v)))
  84. (if (eq? vx 'primitive)
  85. (syntax-violation
  86. #f
  87. "primitive not in operator position"
  88. var)
  89. (fk)))
  90. (fk))))))
  91. (if (pair? v)
  92. (let ((vx (car v)) (vy (cdr v)))
  93. (let ((tk (lambda ()
  94. (let ((mod vy))
  95. (if (equal? mod (module-name (current-module)))
  96. (bare-cont mod var)
  97. (modref-cont mod var #f))))))
  98. (if (eq? vx 'private)
  99. (tk)
  100. (let ((tk (lambda () (tk)))) (if (eq? vx 'hygiene) (tk) (fk))))))
  101. (fk))))))
  102. (if (pair? v)
  103. (let ((vx (car v)) (vy (cdr v)))
  104. (if (eq? vx 'public) (let ((mod vy)) (modref-cont mod var #t)) (fk)))
  105. (fk))))))
  106. (if (eq? v #f) (bare-cont #f var) (fk)))))
  107. (build-global-reference
  108. (lambda (src var mod)
  109. (analyze-variable
  110. mod
  111. var
  112. (lambda (mod var public?) (make-module-ref src mod var public?))
  113. (lambda (mod var) (make-toplevel-ref src mod var)))))
  114. (build-global-assignment
  115. (lambda (src var exp mod)
  116. (let ((exp (maybe-name-value var exp)))
  117. (analyze-variable
  118. mod
  119. var
  120. (lambda (mod var public?) (make-module-set src mod var public? exp))
  121. (lambda (mod var) (make-toplevel-set src mod var exp))))))
  122. (build-global-definition
  123. (lambda (src mod var exp) (make-toplevel-define src (and mod (cdr mod)) var (maybe-name-value var exp))))
  124. (build-simple-lambda
  125. (lambda (src req rest vars meta exp)
  126. (make-lambda src meta (make-lambda-case src req #f rest #f '() vars exp #f))))
  127. (build-case-lambda make-lambda)
  128. (build-lambda-case make-lambda-case)
  129. (build-primcall make-primcall)
  130. (build-primref make-primitive-ref)
  131. (build-data make-const)
  132. (build-sequence
  133. (lambda (src exps)
  134. (let* ((v exps)
  135. (fk (lambda ()
  136. (let ((fk (lambda () (error "value failed to match" v))))
  137. (if (pair? v)
  138. (let ((vx (car v)) (vy (cdr v)))
  139. (let* ((head vx) (tail vy)) (make-seq src head (build-sequence #f tail))))
  140. (fk))))))
  141. (if (pair? v) (let ((vx (car v)) (vy (cdr v))) (let ((tail vx)) (if (null? vy) tail (fk)))) (fk)))))
  142. (build-let
  143. (lambda (src ids vars val-exps body-exp)
  144. (let* ((v (map maybe-name-value ids val-exps))
  145. (fk (lambda ()
  146. (let* ((fk (lambda () (error "value failed to match" v))) (val-exps v))
  147. (make-let src ids vars val-exps body-exp)))))
  148. (if (null? v) body-exp (fk)))))
  149. (build-named-let
  150. (lambda (src ids vars val-exps body-exp)
  151. (let* ((v vars) (fk (lambda () (error "value failed to match" v))))
  152. (if (pair? v)
  153. (let ((vx (car v)) (vy (cdr v)))
  154. (let* ((f vx) (vars vy) (v ids) (fk (lambda () (error "value failed to match" v))))
  155. (if (pair? v)
  156. (let ((vx (car v)) (vy (cdr v)))
  157. (let* ((f-name vx) (ids vy) (proc (build-simple-lambda src ids #f vars '() body-exp)))
  158. (make-letrec
  159. src
  160. #f
  161. (list f-name)
  162. (list f)
  163. (list (maybe-name-value f-name proc))
  164. (build-call
  165. src
  166. (build-lexical-reference src f-name f)
  167. (map maybe-name-value ids val-exps)))))
  168. (fk))))
  169. (fk)))))
  170. (build-letrec
  171. (lambda (src in-order? ids vars val-exps body-exp)
  172. (let* ((v (map maybe-name-value ids val-exps))
  173. (fk (lambda ()
  174. (let* ((fk (lambda () (error "value failed to match" v))) (val-exps v))
  175. (make-letrec src in-order? ids vars val-exps body-exp)))))
  176. (if (null? v) body-exp (fk)))))
  177. (gen-lexical (lambda (id) (module-gensym (symbol->string id))))
  178. (no-source #f)
  179. (datum-sourcev
  180. (lambda (datum)
  181. (let ((props (source-properties datum)))
  182. (and (pair? props) (vector (assq-ref props 'filename) (assq-ref props 'line) (assq-ref props 'column))))))
  183. (source-annotation (lambda (x) (if (syntax? x) (syntax-sourcev x) (datum-sourcev x))))
  184. (binding-type (lambda (x) (car x)))
  185. (binding-value (lambda (x) (cdr x)))
  186. (null-env '())
  187. (extend-env
  188. (lambda (labels bindings r)
  189. (let* ((v labels)
  190. (fk (lambda ()
  191. (let ((fk (lambda () (error "value failed to match" v))))
  192. (if (pair? v)
  193. (let ((vx (car v)) (vy (cdr v)))
  194. (let* ((label vx)
  195. (labels vy)
  196. (v bindings)
  197. (fk (lambda () (error "value failed to match" v))))
  198. (if (pair? v)
  199. (let ((vx (car v)) (vy (cdr v)))
  200. (let* ((binding vx) (bindings vy))
  201. (extend-env labels bindings (acons label binding r))))
  202. (fk))))
  203. (fk))))))
  204. (if (null? v) r (fk)))))
  205. (extend-var-env
  206. (lambda (labels vars r)
  207. (let* ((v labels)
  208. (fk (lambda ()
  209. (let ((fk (lambda () (error "value failed to match" v))))
  210. (if (pair? v)
  211. (let ((vx (car v)) (vy (cdr v)))
  212. (let* ((label vx)
  213. (labels vy)
  214. (v vars)
  215. (fk (lambda () (error "value failed to match" v))))
  216. (if (pair? v)
  217. (let ((vx (car v)) (vy (cdr v)))
  218. (let* ((var vx) (vars vy))
  219. (extend-var-env labels vars (acons label (cons 'lexical var) r))))
  220. (fk))))
  221. (fk))))))
  222. (if (null? v) r (fk)))))
  223. (macros-only-env
  224. (lambda (r)
  225. (let* ((v r)
  226. (fk (lambda ()
  227. (let ((fk (lambda () (error "value failed to match" v))))
  228. (if (pair? v)
  229. (let ((vx (car v)) (vy (cdr v)))
  230. (let* ((a vx)
  231. (r vy)
  232. (v a)
  233. (fk (lambda ()
  234. (let ((fk (lambda () (error "value failed to match" v))))
  235. (macros-only-env r)))))
  236. (if (pair? v)
  237. (let ((vx (car v)) (vy (cdr v)))
  238. (let ((k vx))
  239. (if (pair? vy)
  240. (let ((vx (car vy)) (vy (cdr vy)))
  241. (let ((tk (lambda () (cons a (macros-only-env r)))))
  242. (if (eq? vx 'macro)
  243. (tk)
  244. (let ((tk (lambda () (tk))))
  245. (if (eq? vx 'syntax-parameter)
  246. (tk)
  247. (let ((tk (lambda () (tk))))
  248. (if (eq? vx 'ellipsis) (tk) (fk))))))))
  249. (fk))))
  250. (fk))))
  251. (fk))))))
  252. (if (null? v) '() (fk)))))
  253. (nonsymbol-id? (lambda (x) (and (syntax? x) (symbol? (syntax-expression x)))))
  254. (id? (lambda (x) (if (symbol? x) #t (and (syntax? x) (symbol? (syntax-expression x))))))
  255. (id-sym-name (lambda (x) (if (syntax? x) (syntax-expression x) x)))
  256. (id-sym-name&marks
  257. (lambda (x w)
  258. (if (syntax? x)
  259. (values (syntax-expression x) (join-marks (wrap-marks w) (wrap-marks (syntax-wrap x))))
  260. (values x (wrap-marks w)))))
  261. (make-wrap (lambda (marks subst) (cons marks subst)))
  262. (wrap-marks (lambda (wrap) (car wrap)))
  263. (wrap-subst (lambda (wrap) (cdr wrap)))
  264. (gen-unique
  265. (lambda* (#:optional (module (current-module)))
  266. (if module
  267. (vector (module-name module) (module-generate-unique-id! module))
  268. (vector '(guile) (gensym "id")))))
  269. (gen-label (lambda () (gen-unique)))
  270. (gen-labels
  271. (lambda (ls)
  272. (let* ((v ls)
  273. (fk (lambda ()
  274. (let ((fk (lambda () (error "value failed to match" v))))
  275. (if (pair? v)
  276. (let ((vx (car v)) (vy (cdr v))) (let ((ls vy)) (cons (gen-label) (gen-labels ls))))
  277. (fk))))))
  278. (if (null? v) '() (fk)))))
  279. (make-ribcage (lambda (symnames marks labels) (vector 'ribcage symnames marks labels)))
  280. (ribcage-symnames (lambda (ribcage) (vector-ref ribcage 1)))
  281. (ribcage-marks (lambda (ribcage) (vector-ref ribcage 2)))
  282. (ribcage-labels (lambda (ribcage) (vector-ref ribcage 3)))
  283. (set-ribcage-symnames! (lambda (ribcage x) (vector-set! ribcage 1 x)))
  284. (set-ribcage-marks! (lambda (ribcage x) (vector-set! ribcage 2 x)))
  285. (set-ribcage-labels! (lambda (ribcage x) (vector-set! ribcage 3 x)))
  286. (empty-wrap '(()))
  287. (top-wrap '((top)))
  288. (the-anti-mark #f)
  289. (anti-mark (lambda (w) (make-wrap (cons the-anti-mark (wrap-marks w)) (cons 'shift (wrap-subst w)))))
  290. (new-mark (lambda () (gen-unique)))
  291. (make-empty-ribcage (lambda () (make-ribcage '() '() '())))
  292. (extend-ribcage!
  293. (lambda (ribcage id label)
  294. (set-ribcage-symnames! ribcage (cons (syntax-expression id) (ribcage-symnames ribcage)))
  295. (set-ribcage-marks! ribcage (cons (wrap-marks (syntax-wrap id)) (ribcage-marks ribcage)))
  296. (set-ribcage-labels! ribcage (cons label (ribcage-labels ribcage)))))
  297. (make-binding-wrap
  298. (lambda (ids labels w)
  299. (let* ((v ids)
  300. (fk (lambda ()
  301. (let ((fk (lambda () (error "value failed to match" v))))
  302. (if (pair? v)
  303. (let ((vx (car v)) (vy (cdr v)))
  304. (make-wrap
  305. (wrap-marks w)
  306. (cons (let* ((labelvec (list->vector labels))
  307. (n (vector-length labelvec))
  308. (symnamevec (make-vector n))
  309. (marksvec (make-vector n)))
  310. (let f ((ids ids) (i 0))
  311. (let* ((v ids)
  312. (fk (lambda ()
  313. (let ((fk (lambda () (error "value failed to match" v))))
  314. (if (pair? v)
  315. (let ((vx (car v)) (vy (cdr v)))
  316. (let* ((id vx) (ids vy))
  317. (call-with-values
  318. (lambda () (id-sym-name&marks id w))
  319. (lambda (symname marks)
  320. (vector-set! symnamevec i symname)
  321. (vector-set! marksvec i marks)
  322. (f ids (#{1+}# i))))))
  323. (fk))))))
  324. (if (null? v) (make-ribcage symnamevec marksvec labelvec) (fk)))))
  325. (wrap-subst w))))
  326. (fk))))))
  327. (if (null? v) w (fk)))))
  328. (smart-append (lambda (m1 m2) (if (null? m2) m1 (append m1 m2))))
  329. (join-wraps
  330. (lambda (w1 w2)
  331. (let ((m1 (wrap-marks w1)) (s1 (wrap-subst w1)))
  332. (if (null? m1)
  333. (if (null? s1) w2 (make-wrap (wrap-marks w2) (smart-append s1 (wrap-subst w2))))
  334. (make-wrap (smart-append m1 (wrap-marks w2)) (smart-append s1 (wrap-subst w2)))))))
  335. (join-marks (lambda (m1 m2) (smart-append m1 m2)))
  336. (same-marks?
  337. (lambda (x y)
  338. (or (eq? x y) (and (not (null? x)) (not (null? y)) (eq? (car x) (car y)) (same-marks? (cdr x) (cdr y))))))
  339. (id-var-name
  340. (lambda (id w mod)
  341. (letrec* ((search
  342. (lambda (sym subst marks)
  343. (let* ((v subst)
  344. (fk (lambda ()
  345. (let ((fk (lambda ()
  346. (let ((fk (lambda () (error "value failed to match" v))))
  347. (if (pair? v)
  348. (let ((vx (car v)) (vy (cdr v)))
  349. (if (and (vector? vx)
  350. (eq? (vector-length vx)
  351. (length '('ribcage rsymnames rmarks rlabels))))
  352. (if (eq? (vector-ref vx 0) 'ribcage)
  353. (let* ((rsymnames (vector-ref vx (#{1+}# 0)))
  354. (rmarks (vector-ref vx (#{1+}# (#{1+}# 0))))
  355. (rlabels
  356. (vector-ref
  357. vx
  358. (#{1+}# (#{1+}# (#{1+}# 0)))))
  359. (subst vy))
  360. (letrec* ((search-list-rib
  361. (lambda ()
  362. (let lp ((rsymnames rsymnames)
  363. (rmarks rmarks)
  364. (rlabels rlabels))
  365. (let* ((v rsymnames)
  366. (fk (lambda ()
  367. (let ((fk (lambda ()
  368. (error "value failed to match"
  369. v))))
  370. (if (pair? v)
  371. (let ((vx (car v))
  372. (vy (cdr v)))
  373. (let* ((rsym vx)
  374. (rsymnames
  375. vy)
  376. (v rmarks)
  377. (fk (lambda ()
  378. (error "value failed to match"
  379. v))))
  380. (if (pair? v)
  381. (let ((vx (car v))
  382. (vy (cdr v)))
  383. (let* ((rmarks1
  384. vx)
  385. (rmarks
  386. vy)
  387. (v rlabels)
  388. (fk (lambda ()
  389. (error "value failed to match"
  390. v))))
  391. (if (pair? v)
  392. (let ((vx (car v))
  393. (vy (cdr v)))
  394. (let* ((label vx)
  395. (rlabels
  396. vy))
  397. (if (and (eq? sym
  398. rsym)
  399. (same-marks?
  400. marks
  401. rmarks1))
  402. (let* ((v label)
  403. (fk (lambda ()
  404. (let ((fk (lambda ()
  405. (error "value failed to match"
  406. v))))
  407. label))))
  408. (if (pair? v)
  409. (let ((vx (car v))
  410. (vy (cdr v)))
  411. (let* ((mod* vx)
  412. (label vy))
  413. (if (equal?
  414. mod*
  415. mod)
  416. label
  417. (lp rsymnames
  418. rmarks
  419. rlabels))))
  420. (fk)))
  421. (lp rsymnames
  422. rmarks
  423. rlabels))))
  424. (fk))))
  425. (fk))))
  426. (fk))))))
  427. (if (null? v)
  428. (search sym subst marks)
  429. (fk))))))
  430. (search-vector-rib
  431. (lambda ()
  432. (let ((n (vector-length rsymnames)))
  433. (let lp ((i 0))
  434. (cond
  435. ((= i n)
  436. (search sym subst marks))
  437. ((and (eq? (vector-ref
  438. rsymnames
  439. i)
  440. sym)
  441. (same-marks?
  442. marks
  443. (vector-ref rmarks i)))
  444. (let* ((v (vector-ref
  445. rlabels
  446. i))
  447. (fk (lambda ()
  448. (let* ((fk (lambda ()
  449. (error "value failed to match"
  450. v)))
  451. (label v))
  452. label))))
  453. (if (pair? v)
  454. (let ((vx (car v))
  455. (vy (cdr v)))
  456. (let* ((mod* vx)
  457. (label vy))
  458. (if (equal?
  459. mod*
  460. mod)
  461. label
  462. (lp (#{1+}# i)))))
  463. (fk))))
  464. (else (lp (#{1+}# i)))))))))
  465. (if (vector? rsymnames)
  466. (search-vector-rib)
  467. (search-list-rib))))
  468. (fk))
  469. (fk)))
  470. (fk))))))
  471. (if (pair? v)
  472. (let ((vx (car v)) (vy (cdr v)))
  473. (if (eq? vx 'shift)
  474. (let* ((subst vy)
  475. (v marks)
  476. (fk (lambda () (error "value failed to match" v))))
  477. (if (pair? v)
  478. (let ((vx (car v)) (vy (cdr v)))
  479. (let ((marks vy)) (search sym subst marks)))
  480. (fk)))
  481. (fk)))
  482. (fk))))))
  483. (if (null? v) #f (fk))))))
  484. (cond
  485. ((symbol? id) (or (search id (wrap-subst w) (wrap-marks w)) id))
  486. ((syntax? id)
  487. (let ((id (syntax-expression id)) (w1 (syntax-wrap id)) (mod (or (syntax-module id) mod)))
  488. (let ((marks (join-marks (wrap-marks w) (wrap-marks w1))))
  489. (or (search id (wrap-subst w) marks) (search id (wrap-subst w1) marks) id))))
  490. (else (syntax-violation 'id-var-name "invalid id" id))))))
  491. (locally-bound-identifiers
  492. (lambda (w mod)
  493. (let scan ((subst (wrap-subst w)) (results '()))
  494. (let* ((v subst)
  495. (fk (lambda ()
  496. (let ((fk (lambda ()
  497. (let ((fk (lambda () (error "value failed to match" v))))
  498. (if (pair? v)
  499. (let ((vx (car v)) (vy (cdr v)))
  500. (if (and (vector? vx)
  501. (eq? (vector-length vx)
  502. (length '('ribcage symnames marks labels))))
  503. (if (eq? (vector-ref vx 0) 'ribcage)
  504. (let* ((symnames (vector-ref vx (#{1+}# 0)))
  505. (marks (vector-ref vx (#{1+}# (#{1+}# 0))))
  506. (labels (vector-ref vx (#{1+}# (#{1+}# (#{1+}# 0)))))
  507. (subst* vy))
  508. (letrec* ((scan-list-rib
  509. (lambda ()
  510. (let lp ((symnames symnames)
  511. (marks marks)
  512. (results results))
  513. (let* ((v symnames)
  514. (fk (lambda ()
  515. (let ((fk (lambda ()
  516. (error "value failed to match"
  517. v))))
  518. (if (pair? v)
  519. (let ((vx (car v))
  520. (vy (cdr v)))
  521. (let* ((sym vx)
  522. (symnames vy)
  523. (v marks)
  524. (fk (lambda ()
  525. (error "value failed to match"
  526. v))))
  527. (if (pair? v)
  528. (let ((vx (car v))
  529. (vy (cdr v)))
  530. (let* ((m vx)
  531. (marks vy))
  532. (lp symnames
  533. marks
  534. (cons (wrap sym
  535. (anti-mark
  536. (make-wrap
  537. m
  538. subst))
  539. mod)
  540. results))))
  541. (fk))))
  542. (fk))))))
  543. (if (null? v) (scan subst* results) (fk))))))
  544. (scan-vector-rib
  545. (lambda ()
  546. (let ((n (vector-length symnames)))
  547. (let lp ((i 0) (results results))
  548. (if (= i n)
  549. (scan subst* results)
  550. (lp (#{1+}# i)
  551. (let ((sym (vector-ref symnames i))
  552. (m (vector-ref marks i)))
  553. (cons (wrap sym
  554. (anti-mark
  555. (make-wrap m subst))
  556. mod)
  557. results)))))))))
  558. (if (vector? symnames) (scan-vector-rib) (scan-list-rib))))
  559. (fk))
  560. (fk)))
  561. (fk))))))
  562. (if (pair? v)
  563. (let ((vx (car v)) (vy (cdr v)))
  564. (if (eq? vx 'shift) (let ((subst vy)) (scan subst results)) (fk)))
  565. (fk))))))
  566. (if (null? v) results (fk))))))
  567. (resolve-identifier
  568. (lambda (id w r mod resolve-syntax-parameters?)
  569. (letrec* ((resolve-global
  570. (lambda (var mod)
  571. (if (and (not mod) (current-module))
  572. (warn "module system is booted, we should have a module" var))
  573. (let ((v (and (not (equal? mod '(primitive)))
  574. (module-variable (if mod (resolve-module (cdr mod)) (current-module)) var))))
  575. (if (and v (variable-bound? v) (macro? (variable-ref v)))
  576. (let* ((m (variable-ref v)) (type (macro-type m)) (trans (macro-binding m)))
  577. (if (eq? type 'syntax-parameter)
  578. (if resolve-syntax-parameters?
  579. (let ((lexical (assq-ref r v)))
  580. (values 'macro (if lexical (binding-value lexical) trans) mod))
  581. (values type v mod))
  582. (values type trans mod)))
  583. (values 'global var mod)))))
  584. (resolve-lexical
  585. (lambda (label mod)
  586. (let ((b (assq-ref r label)))
  587. (if b
  588. (let ((type (binding-type b)) (value (binding-value b)))
  589. (if (eq? type 'syntax-parameter)
  590. (if resolve-syntax-parameters?
  591. (values 'macro value mod)
  592. (values type label mod))
  593. (values type value mod)))
  594. (values 'displaced-lexical #f #f))))))
  595. (let ((n (id-var-name id w mod)))
  596. (cond
  597. ((syntax? n)
  598. (if (not (eq? n id))
  599. (resolve-identifier n w r mod resolve-syntax-parameters?)
  600. (resolve-identifier
  601. (syntax-expression n)
  602. (syntax-wrap n)
  603. r
  604. (or (syntax-module n) mod)
  605. resolve-syntax-parameters?)))
  606. ((symbol? n) (resolve-global n (or (and (syntax? id) (syntax-module id)) mod)))
  607. (else (resolve-lexical n (or (and (syntax? id) (syntax-module id)) mod))))))))
  608. (transformer-environment
  609. (make-fluid (lambda (k) (error "called outside the dynamic extent of a syntax transformer"))))
  610. (with-transformer-environment (lambda (k) ((fluid-ref transformer-environment) k)))
  611. (free-id=?
  612. (lambda (i j)
  613. (let* ((mi (and (syntax? i) (syntax-module i)))
  614. (mj (and (syntax? j) (syntax-module j)))
  615. (ni (id-var-name i empty-wrap mi))
  616. (nj (id-var-name j empty-wrap mj)))
  617. (letrec* ((id-module-binding
  618. (lambda (id mod)
  619. (module-variable (if mod (resolve-module (cdr mod)) (current-module)) (id-sym-name id)))))
  620. (cond
  621. ((syntax? ni) (free-id=? ni j))
  622. ((syntax? nj) (free-id=? i nj))
  623. ((symbol? ni)
  624. (and (eq? nj (id-sym-name j))
  625. (let ((bi (id-module-binding i mi)) (bj (id-module-binding j mj)))
  626. (and (eq? bi bj) (or bi (eq? ni nj))))))
  627. (else (equal? ni nj)))))))
  628. (bound-id=?
  629. (lambda (i j)
  630. (if (and (syntax? i) (syntax? j))
  631. (and (eq? (syntax-expression i) (syntax-expression j))
  632. (same-marks? (wrap-marks (syntax-wrap i)) (wrap-marks (syntax-wrap j))))
  633. (eq? i j))))
  634. (valid-bound-ids?
  635. (lambda (ids)
  636. (and (let all-ids? ((ids ids))
  637. (let* ((v ids)
  638. (fk (lambda ()
  639. (let ((fk (lambda () (error "value failed to match" v))))
  640. (if (pair? v)
  641. (let ((vx (car v)) (vy (cdr v)))
  642. (let* ((id vx) (ids vy)) (and (id? id) (all-ids? ids))))
  643. (fk))))))
  644. (if (null? v) #t (fk))))
  645. (distinct-bound-ids? ids))))
  646. (distinct-bound-ids?
  647. (lambda (ids)
  648. (let distinct? ((ids ids))
  649. (let* ((v ids)
  650. (fk (lambda ()
  651. (let ((fk (lambda () (error "value failed to match" v))))
  652. (if (pair? v)
  653. (let ((vx (car v)) (vy (cdr v)))
  654. (let* ((id vx) (ids vy)) (and (not (bound-id-member? id ids)) (distinct? ids))))
  655. (fk))))))
  656. (if (null? v) #t (fk))))))
  657. (bound-id-member?
  658. (lambda (x ids)
  659. (let* ((v ids)
  660. (fk (lambda ()
  661. (let ((fk (lambda () (error "value failed to match" v))))
  662. (if (pair? v)
  663. (let ((vx (car v)) (vy (cdr v)))
  664. (let* ((id vx) (ids vy)) (or (bound-id=? x id) (bound-id-member? x ids))))
  665. (fk))))))
  666. (if (null? v) #f (fk)))))
  667. (wrap (lambda (x w defmod) (source-wrap x w #f defmod)))
  668. (wrap-syntax
  669. (lambda (x w defmod)
  670. (make-syntax (syntax-expression x) w (or (syntax-module x) defmod) (syntax-sourcev x))))
  671. (source-wrap
  672. (lambda (x w s defmod)
  673. (cond
  674. ((and (null? (wrap-marks w)) (null? (wrap-subst w)) (not defmod) (not s)) x)
  675. ((syntax? x) (wrap-syntax x (join-wraps w (syntax-wrap x)) defmod))
  676. ((null? x) x)
  677. (else (make-syntax x w defmod s)))))
  678. (expand-sequence
  679. (lambda (body r w s mod)
  680. (build-sequence
  681. s
  682. (let lp ((body body))
  683. (let* ((v body)
  684. (fk (lambda ()
  685. (let ((fk (lambda () (error "value failed to match" v))))
  686. (if (pair? v)
  687. (let ((vx (car v)) (vy (cdr v)))
  688. (let* ((head vx) (tail vy) (expr (expand head r w mod))) (cons expr (lp tail))))
  689. (fk))))))
  690. (if (null? v) '() (fk)))))))
  691. (expand-top-sequence
  692. (lambda (body r w s m esew mod)
  693. (let* ((r (cons '("placeholder" placeholder) r))
  694. (ribcage (make-empty-ribcage))
  695. (w (make-wrap (wrap-marks w) (cons ribcage (wrap-subst w)))))
  696. (letrec* ((record-definition!
  697. (lambda (id var)
  698. (let ((mod (cons 'hygiene (module-name (current-module)))))
  699. (extend-ribcage! ribcage id (cons (or (syntax-module id) mod) (wrap var top-wrap mod))))))
  700. (macro-introduced-identifier?
  701. (lambda (id) (not (equal? (wrap-marks (syntax-wrap id)) '(top)))))
  702. (ensure-fresh-name
  703. (lambda (var)
  704. (letrec* ((ribcage-has-var?
  705. (lambda (var)
  706. (let lp ((labels (ribcage-labels ribcage)))
  707. (let* ((v labels)
  708. (fk (lambda ()
  709. (let ((fk (lambda () (error "value failed to match" v))))
  710. (if (pair? v)
  711. (let ((vx (car v)) (vy-1 (cdr v)))
  712. (if (pair? vx)
  713. (let ((vx (car vx)) (vy (cdr vx)))
  714. (let* ((wrapped vy) (labels vy-1))
  715. (or (eq? (syntax-expression wrapped) var)
  716. (lp labels))))
  717. (fk)))
  718. (fk))))))
  719. (if (null? v) #f (fk)))))))
  720. (let lp ((unique var) (n 1))
  721. (if (ribcage-has-var? unique)
  722. (let ((tail (string->symbol (number->string n))))
  723. (lp (symbol-append var '- tail) (#{1+}# n)))
  724. unique)))))
  725. (fresh-derived-name
  726. (lambda (id orig-form)
  727. (ensure-fresh-name
  728. (symbol-append
  729. (syntax-expression id)
  730. '-
  731. (string->symbol
  732. (number->string (hash (syntax->datum orig-form) most-positive-fixnum) 16))))))
  733. (parse (lambda (body r w s m esew mod)
  734. (let lp ((body body))
  735. (let* ((v body)
  736. (fk (lambda ()
  737. (let ((fk (lambda () (error "value failed to match" v))))
  738. (if (pair? v)
  739. (let ((vx (car v)) (vy (cdr v)))
  740. (let* ((head vx)
  741. (tail vy)
  742. (thunks (parse1 head r w s m esew mod)))
  743. (append thunks (lp tail))))
  744. (fk))))))
  745. (if (null? v) '() (fk))))))
  746. (parse1
  747. (lambda (x r w s m esew mod)
  748. (letrec* ((current-module-for-expansion
  749. (lambda (mod)
  750. (let* ((v mod)
  751. (fk (lambda ()
  752. (let ((fk (lambda () (error "value failed to match" v)))) mod))))
  753. (if (pair? v)
  754. (let ((vx (car v)) (vy (cdr v)))
  755. (if (eq? vx 'hygiene)
  756. (cons 'hygiene (module-name (current-module)))
  757. (fk)))
  758. (fk))))))
  759. (call-with-values
  760. (lambda ()
  761. (let ((mod (current-module-for-expansion mod)))
  762. (syntax-type x r w (source-annotation x) ribcage mod #f)))
  763. (lambda (type value form e w s mod)
  764. (let ((key type))
  765. (cond
  766. ((memv key '(define-form))
  767. (let* ((id (wrap value w mod))
  768. (var (if (macro-introduced-identifier? id)
  769. (fresh-derived-name id x)
  770. (syntax-expression id))))
  771. (record-definition! id var)
  772. (list (if (eq? m 'c&e)
  773. (let ((x (build-global-definition s mod var (expand e r w mod))))
  774. (top-level-eval x mod)
  775. (lambda () x))
  776. (call-with-values
  777. (lambda () (resolve-identifier id empty-wrap r mod #t))
  778. (lambda (type* value* mod*)
  779. (if (eq? type* 'macro)
  780. (top-level-eval
  781. (build-global-definition s mod var (build-void s))
  782. mod))
  783. (lambda ()
  784. (build-global-definition s mod var (expand e r w mod)))))))))
  785. ((memv key '(define-syntax-form define-syntax-parameter-form))
  786. (let* ((id (wrap value w mod))
  787. (var (if (macro-introduced-identifier? id)
  788. (fresh-derived-name id x)
  789. (syntax-expression id))))
  790. (record-definition! id var)
  791. (let ((key m))
  792. (cond
  793. ((memv key '(c))
  794. (cond
  795. ((memq 'compile esew)
  796. (let ((e (expand-install-global mod var type (expand e r w mod))))
  797. (top-level-eval e mod)
  798. (if (memq 'load esew) (list (lambda () e)) '())))
  799. ((memq 'load esew)
  800. (list (lambda ()
  801. (expand-install-global mod var type (expand e r w mod)))))
  802. (else '())))
  803. ((memv key '(c&e))
  804. (let ((e (expand-install-global mod var type (expand e r w mod))))
  805. (top-level-eval e mod)
  806. (list (lambda () e))))
  807. (else (if (memq 'eval esew)
  808. (top-level-eval
  809. (expand-install-global mod var type (expand e r w mod))
  810. mod))
  811. '())))))
  812. ((memv key '(begin-form))
  813. (let* ((tmp-1 e) (tmp ($sc-dispatch tmp-1 '(_ . each-any))))
  814. (if tmp
  815. (apply (lambda (e1) (parse e1 r w s m esew mod)) tmp)
  816. (syntax-violation
  817. #f
  818. "source expression failed to match any pattern"
  819. tmp-1))))
  820. ((memv key '(local-syntax-form))
  821. (expand-local-syntax
  822. value
  823. e
  824. r
  825. w
  826. s
  827. mod
  828. (lambda (forms r w s mod) (parse forms r w s m esew mod))))
  829. ((memv key '(eval-when-form))
  830. (let* ((tmp-1 e) (tmp ($sc-dispatch tmp-1 '(_ each-any any . each-any))))
  831. (if tmp
  832. (apply (lambda (x e1 e2)
  833. (let ((when-list (parse-when-list e x)) (body (cons e1 e2)))
  834. (letrec* ((recurse
  835. (lambda (m esew) (parse body r w s m esew mod))))
  836. (cond
  837. ((eq? m 'e)
  838. (if (memq 'eval when-list)
  839. (recurse
  840. (if (memq 'expand when-list) 'c&e 'e)
  841. '(eval))
  842. (begin
  843. (if (memq 'expand when-list)
  844. (top-level-eval
  845. (expand-top-sequence body r w s 'e '(eval) mod)
  846. mod))
  847. '())))
  848. ((memq 'load when-list)
  849. (cond
  850. ((or (memq 'compile when-list)
  851. (memq 'expand when-list)
  852. (and (eq? m 'c&e) (memq 'eval when-list)))
  853. (recurse 'c&e '(compile load)))
  854. ((memq m '(c c&e)) (recurse 'c '(load)))
  855. (else '())))
  856. ((or (memq 'compile when-list)
  857. (memq 'expand when-list)
  858. (and (eq? m 'c&e) (memq 'eval when-list)))
  859. (top-level-eval
  860. (expand-top-sequence body r w s 'e '(eval) mod)
  861. mod)
  862. '())
  863. (else '())))))
  864. tmp)
  865. (syntax-violation
  866. #f
  867. "source expression failed to match any pattern"
  868. tmp-1))))
  869. (else (list (if (eq? m 'c&e)
  870. (let ((x (expand-expr type value form e r w s mod)))
  871. (top-level-eval x mod)
  872. (lambda () x))
  873. (lambda () (expand-expr type value form e r w s mod)))))))))))))
  874. (let* ((v (let lp ((thunks (parse body r w s m esew mod)))
  875. (let* ((v thunks)
  876. (fk (lambda ()
  877. (let ((fk (lambda () (error "value failed to match" v))))
  878. (if (pair? v)
  879. (let ((vx (car v)) (vy (cdr v)))
  880. (let* ((thunk vx) (thunks vy)) (cons (thunk) (lp thunks))))
  881. (fk))))))
  882. (if (null? v) '() (fk)))))
  883. (fk (lambda ()
  884. (let* ((fk (lambda () (error "value failed to match" v))) (exps v))
  885. (build-sequence s exps)))))
  886. (if (null? v) (build-void s) (fk)))))))
  887. (expand-install-global
  888. (lambda (mod name type e)
  889. (build-global-definition
  890. no-source
  891. mod
  892. name
  893. (build-primcall
  894. no-source
  895. 'make-syntax-transformer
  896. (list (build-data no-source name)
  897. (build-data no-source (if (eq? type 'define-syntax-parameter-form) 'syntax-parameter 'macro))
  898. e)))))
  899. (parse-when-list
  900. (lambda (e when-list)
  901. (let ((result (strip when-list)))
  902. (let lp ((l result))
  903. (let* ((v l)
  904. (fk (lambda ()
  905. (let ((fk (lambda () (error "value failed to match" v))))
  906. (if (pair? v)
  907. (let ((vx (car v)) (vy (cdr v)))
  908. (let* ((x vx)
  909. (l vy)
  910. (v x)
  911. (fk (lambda ()
  912. (let ((fk (lambda () (error "value failed to match" v))))
  913. (syntax-violation 'eval-when "invalid situation" e x))))
  914. (tk (lambda () (lp l))))
  915. (if (eq? v 'compile)
  916. (tk)
  917. (let ((tk (lambda () (tk))))
  918. (if (eq? v 'load)
  919. (tk)
  920. (let ((tk (lambda () (tk))))
  921. (if (eq? v 'eval)
  922. (tk)
  923. (let ((tk (lambda () (tk)))) (if (eq? v 'expand) (tk) (fk))))))))))
  924. (fk))))))
  925. (if (null? v) result (fk)))))))
  926. (syntax-type
  927. (lambda (e r w s rib mod for-car?)
  928. (cond
  929. ((symbol? e)
  930. (call-with-values
  931. (lambda () (resolve-identifier e w r mod #t))
  932. (lambda (type value mod*)
  933. (let ((key type))
  934. (cond
  935. ((memv key '(macro))
  936. (if for-car?
  937. (values type value e e w s mod)
  938. (syntax-type (expand-macro value e r w s rib mod) r empty-wrap s rib mod #f)))
  939. ((memv key '(global)) (values type value e value w s mod*))
  940. (else (values type value e e w s mod)))))))
  941. ((pair? e)
  942. (let ((first (car e)))
  943. (call-with-values
  944. (lambda () (syntax-type first r w s rib mod #t))
  945. (lambda (ftype fval fform fe fw fs fmod)
  946. (let ((key ftype))
  947. (cond
  948. ((memv key '(lexical)) (values 'lexical-call fval e e w s mod))
  949. ((memv key '(global))
  950. (if (equal? fmod '(primitive))
  951. (values 'primitive-call fval e e w s mod)
  952. (values 'global-call (make-syntax fval w fmod fs) e e w s mod)))
  953. ((memv key '(macro))
  954. (syntax-type (expand-macro fval e r w s rib mod) r empty-wrap s rib mod for-car?))
  955. ((memv key '(module-ref))
  956. (call-with-values
  957. (lambda () (fval e r w mod))
  958. (lambda (e r w s mod) (syntax-type e r w s rib mod for-car?))))
  959. ((memv key '(core)) (values 'core-form fval e e w s mod))
  960. ((memv key '(local-syntax)) (values 'local-syntax-form fval e e w s mod))
  961. ((memv key '(begin)) (values 'begin-form #f e e w s mod))
  962. ((memv key '(eval-when)) (values 'eval-when-form #f e e w s mod))
  963. ((memv key '(define))
  964. (let* ((tmp e) (tmp-1 ($sc-dispatch tmp '(_ any any))))
  965. (if (and tmp-1 (apply (lambda (name val) (id? name)) tmp-1))
  966. (apply (lambda (name val) (values 'define-form name e val w s mod)) tmp-1)
  967. (let ((tmp-1 ($sc-dispatch tmp '(_ (any . any) any . each-any))))
  968. (if (and tmp-1
  969. (apply (lambda (name args e1 e2)
  970. (and (id? name) (valid-bound-ids? (lambda-var-list args))))
  971. tmp-1))
  972. (apply (lambda (name args e1 e2)
  973. (values
  974. 'define-form
  975. (wrap name w mod)
  976. (wrap e w mod)
  977. (source-wrap
  978. (cons (make-syntax 'lambda '((top)) '(hygiene guile))
  979. (wrap (cons args (cons e1 e2)) w mod))
  980. empty-wrap
  981. s
  982. #f)
  983. empty-wrap
  984. s
  985. mod))
  986. tmp-1)
  987. (let ((tmp-1 ($sc-dispatch tmp '(_ any))))
  988. (if (and tmp-1 (apply (lambda (name) (id? name)) tmp-1))
  989. (apply (lambda (name)
  990. (values
  991. 'define-form
  992. (wrap name w mod)
  993. (wrap e w mod)
  994. (list (make-syntax 'if '((top)) '(hygiene guile)) #f #f)
  995. empty-wrap
  996. s
  997. mod))
  998. tmp-1)
  999. (syntax-violation #f "source expression failed to match any pattern" tmp))))))))
  1000. ((memv key '(define-syntax))
  1001. (let* ((tmp-1 e) (tmp ($sc-dispatch tmp-1 '(_ any any))))
  1002. (if (and tmp (apply (lambda (name val) (id? name)) tmp))
  1003. (apply (lambda (name val) (values 'define-syntax-form name e val w s mod)) tmp)
  1004. (syntax-violation #f "source expression failed to match any pattern" tmp-1))))
  1005. ((memv key '(define-syntax-parameter))
  1006. (let* ((tmp-1 e) (tmp ($sc-dispatch tmp-1 '(_ any any))))
  1007. (if (and tmp (apply (lambda (name val) (id? name)) tmp))
  1008. (apply (lambda (name val) (values 'define-syntax-parameter-form name e val w s mod))
  1009. tmp)
  1010. (syntax-violation #f "source expression failed to match any pattern" tmp-1))))
  1011. (else (values 'call #f e e w s mod))))))))
  1012. ((syntax? e)
  1013. (syntax-type
  1014. (syntax-expression e)
  1015. r
  1016. (join-wraps w (syntax-wrap e))
  1017. (or (source-annotation e) s)
  1018. rib
  1019. (or (syntax-module e) mod)
  1020. for-car?))
  1021. ((self-evaluating? e) (values 'constant #f e e w s mod))
  1022. (else (values 'other #f e e w s mod)))))
  1023. (expand
  1024. (lambda (e r w mod)
  1025. (call-with-values
  1026. (lambda () (syntax-type e r w (source-annotation e) #f mod #f))
  1027. (lambda (type value form e w s mod) (expand-expr type value form e r w s mod)))))
  1028. (expand-expr
  1029. (lambda (type value form e r w s mod)
  1030. (let ((key type))
  1031. (cond
  1032. ((memv key '(lexical)) (build-lexical-reference s e value))
  1033. ((memv key '(core core-form)) (value e r w s mod))
  1034. ((memv key '(module-ref))
  1035. (call-with-values (lambda () (value e r w mod)) (lambda (e r w s mod) (expand e r w mod))))
  1036. ((memv key '(lexical-call))
  1037. (expand-call
  1038. (let ((id (car e)))
  1039. (build-lexical-reference (source-annotation id) (if (syntax? id) (syntax->datum id) id) value))
  1040. e
  1041. r
  1042. w
  1043. s
  1044. mod))
  1045. ((memv key '(global-call))
  1046. (expand-call
  1047. (build-global-reference
  1048. (or (source-annotation (car e)) s)
  1049. (if (syntax? value) (syntax-expression value) value)
  1050. (or (and (syntax? value) (syntax-module value)) mod))
  1051. e
  1052. r
  1053. w
  1054. s
  1055. mod))
  1056. ((memv key '(primitive-call))
  1057. (let* ((tmp-1 e) (tmp ($sc-dispatch tmp-1 '(_ . each-any))))
  1058. (if tmp
  1059. (apply (lambda (e) (build-primcall s value (map (lambda (e) (expand e r w mod)) e))) tmp)
  1060. (syntax-violation #f "source expression failed to match any pattern" tmp-1))))
  1061. ((memv key '(constant)) (build-data s (strip e)))
  1062. ((memv key '(global)) (build-global-reference s value mod))
  1063. ((memv key '(call)) (expand-call (expand (car e) r w mod) e r w s mod))
  1064. ((memv key '(begin-form))
  1065. (let* ((tmp e) (tmp-1 ($sc-dispatch tmp '(_ any . each-any))))
  1066. (if tmp-1
  1067. (apply (lambda (e1 e2) (expand-sequence (cons e1 e2) r w s mod)) tmp-1)
  1068. (let ((tmp-1 ($sc-dispatch tmp '(_))))
  1069. (if tmp-1
  1070. (apply (lambda ()
  1071. (syntax-violation #f "sequence of zero expressions" (source-wrap e w s mod)))
  1072. tmp-1)
  1073. (syntax-violation #f "source expression failed to match any pattern" tmp))))))
  1074. ((memv key '(local-syntax-form)) (expand-local-syntax value e r w s mod expand-sequence))
  1075. ((memv key '(eval-when-form))
  1076. (let* ((tmp-1 e) (tmp ($sc-dispatch tmp-1 '(_ each-any any . each-any))))
  1077. (if tmp
  1078. (apply (lambda (x e1 e2)
  1079. (let ((when-list (parse-when-list e x)))
  1080. (if (memq 'eval when-list) (expand-sequence (cons e1 e2) r w s mod) (expand-void))))
  1081. tmp)
  1082. (syntax-violation #f "source expression failed to match any pattern" tmp-1))))
  1083. ((memv key '(define-form define-syntax-form define-syntax-parameter-form))
  1084. (syntax-violation
  1085. #f
  1086. "definition in expression context, where definitions are not allowed,"
  1087. (source-wrap form w s mod)))
  1088. ((memv key '(syntax))
  1089. (syntax-violation #f "reference to pattern variable outside syntax form" (source-wrap e w s mod)))
  1090. ((memv key '(displaced-lexical))
  1091. (syntax-violation #f "reference to identifier outside its scope" (source-wrap e w s mod)))
  1092. (else (syntax-violation #f "unexpected syntax" (source-wrap e w s mod)))))))
  1093. (expand-call
  1094. (lambda (x e r w s mod)
  1095. (let* ((tmp-1 e) (tmp ($sc-dispatch tmp-1 '(any . each-any))))
  1096. (if tmp
  1097. (apply (lambda (e0 e1) (build-call s x (map (lambda (e) (expand e r w mod)) e1))) tmp)
  1098. (syntax-violation #f "source expression failed to match any pattern" tmp-1)))))
  1099. (expand-macro
  1100. (lambda (p e r w s rib mod)
  1101. (letrec* ((decorate-source (lambda (x) (source-wrap x empty-wrap s #f)))
  1102. (map* (lambda (f x)
  1103. (let* ((v x)
  1104. (fk (lambda ()
  1105. (let ((fk (lambda ()
  1106. (let* ((fk (lambda () (error "value failed to match" v)))
  1107. (x v))
  1108. (f x)))))
  1109. (if (pair? v)
  1110. (let ((vx (car v)) (vy (cdr v)))
  1111. (let* ((x vx) (x* vy)) (cons (f x) (map* f x*))))
  1112. (fk))))))
  1113. (if (null? v) '() (fk)))))
  1114. (rebuild-macro-output
  1115. (lambda (x m)
  1116. (cond
  1117. ((pair? x) (decorate-source (map* (lambda (x) (rebuild-macro-output x m)) x)))
  1118. ((syntax? x)
  1119. (let ((w (syntax-wrap x)))
  1120. (let ((ms (wrap-marks w)) (ss (wrap-subst w)))
  1121. (if (and (pair? ms) (eq? (car ms) the-anti-mark))
  1122. (wrap-syntax x (make-wrap (cdr ms) (if rib (cons rib (cdr ss)) (cdr ss))) mod)
  1123. (wrap-syntax
  1124. x
  1125. (make-wrap (cons m ms) (if rib (cons rib (cons 'shift ss)) (cons 'shift ss)))
  1126. mod)))))
  1127. ((vector? x)
  1128. (let* ((n (vector-length x)) (v (make-vector n)))
  1129. (let loop ((i 0))
  1130. (if (= i n)
  1131. (begin (if #f #f) v)
  1132. (begin
  1133. (vector-set! v i (rebuild-macro-output (vector-ref x i) m))
  1134. (loop (#{1+}# i)))))
  1135. (decorate-source v)))
  1136. ((symbol? x)
  1137. (syntax-violation
  1138. #f
  1139. "encountered raw symbol in macro output"
  1140. (source-wrap e w (wrap-subst w) mod)
  1141. x))
  1142. (else (decorate-source x))))))
  1143. (let* ((t-680b775fb37a463-c45 transformer-environment)
  1144. (t-680b775fb37a463-c46 (lambda (k) (k e r w s rib mod))))
  1145. (with-fluid*
  1146. t-680b775fb37a463-c45
  1147. t-680b775fb37a463-c46
  1148. (lambda () (rebuild-macro-output (p (source-wrap e (anti-mark w) s mod)) (new-mark))))))))
  1149. (expand-body
  1150. (lambda (body outer-form r w mod)
  1151. (let* ((r (cons '("placeholder" placeholder) r))
  1152. (ribcage (make-empty-ribcage))
  1153. (w (make-wrap (wrap-marks w) (cons ribcage (wrap-subst w)))))
  1154. (let parse ((body (map (lambda (x) (cons r (wrap x w mod))) body))
  1155. (ids '())
  1156. (labels '())
  1157. (var-ids '())
  1158. (vars '())
  1159. (vals '())
  1160. (bindings '())
  1161. (expand-tail-expr #f))
  1162. (cond
  1163. ((null? body)
  1164. (if (not expand-tail-expr)
  1165. (begin
  1166. (if (null? ids) (syntax-violation #f "empty body" outer-form))
  1167. (syntax-violation #f "body should end with an expression" outer-form)))
  1168. (if (not (valid-bound-ids? ids))
  1169. (syntax-violation #f "invalid or duplicate identifier in definition" outer-form))
  1170. (set-cdr! r (extend-env labels bindings (cdr r)))
  1171. (let ((src (source-annotation outer-form)))
  1172. (let lp ((var-ids var-ids) (vars vars) (vals vals) (tail (expand-tail-expr)))
  1173. (cond
  1174. ((null? var-ids) tail)
  1175. ((not (car var-ids))
  1176. (lp (cdr var-ids) (cdr vars) (cdr vals) (make-seq src ((car vals)) tail)))
  1177. (else (let ((var-ids (map (lambda (id) (if id (syntax->datum id) '_)) (reverse var-ids)))
  1178. (vars (map (lambda (var) (or var (gen-lexical '_))) (reverse vars)))
  1179. (vals (map (lambda (expand-expr id)
  1180. (if id (expand-expr) (make-seq src (expand-expr) (build-void src))))
  1181. (reverse vals)
  1182. (reverse var-ids))))
  1183. (build-letrec src #t var-ids vars vals tail)))))))
  1184. (expand-tail-expr
  1185. (parse body ids labels (cons #f var-ids) (cons #f vars) (cons expand-tail-expr vals) bindings #f))
  1186. (else (let ((e (cdar body)) (er (caar body)) (body (cdr body)))
  1187. (call-with-values
  1188. (lambda () (syntax-type e er empty-wrap (source-annotation e) ribcage mod #f))
  1189. (lambda (type value form e w s mod)
  1190. (let ((key type))
  1191. (cond
  1192. ((memv key '(define-form))
  1193. (let ((id (wrap value w mod)) (label (gen-label)))
  1194. (let ((var (gen-var id)))
  1195. (extend-ribcage! ribcage id label)
  1196. (parse body
  1197. (cons id ids)
  1198. (cons label labels)
  1199. (cons id var-ids)
  1200. (cons var vars)
  1201. (cons (let ((wrapped (source-wrap e w s mod)))
  1202. (lambda () (expand wrapped er empty-wrap mod)))
  1203. vals)
  1204. (cons (cons 'lexical var) bindings)
  1205. #f))))
  1206. ((memv key '(define-syntax-form))
  1207. (let ((id (wrap value w mod)) (label (gen-label)) (trans-r (macros-only-env er)))
  1208. (extend-ribcage! ribcage id label)
  1209. (set-cdr!
  1210. r
  1211. (extend-env
  1212. (list label)
  1213. (list (cons 'macro (eval-local-transformer (expand e trans-r w mod) mod)))
  1214. (cdr r)))
  1215. (parse body (cons id ids) labels var-ids vars vals bindings #f)))
  1216. ((memv key '(define-syntax-parameter-form))
  1217. (let ((id (wrap value w mod)) (label (gen-label)) (trans-r (macros-only-env er)))
  1218. (extend-ribcage! ribcage id label)
  1219. (set-cdr!
  1220. r
  1221. (extend-env
  1222. (list label)
  1223. (list (cons 'syntax-parameter
  1224. (eval-local-transformer (expand e trans-r w mod) mod)))
  1225. (cdr r)))
  1226. (parse body (cons id ids) labels var-ids vars vals bindings #f)))
  1227. ((memv key '(begin-form))
  1228. (let* ((tmp-1 e) (tmp ($sc-dispatch tmp-1 '(_ . each-any))))
  1229. (if tmp
  1230. (apply (lambda (e1)
  1231. (parse (let f ((forms e1))
  1232. (if (null? forms)
  1233. body
  1234. (cons (cons er (wrap (car forms) w mod))
  1235. (f (cdr forms)))))
  1236. ids
  1237. labels
  1238. var-ids
  1239. vars
  1240. vals
  1241. bindings
  1242. #f))
  1243. tmp)
  1244. (syntax-violation #f "source expression failed to match any pattern" tmp-1))))
  1245. ((memv key '(local-syntax-form))
  1246. (expand-local-syntax
  1247. value
  1248. e
  1249. er
  1250. w
  1251. s
  1252. mod
  1253. (lambda (forms er w s mod)
  1254. (parse (let f ((forms forms))
  1255. (if (null? forms)
  1256. body
  1257. (cons (cons er (wrap (car forms) w mod)) (f (cdr forms)))))
  1258. ids
  1259. labels
  1260. var-ids
  1261. vars
  1262. vals
  1263. bindings
  1264. #f))))
  1265. (else (let ((wrapped (source-wrap e w s mod)))
  1266. (parse body
  1267. ids
  1268. labels
  1269. var-ids
  1270. vars
  1271. vals
  1272. bindings
  1273. (lambda () (expand wrapped er empty-wrap mod))))))))))))))))
  1274. (expand-local-syntax
  1275. (lambda (rec? e r w s mod k)
  1276. (let* ((tmp e) (tmp ($sc-dispatch tmp '(_ #(each (any any)) any . each-any))))
  1277. (if tmp
  1278. (apply (lambda (id val e1 e2)
  1279. (let ((ids id))
  1280. (if (not (valid-bound-ids? ids))
  1281. (syntax-violation #f "duplicate bound keyword" e)
  1282. (let* ((labels (gen-labels ids)) (new-w (make-binding-wrap ids labels w)))
  1283. (k (cons e1 e2)
  1284. (extend-env
  1285. labels
  1286. (let ((w (if rec? new-w w)) (trans-r (macros-only-env r)))
  1287. (map (lambda (x)
  1288. (cons 'macro (eval-local-transformer (expand x trans-r w mod) mod)))
  1289. val))
  1290. r)
  1291. new-w
  1292. s
  1293. mod)))))
  1294. tmp)
  1295. (syntax-violation #f "bad local syntax definition" (source-wrap e w s mod))))))
  1296. (eval-local-transformer
  1297. (lambda (expanded mod)
  1298. (let ((p (local-eval expanded mod)))
  1299. (if (not (procedure? p)) (syntax-violation #f "nonprocedure transformer" p))
  1300. p)))
  1301. (expand-void (lambda () (build-void no-source)))
  1302. (ellipsis?
  1303. (lambda (e r mod)
  1304. (and (nonsymbol-id? e)
  1305. (call-with-values
  1306. (lambda ()
  1307. (resolve-identifier
  1308. (make-syntax '#{ $sc-ellipsis }# (syntax-wrap e) (or (syntax-module e) mod) #f)
  1309. empty-wrap
  1310. r
  1311. mod
  1312. #f))
  1313. (lambda (type value mod)
  1314. (if (eq? type 'ellipsis)
  1315. (bound-id=? e value)
  1316. (free-id=? e (make-syntax '... '((top)) '(hygiene guile)))))))))
  1317. (lambda-formals
  1318. (lambda (orig-args)
  1319. (letrec* ((req (lambda (args rreq)
  1320. (let* ((tmp args) (tmp-1 ($sc-dispatch tmp '())))
  1321. (if tmp-1
  1322. (apply (lambda () (check (reverse rreq) #f)) tmp-1)
  1323. (let ((tmp-1 ($sc-dispatch tmp '(any . any))))
  1324. (if (and tmp-1 (apply (lambda (a b) (id? a)) tmp-1))
  1325. (apply (lambda (a b) (req b (cons a rreq))) tmp-1)
  1326. (let ((tmp-1 (list tmp)))
  1327. (if (and tmp-1 (apply (lambda (r) (id? r)) tmp-1))
  1328. (apply (lambda (r) (check (reverse rreq) r)) tmp-1)
  1329. (let ((else tmp))
  1330. (syntax-violation 'lambda "invalid argument list" orig-args args))))))))))
  1331. (check (lambda (req rest)
  1332. (if (distinct-bound-ids? (if rest (cons rest req) req))
  1333. (values req #f rest #f)
  1334. (syntax-violation 'lambda "duplicate identifier in argument list" orig-args)))))
  1335. (req orig-args '()))))
  1336. (expand-simple-lambda
  1337. (lambda (e r w s mod req rest meta body)
  1338. (let* ((ids (if rest (append req (list rest)) req)) (vars (map gen-var ids)) (labels (gen-labels ids)))
  1339. (build-simple-lambda
  1340. s
  1341. (map syntax->datum req)
  1342. (and rest (syntax->datum rest))
  1343. vars
  1344. meta
  1345. (expand-body
  1346. body
  1347. (source-wrap e w s mod)
  1348. (extend-var-env labels vars r)
  1349. (make-binding-wrap ids labels w)
  1350. mod)))))
  1351. (lambda*-formals
  1352. (lambda (orig-args)
  1353. (letrec* ((req (lambda (args rreq)
  1354. (let* ((tmp args) (tmp-1 ($sc-dispatch tmp '())))
  1355. (if tmp-1
  1356. (apply (lambda () (check (reverse rreq) '() #f '())) tmp-1)
  1357. (let ((tmp-1 ($sc-dispatch tmp '(any . any))))
  1358. (if (and tmp-1 (apply (lambda (a b) (id? a)) tmp-1))
  1359. (apply (lambda (a b) (req b (cons a rreq))) tmp-1)
  1360. (let ((tmp-1 ($sc-dispatch tmp '(any . any))))
  1361. (if (and tmp-1
  1362. (apply (lambda (a b) (eq? (syntax->datum a) #:optional)) tmp-1))
  1363. (apply (lambda (a b) (opt b (reverse rreq) '())) tmp-1)
  1364. (let ((tmp-1 ($sc-dispatch tmp '(any . any))))
  1365. (if (and tmp-1
  1366. (apply (lambda (a b) (eq? (syntax->datum a) #:key)) tmp-1))
  1367. (apply (lambda (a b) (key b (reverse rreq) '() '())) tmp-1)
  1368. (let ((tmp-1 ($sc-dispatch tmp '(any any))))
  1369. (if (and tmp-1
  1370. (apply (lambda (a b) (eq? (syntax->datum a) #:rest))
  1371. tmp-1))
  1372. (apply (lambda (a b) (rest b (reverse rreq) '() '()))
  1373. tmp-1)
  1374. (let ((tmp-1 (list tmp)))
  1375. (if (and tmp-1 (apply (lambda (r) (id? r)) tmp-1))
  1376. (apply (lambda (r) (rest r (reverse rreq) '() '()))
  1377. tmp-1)
  1378. (let ((else tmp))
  1379. (syntax-violation
  1380. 'lambda*
  1381. "invalid argument list"
  1382. orig-args
  1383. args))))))))))))))))
  1384. (opt (lambda (args req ropt)
  1385. (let* ((tmp args) (tmp-1 ($sc-dispatch tmp '())))
  1386. (if tmp-1
  1387. (apply (lambda () (check req (reverse ropt) #f '())) tmp-1)
  1388. (let ((tmp-1 ($sc-dispatch tmp '(any . any))))
  1389. (if (and tmp-1 (apply (lambda (a b) (id? a)) tmp-1))
  1390. (apply (lambda (a b) (opt b req (cons (cons a '(#f)) ropt))) tmp-1)
  1391. (let ((tmp-1 ($sc-dispatch tmp '((any any) . any))))
  1392. (if (and tmp-1 (apply (lambda (a init b) (id? a)) tmp-1))
  1393. (apply (lambda (a init b) (opt b req (cons (list a init) ropt)))
  1394. tmp-1)
  1395. (let ((tmp-1 ($sc-dispatch tmp '(any . any))))
  1396. (if (and tmp-1
  1397. (apply (lambda (a b) (eq? (syntax->datum a) #:key)) tmp-1))
  1398. (apply (lambda (a b) (key b req (reverse ropt) '())) tmp-1)
  1399. (let ((tmp-1 ($sc-dispatch tmp '(any any))))
  1400. (if (and tmp-1
  1401. (apply (lambda (a b) (eq? (syntax->datum a) #:rest))
  1402. tmp-1))
  1403. (apply (lambda (a b) (rest b req (reverse ropt) '()))
  1404. tmp-1)
  1405. (let ((tmp-1 (list tmp)))
  1406. (if (and tmp-1 (apply (lambda (r) (id? r)) tmp-1))
  1407. (apply (lambda (r) (rest r req (reverse ropt) '()))
  1408. tmp-1)
  1409. (let ((else tmp))
  1410. (syntax-violation
  1411. 'lambda*
  1412. "invalid optional argument list"
  1413. orig-args
  1414. args))))))))))))))))
  1415. (key (lambda (args req opt rkey)
  1416. (let* ((tmp args) (tmp-1 ($sc-dispatch tmp '())))
  1417. (if tmp-1
  1418. (apply (lambda () (check req opt #f (cons #f (reverse rkey)))) tmp-1)
  1419. (let ((tmp-1 ($sc-dispatch tmp '(any . any))))
  1420. (if (and tmp-1 (apply (lambda (a b) (id? a)) tmp-1))
  1421. (apply (lambda (a b)
  1422. (let* ((tmp (symbol->keyword (syntax->datum a))) (k tmp))
  1423. (key b req opt (cons (cons k (cons a '(#f))) rkey))))
  1424. tmp-1)
  1425. (let ((tmp-1 ($sc-dispatch tmp '((any any) . any))))
  1426. (if (and tmp-1 (apply (lambda (a init b) (id? a)) tmp-1))
  1427. (apply (lambda (a init b)
  1428. (let* ((tmp (symbol->keyword (syntax->datum a))) (k tmp))
  1429. (key b req opt (cons (list k a init) rkey))))
  1430. tmp-1)
  1431. (let ((tmp-1 ($sc-dispatch tmp '((any any any) . any))))
  1432. (if (and tmp-1
  1433. (apply (lambda (a init k b)
  1434. (and (id? a) (keyword? (syntax->datum k))))
  1435. tmp-1))
  1436. (apply (lambda (a init k b)
  1437. (key b req opt (cons (list k a init) rkey)))
  1438. tmp-1)
  1439. (let ((tmp-1 ($sc-dispatch tmp '(any))))
  1440. (if (and tmp-1
  1441. (apply (lambda (aok)
  1442. (eq? (syntax->datum aok) #:allow-other-keys))
  1443. tmp-1))
  1444. (apply (lambda (aok)
  1445. (check req opt #f (cons #t (reverse rkey))))
  1446. tmp-1)
  1447. (let ((tmp-1 ($sc-dispatch tmp '(any any any))))
  1448. (if (and tmp-1
  1449. (apply (lambda (aok a b)
  1450. (and (eq? (syntax->datum aok)
  1451. #:allow-other-keys)
  1452. (eq? (syntax->datum a) #:rest)))
  1453. tmp-1))
  1454. (apply (lambda (aok a b)
  1455. (rest b req opt (cons #t (reverse rkey))))
  1456. tmp-1)
  1457. (let ((tmp-1 ($sc-dispatch tmp '(any . any))))
  1458. (if (and tmp-1
  1459. (apply (lambda (aok r)
  1460. (and (eq? (syntax->datum aok)
  1461. #:allow-other-keys)
  1462. (id? r)))
  1463. tmp-1))
  1464. (apply (lambda (aok r)
  1465. (rest r
  1466. req
  1467. opt
  1468. (cons #t (reverse rkey))))
  1469. tmp-1)
  1470. (let ((tmp-1 ($sc-dispatch tmp '(any any))))
  1471. (if (and tmp-1
  1472. (apply (lambda (a b)
  1473. (eq? (syntax->datum a)
  1474. #:rest))
  1475. tmp-1))
  1476. (apply (lambda (a b)
  1477. (rest b
  1478. req
  1479. opt
  1480. (cons #f (reverse rkey))))
  1481. tmp-1)
  1482. (let ((tmp-1 (list tmp)))
  1483. (if (and tmp-1
  1484. (apply (lambda (r) (id? r))
  1485. tmp-1))
  1486. (apply (lambda (r)
  1487. (rest r
  1488. req
  1489. opt
  1490. (cons #f
  1491. (reverse
  1492. rkey))))
  1493. tmp-1)
  1494. (let ((else tmp))
  1495. (syntax-violation
  1496. 'lambda*
  1497. "invalid keyword argument list"
  1498. orig-args
  1499. args))))))))))))))))))))))
  1500. (rest (lambda (args req opt kw)
  1501. (let* ((tmp-1 args) (tmp (list tmp-1)))
  1502. (if (and tmp (apply (lambda (r) (id? r)) tmp))
  1503. (apply (lambda (r) (check req opt r kw)) tmp)
  1504. (let ((else tmp-1))
  1505. (syntax-violation 'lambda* "invalid rest argument" orig-args args))))))
  1506. (check (lambda (req opt rest kw)
  1507. (if (distinct-bound-ids?
  1508. (append
  1509. req
  1510. (map car opt)
  1511. (if rest (list rest) '())
  1512. (if (pair? kw) (map cadr (cdr kw)) '())))
  1513. (values req opt rest kw)
  1514. (syntax-violation 'lambda* "duplicate identifier in argument list" orig-args)))))
  1515. (req orig-args '()))))
  1516. (expand-lambda-case
  1517. (lambda (e r w s mod get-formals clauses)
  1518. (letrec* ((parse-req
  1519. (lambda (req opt rest kw body)
  1520. (let ((vars (map gen-var req)) (labels (gen-labels req)))
  1521. (let ((r* (extend-var-env labels vars r)) (w* (make-binding-wrap req labels w)))
  1522. (parse-opt (map syntax->datum req) opt rest kw body (reverse vars) r* w* '() '())))))
  1523. (parse-opt
  1524. (lambda (req opt rest kw body vars r* w* out inits)
  1525. (cond
  1526. ((pair? opt)
  1527. (let* ((tmp-1 (car opt)) (tmp ($sc-dispatch tmp-1 '(any any))))
  1528. (if tmp
  1529. (apply (lambda (id i)
  1530. (let* ((v (gen-var id))
  1531. (l (gen-labels (list v)))
  1532. (r** (extend-var-env l (list v) r*))
  1533. (w** (make-binding-wrap (list id) l w*)))
  1534. (parse-opt
  1535. req
  1536. (cdr opt)
  1537. rest
  1538. kw
  1539. body
  1540. (cons v vars)
  1541. r**
  1542. w**
  1543. (cons (syntax->datum id) out)
  1544. (cons (expand i r* w* mod) inits))))
  1545. tmp)
  1546. (syntax-violation #f "source expression failed to match any pattern" tmp-1))))
  1547. (rest (let* ((v (gen-var rest))
  1548. (l (gen-labels (list v)))
  1549. (r* (extend-var-env l (list v) r*))
  1550. (w* (make-binding-wrap (list rest) l w*)))
  1551. (parse-kw
  1552. req
  1553. (and (pair? out) (reverse out))
  1554. (syntax->datum rest)
  1555. (if (pair? kw) (cdr kw) kw)
  1556. body
  1557. (cons v vars)
  1558. r*
  1559. w*
  1560. (and (pair? kw) (car kw))
  1561. '()
  1562. inits)))
  1563. (else (parse-kw
  1564. req
  1565. (and (pair? out) (reverse out))
  1566. #f
  1567. (if (pair? kw) (cdr kw) kw)
  1568. body
  1569. vars
  1570. r*
  1571. w*
  1572. (and (pair? kw) (car kw))
  1573. '()
  1574. inits)))))
  1575. (parse-kw
  1576. (lambda (req opt rest kw body vars r* w* aok out inits)
  1577. (if (pair? kw)
  1578. (let* ((tmp-1 (car kw)) (tmp ($sc-dispatch tmp-1 '(any any any))))
  1579. (if tmp
  1580. (apply (lambda (k id i)
  1581. (let* ((v (gen-var id))
  1582. (l (gen-labels (list v)))
  1583. (r** (extend-var-env l (list v) r*))
  1584. (w** (make-binding-wrap (list id) l w*)))
  1585. (parse-kw
  1586. req
  1587. opt
  1588. rest
  1589. (cdr kw)
  1590. body
  1591. (cons v vars)
  1592. r**
  1593. w**
  1594. aok
  1595. (cons (list (syntax->datum k) (syntax->datum id) v) out)
  1596. (cons (expand i r* w* mod) inits))))
  1597. tmp)
  1598. (syntax-violation #f "source expression failed to match any pattern" tmp-1)))
  1599. (parse-body
  1600. req
  1601. opt
  1602. rest
  1603. (and (or aok (pair? out)) (cons aok (reverse out)))
  1604. body
  1605. (reverse vars)
  1606. r*
  1607. w*
  1608. (reverse inits)
  1609. '()))))
  1610. (parse-body
  1611. (lambda (req opt rest kw body vars r* w* inits meta)
  1612. (let* ((tmp body) (tmp-1 ($sc-dispatch tmp '(any any . each-any))))
  1613. (if (and tmp-1
  1614. (apply (lambda (docstring e1 e2) (string? (syntax->datum docstring))) tmp-1))
  1615. (apply (lambda (docstring e1 e2)
  1616. (parse-body
  1617. req
  1618. opt
  1619. rest
  1620. kw
  1621. (cons e1 e2)
  1622. vars
  1623. r*
  1624. w*
  1625. inits
  1626. (append meta (list (cons 'documentation (syntax->datum docstring))))))
  1627. tmp-1)
  1628. (let ((tmp-1 ($sc-dispatch tmp '(#(vector #(each (any . any))) any . each-any))))
  1629. (if tmp-1
  1630. (apply (lambda (k v e1 e2)
  1631. (parse-body
  1632. req
  1633. opt
  1634. rest
  1635. kw
  1636. (cons e1 e2)
  1637. vars
  1638. r*
  1639. w*
  1640. inits
  1641. (append meta (syntax->datum (map cons k v)))))
  1642. tmp-1)
  1643. (let ((tmp-1 ($sc-dispatch tmp '(any . each-any))))
  1644. (if tmp-1
  1645. (apply (lambda (e1 e2)
  1646. (values
  1647. meta
  1648. req
  1649. opt
  1650. rest
  1651. kw
  1652. inits
  1653. vars
  1654. (expand-body (cons e1 e2) (source-wrap e w s mod) r* w* mod)))
  1655. tmp-1)
  1656. (syntax-violation #f "source expression failed to match any pattern" tmp))))))))))
  1657. (let* ((tmp clauses) (tmp-1 ($sc-dispatch tmp '())))
  1658. (if tmp-1
  1659. (apply (lambda () (values '() #f)) tmp-1)
  1660. (let ((tmp-1 ($sc-dispatch tmp '((any any . each-any) . #(each (any any . each-any))))))
  1661. (if tmp-1
  1662. (apply (lambda (args e1 e2 args* e1* e2*)
  1663. (call-with-values
  1664. (lambda () (get-formals args))
  1665. (lambda (req opt rest kw)
  1666. (call-with-values
  1667. (lambda () (parse-req req opt rest kw (cons e1 e2)))
  1668. (lambda (meta req opt rest kw inits vars body)
  1669. (call-with-values
  1670. (lambda ()
  1671. (expand-lambda-case
  1672. e
  1673. r
  1674. w
  1675. s
  1676. mod
  1677. get-formals
  1678. (map (lambda (tmp-680b775fb37a463-ece
  1679. tmp-680b775fb37a463-ecd
  1680. tmp-680b775fb37a463-ecc)
  1681. (cons tmp-680b775fb37a463-ecc
  1682. (cons tmp-680b775fb37a463-ecd tmp-680b775fb37a463-ece)))
  1683. e2*
  1684. e1*
  1685. args*)))
  1686. (lambda (meta* else*)
  1687. (values
  1688. (append meta meta*)
  1689. (build-lambda-case s req opt rest kw inits vars body else*)))))))))
  1690. tmp-1)
  1691. (syntax-violation #f "source expression failed to match any pattern" tmp))))))))
  1692. (strip (lambda (x)
  1693. (letrec* ((annotate
  1694. (lambda (proc datum)
  1695. (let ((s (proc x)))
  1696. (if (and s (supports-source-properties? datum))
  1697. (set-source-properties! datum (sourcev->alist s)))
  1698. datum))))
  1699. (cond
  1700. ((syntax? x) (annotate syntax-sourcev (strip (syntax-expression x))))
  1701. ((pair? x) (cons (strip (car x)) (strip (cdr x))))
  1702. ((vector? x) (list->vector (strip (vector->list x))))
  1703. (else x)))))
  1704. (gen-var (lambda (id) (let ((id (if (syntax? id) (syntax-expression id) id))) (gen-lexical id))))
  1705. (lambda-var-list
  1706. (lambda (vars)
  1707. (let lvl ((vars vars) (ls '()) (w empty-wrap))
  1708. (cond
  1709. ((pair? vars) (lvl (cdr vars) (cons (wrap (car vars) w #f) ls) w))
  1710. ((id? vars) (cons (wrap vars w #f) ls))
  1711. ((null? vars) ls)
  1712. ((syntax? vars) (lvl (syntax-expression vars) ls (join-wraps w (syntax-wrap vars))))
  1713. (else (cons vars ls))))))
  1714. (expand-syntax-parameterize
  1715. (lambda (e r w s mod)
  1716. (let* ((tmp e) (tmp ($sc-dispatch tmp '(_ #(each (any any)) any . each-any))))
  1717. (if (and tmp (apply (lambda (var val e1 e2) (valid-bound-ids? var)) tmp))
  1718. (apply (lambda (var val e1 e2)
  1719. (let ((names (map (lambda (x)
  1720. (call-with-values
  1721. (lambda () (resolve-identifier x w r mod #f))
  1722. (lambda (type value mod)
  1723. (let ((key type))
  1724. (cond
  1725. ((memv key '(displaced-lexical))
  1726. (syntax-violation
  1727. 'syntax-parameterize
  1728. "identifier out of context"
  1729. e
  1730. (source-wrap x w s mod)))
  1731. ((memv key '(syntax-parameter)) value)
  1732. (else (syntax-violation
  1733. 'syntax-parameterize
  1734. "invalid syntax parameter"
  1735. e
  1736. (source-wrap x w s mod))))))))
  1737. var))
  1738. (bindings
  1739. (let ((trans-r (macros-only-env r)))
  1740. (map (lambda (x)
  1741. (cons 'syntax-parameter
  1742. (eval-local-transformer (expand x trans-r w mod) mod)))
  1743. val))))
  1744. (expand-body (cons e1 e2) (source-wrap e w s mod) (extend-env names bindings r) w mod)))
  1745. tmp)
  1746. (syntax-violation 'syntax-parameterize "bad syntax" (source-wrap e w s mod))))))
  1747. (expand-quote
  1748. (lambda (e r w s mod)
  1749. (let* ((tmp e) (tmp ($sc-dispatch tmp '(_ any))))
  1750. (if tmp
  1751. (apply (lambda (e) (build-data s (strip e))) tmp)
  1752. (syntax-violation 'quote "bad syntax" (source-wrap e w s mod))))))
  1753. (expand-quote-syntax
  1754. (lambda (e r w s mod)
  1755. (let* ((tmp-1 (source-wrap e w s mod)) (tmp ($sc-dispatch tmp-1 '(_ any))))
  1756. (if tmp
  1757. (apply (lambda (e) (build-data s e)) tmp)
  1758. (let ((e tmp-1)) (syntax-violation 'quote "bad syntax" e))))))
  1759. (expand-syntax
  1760. (letrec* ((gen-syntax
  1761. (lambda (src e r maps ellipsis? mod)
  1762. (if (id? e)
  1763. (call-with-values
  1764. (lambda () (resolve-identifier e empty-wrap r mod #f))
  1765. (lambda (type value mod)
  1766. (let ((key type))
  1767. (cond
  1768. ((memv key '(syntax))
  1769. (call-with-values
  1770. (lambda () (gen-ref src (car value) (cdr value) maps))
  1771. (lambda (var maps) (values (list 'ref var) maps))))
  1772. ((ellipsis? e r mod) (syntax-violation 'syntax "misplaced ellipsis" src))
  1773. (else (values (list 'quote e) maps))))))
  1774. (let* ((tmp e) (tmp-1 ($sc-dispatch tmp '(any any))))
  1775. (if (and tmp-1 (apply (lambda (dots e) (ellipsis? dots r mod)) tmp-1))
  1776. (apply (lambda (dots e) (gen-syntax src e r maps (lambda (e r mod) #f) mod)) tmp-1)
  1777. (let ((tmp-1 ($sc-dispatch tmp '(any any . any))))
  1778. (if (and tmp-1 (apply (lambda (x dots y) (ellipsis? dots r mod)) tmp-1))
  1779. (apply (lambda (x dots y)
  1780. (let f ((y y)
  1781. (k (lambda (maps)
  1782. (call-with-values
  1783. (lambda ()
  1784. (gen-syntax src x r (cons '() maps) ellipsis? mod))
  1785. (lambda (x maps)
  1786. (if (null? (car maps))
  1787. (syntax-violation 'syntax "extra ellipsis" src)
  1788. (values (gen-map x (car maps)) (cdr maps))))))))
  1789. (let* ((tmp y) (tmp ($sc-dispatch tmp '(any . any))))
  1790. (if (and tmp
  1791. (apply (lambda (dots y) (ellipsis? dots r mod)) tmp))
  1792. (apply (lambda (dots y)
  1793. (f y
  1794. (lambda (maps)
  1795. (call-with-values
  1796. (lambda () (k (cons '() maps)))
  1797. (lambda (x maps)
  1798. (if (null? (car maps))
  1799. (syntax-violation
  1800. 'syntax
  1801. "extra ellipsis"
  1802. src)
  1803. (values
  1804. (gen-mappend x (car maps))
  1805. (cdr maps))))))))
  1806. tmp)
  1807. (call-with-values
  1808. (lambda () (gen-syntax src y r maps ellipsis? mod))
  1809. (lambda (y maps)
  1810. (call-with-values
  1811. (lambda () (k maps))
  1812. (lambda (x maps) (values (gen-append x y) maps)))))))))
  1813. tmp-1)
  1814. (let ((tmp-1 ($sc-dispatch tmp '(any . any))))
  1815. (if tmp-1
  1816. (apply (lambda (x y)
  1817. (call-with-values
  1818. (lambda () (gen-syntax src x r maps ellipsis? mod))
  1819. (lambda (x maps)
  1820. (call-with-values
  1821. (lambda () (gen-syntax src y r maps ellipsis? mod))
  1822. (lambda (y maps) (values (gen-cons x y) maps))))))
  1823. tmp-1)
  1824. (let ((tmp-1 ($sc-dispatch tmp '#(vector (any . each-any)))))
  1825. (if tmp-1
  1826. (apply (lambda (e1 e2)
  1827. (call-with-values
  1828. (lambda ()
  1829. (gen-syntax src (cons e1 e2) r maps ellipsis? mod))
  1830. (lambda (e maps) (values (gen-vector e) maps))))
  1831. tmp-1)
  1832. (let ((tmp-1 (list tmp)))
  1833. (if (and tmp-1
  1834. (apply (lambda (x) (eq? (syntax->datum x) #nil)) tmp-1))
  1835. (apply (lambda (x) (values ''#nil maps)) tmp-1)
  1836. (let ((tmp ($sc-dispatch tmp '())))
  1837. (if tmp
  1838. (apply (lambda () (values ''() maps)) tmp)
  1839. (values (list 'quote e) maps))))))))))))))))
  1840. (gen-ref
  1841. (lambda (src var level maps)
  1842. (cond
  1843. ((= level 0) (values var maps))
  1844. ((null? maps) (syntax-violation 'syntax "missing ellipsis" src))
  1845. (else (call-with-values
  1846. (lambda () (gen-ref src var (#{1-}# level) (cdr maps)))
  1847. (lambda (outer-var outer-maps)
  1848. (let ((b (assq outer-var (car maps))))
  1849. (if b
  1850. (values (cdr b) maps)
  1851. (let ((inner-var (gen-var 'tmp)))
  1852. (values
  1853. inner-var
  1854. (cons (cons (cons outer-var inner-var) (car maps)) outer-maps)))))))))))
  1855. (gen-mappend (lambda (e map-env) (list 'apply '(primitive append) (gen-map e map-env))))
  1856. (gen-map
  1857. (lambda (e map-env)
  1858. (let ((formals (map cdr map-env)) (actuals (map (lambda (x) (list 'ref (car x))) map-env)))
  1859. (cond
  1860. ((eq? (car e) 'ref) (car actuals))
  1861. ((and-map (lambda (x) (and (eq? (car x) 'ref) (memq (cadr x) formals))) (cdr e))
  1862. (cons 'map
  1863. (cons (list 'primitive (car e))
  1864. (map (let ((r (map cons formals actuals)))
  1865. (lambda (x) (cdr (assq (cadr x) r))))
  1866. (cdr e)))))
  1867. (else (cons 'map (cons (list 'lambda formals e) actuals)))))))
  1868. (gen-cons
  1869. (lambda (x y)
  1870. (let ((key (car y)))
  1871. (cond
  1872. ((memv key '(quote))
  1873. (cond
  1874. ((eq? (car x) 'quote) (list 'quote (cons (cadr x) (cadr y))))
  1875. ((eq? (cadr y) '()) (list 'list x))
  1876. (else (list 'cons x y))))
  1877. ((memv key '(list)) (cons 'list (cons x (cdr y))))
  1878. (else (list 'cons x y))))))
  1879. (gen-append (lambda (x y) (if (equal? y ''()) x (list 'append x y))))
  1880. (gen-vector
  1881. (lambda (x)
  1882. (cond
  1883. ((eq? (car x) 'list) (cons 'vector (cdr x)))
  1884. ((eq? (car x) 'quote) (list 'quote (list->vector (cadr x))))
  1885. (else (list 'list->vector x)))))
  1886. (regen (lambda (x)
  1887. (let ((key (car x)))
  1888. (cond
  1889. ((memv key '(ref)) (build-lexical-reference no-source (cadr x) (cadr x)))
  1890. ((memv key '(primitive)) (build-primref no-source (cadr x)))
  1891. ((memv key '(quote)) (build-data no-source (cadr x)))
  1892. ((memv key '(lambda))
  1893. (if (list? (cadr x))
  1894. (build-simple-lambda no-source (cadr x) #f (cadr x) '() (regen (caddr x)))
  1895. (error "how did we get here" x)))
  1896. (else (build-primcall no-source (car x) (map regen (cdr x)))))))))
  1897. (lambda (e r w s mod)
  1898. (let* ((e (source-wrap e w s mod)) (tmp e) (tmp ($sc-dispatch tmp '(_ any))))
  1899. (if tmp
  1900. (apply (lambda (x)
  1901. (call-with-values
  1902. (lambda () (gen-syntax e x r '() ellipsis? mod))
  1903. (lambda (e maps) (regen e))))
  1904. tmp)
  1905. (syntax-violation 'syntax "bad `syntax' form" e))))))
  1906. (expand-lambda
  1907. (lambda (e r w s mod)
  1908. (let* ((tmp e) (tmp ($sc-dispatch tmp '(_ any any . each-any))))
  1909. (if tmp
  1910. (apply (lambda (args e1 e2)
  1911. (call-with-values
  1912. (lambda () (lambda-formals args))
  1913. (lambda (req opt rest kw)
  1914. (let lp ((body (cons e1 e2)) (meta '()))
  1915. (let* ((tmp-1 body) (tmp ($sc-dispatch tmp-1 '(any any . each-any))))
  1916. (if (and tmp
  1917. (apply (lambda (docstring e1 e2) (string? (syntax->datum docstring))) tmp))
  1918. (apply (lambda (docstring e1 e2)
  1919. (lp (cons e1 e2)
  1920. (append
  1921. meta
  1922. (list (cons 'documentation (syntax->datum docstring))))))
  1923. tmp)
  1924. (let ((tmp ($sc-dispatch tmp-1 '(#(vector #(each (any . any))) any . each-any))))
  1925. (if tmp
  1926. (apply (lambda (k v e1 e2)
  1927. (lp (cons e1 e2) (append meta (syntax->datum (map cons k v)))))
  1928. tmp)
  1929. (expand-simple-lambda e r w s mod req rest meta body)))))))))
  1930. tmp)
  1931. (syntax-violation 'lambda "bad lambda" e)))))
  1932. (expand-lambda*
  1933. (lambda (e r w s mod)
  1934. (let* ((tmp e) (tmp ($sc-dispatch tmp '(_ any any . each-any))))
  1935. (if tmp
  1936. (apply (lambda (args e1 e2)
  1937. (call-with-values
  1938. (lambda ()
  1939. (expand-lambda-case e r w s mod lambda*-formals (list (cons args (cons e1 e2)))))
  1940. (lambda (meta lcase) (build-case-lambda s meta lcase))))
  1941. tmp)
  1942. (syntax-violation 'lambda "bad lambda*" e)))))
  1943. (expand-case-lambda
  1944. (lambda (e r w s mod)
  1945. (letrec* ((build-it
  1946. (lambda (meta clauses)
  1947. (call-with-values
  1948. (lambda () (expand-lambda-case e r w s mod lambda-formals clauses))
  1949. (lambda (meta* lcase) (build-case-lambda s (append meta meta*) lcase))))))
  1950. (let* ((tmp-1 e) (tmp ($sc-dispatch tmp-1 '(_ . #(each (any any . each-any))))))
  1951. (if tmp
  1952. (apply (lambda (args e1 e2)
  1953. (build-it
  1954. '()
  1955. (map (lambda (tmp-680b775fb37a463-2 tmp-680b775fb37a463-1 tmp-680b775fb37a463)
  1956. (cons tmp-680b775fb37a463 (cons tmp-680b775fb37a463-1 tmp-680b775fb37a463-2)))
  1957. e2
  1958. e1
  1959. args)))
  1960. tmp)
  1961. (let ((tmp ($sc-dispatch tmp-1 '(_ any . #(each (any any . each-any))))))
  1962. (if (and tmp (apply (lambda (docstring args e1 e2) (string? (syntax->datum docstring))) tmp))
  1963. (apply (lambda (docstring args e1 e2)
  1964. (build-it
  1965. (list (cons 'documentation (syntax->datum docstring)))
  1966. (map (lambda (tmp-680b775fb37a463-2 tmp-680b775fb37a463-1 tmp-680b775fb37a463)
  1967. (cons tmp-680b775fb37a463
  1968. (cons tmp-680b775fb37a463-1 tmp-680b775fb37a463-2)))
  1969. e2
  1970. e1
  1971. args)))
  1972. tmp)
  1973. (syntax-violation 'case-lambda "bad case-lambda" e))))))))
  1974. (expand-case-lambda*
  1975. (lambda (e r w s mod)
  1976. (letrec* ((build-it
  1977. (lambda (meta clauses)
  1978. (call-with-values
  1979. (lambda () (expand-lambda-case e r w s mod lambda*-formals clauses))
  1980. (lambda (meta* lcase) (build-case-lambda s (append meta meta*) lcase))))))
  1981. (let* ((tmp-1 e) (tmp ($sc-dispatch tmp-1 '(_ . #(each (any any . each-any))))))
  1982. (if tmp
  1983. (apply (lambda (args e1 e2)
  1984. (build-it
  1985. '()
  1986. (map (lambda (tmp-680b775fb37a463-2 tmp-680b775fb37a463-1 tmp-680b775fb37a463)
  1987. (cons tmp-680b775fb37a463 (cons tmp-680b775fb37a463-1 tmp-680b775fb37a463-2)))
  1988. e2
  1989. e1
  1990. args)))
  1991. tmp)
  1992. (let ((tmp ($sc-dispatch tmp-1 '(_ any . #(each (any any . each-any))))))
  1993. (if (and tmp (apply (lambda (docstring args e1 e2) (string? (syntax->datum docstring))) tmp))
  1994. (apply (lambda (docstring args e1 e2)
  1995. (build-it
  1996. (list (cons 'documentation (syntax->datum docstring)))
  1997. (map (lambda (tmp-680b775fb37a463-117f
  1998. tmp-680b775fb37a463-117e
  1999. tmp-680b775fb37a463-117d)
  2000. (cons tmp-680b775fb37a463-117d
  2001. (cons tmp-680b775fb37a463-117e tmp-680b775fb37a463-117f)))
  2002. e2
  2003. e1
  2004. args)))
  2005. tmp)
  2006. (syntax-violation 'case-lambda "bad case-lambda*" e))))))))
  2007. (expand-with-ellipsis
  2008. (lambda (e r w s mod)
  2009. (let* ((tmp e) (tmp ($sc-dispatch tmp '(_ any any . each-any))))
  2010. (if (and tmp (apply (lambda (dots e1 e2) (id? dots)) tmp))
  2011. (apply (lambda (dots e1 e2)
  2012. (let ((id (if (symbol? dots)
  2013. '#{ $sc-ellipsis }#
  2014. (make-syntax
  2015. '#{ $sc-ellipsis }#
  2016. (syntax-wrap dots)
  2017. (syntax-module dots)
  2018. (syntax-sourcev dots)))))
  2019. (let ((ids (list id))
  2020. (labels (list (gen-label)))
  2021. (bindings (list (cons 'ellipsis (source-wrap dots w s mod)))))
  2022. (let ((nw (make-binding-wrap ids labels w)) (nr (extend-env labels bindings r)))
  2023. (expand-body (cons e1 e2) (source-wrap e nw s mod) nr nw mod)))))
  2024. tmp)
  2025. (syntax-violation 'with-ellipsis "bad syntax" (source-wrap e w s mod))))))
  2026. (expand-let
  2027. (letrec* ((expand-let
  2028. (lambda (e r w s mod constructor ids vals exps)
  2029. (if (not (valid-bound-ids? ids))
  2030. (syntax-violation 'let "duplicate bound variable" e)
  2031. (let ((labels (gen-labels ids)) (new-vars (map gen-var ids)))
  2032. (let ((nw (make-binding-wrap ids labels w)) (nr (extend-var-env labels new-vars r)))
  2033. (constructor
  2034. s
  2035. (map syntax->datum ids)
  2036. new-vars
  2037. (map (lambda (x) (expand x r w mod)) vals)
  2038. (expand-body exps (source-wrap e nw s mod) nr nw mod))))))))
  2039. (lambda (e r w s mod)
  2040. (let* ((tmp-1 e) (tmp ($sc-dispatch tmp-1 '(_ #(each (any any)) any . each-any))))
  2041. (if (and tmp (apply (lambda (id val e1 e2) (and-map id? id)) tmp))
  2042. (apply (lambda (id val e1 e2) (expand-let e r w s mod build-let id val (cons e1 e2))) tmp)
  2043. (let ((tmp ($sc-dispatch tmp-1 '(_ any #(each (any any)) any . each-any))))
  2044. (if (and tmp (apply (lambda (f id val e1 e2) (and (id? f) (and-map id? id))) tmp))
  2045. (apply (lambda (f id val e1 e2)
  2046. (expand-let e r w s mod build-named-let (cons f id) val (cons e1 e2)))
  2047. tmp)
  2048. (syntax-violation 'let "bad let" (source-wrap e w s mod)))))))))
  2049. (expand-letrec
  2050. (lambda (e r w s mod)
  2051. (let* ((tmp e) (tmp ($sc-dispatch tmp '(_ #(each (any any)) any . each-any))))
  2052. (if (and tmp (apply (lambda (id val e1 e2) (and-map id? id)) tmp))
  2053. (apply (lambda (id val e1 e2)
  2054. (let ((ids id))
  2055. (if (not (valid-bound-ids? ids))
  2056. (syntax-violation 'letrec "duplicate bound variable" e)
  2057. (let ((labels (gen-labels ids)) (new-vars (map gen-var ids)))
  2058. (let ((w (make-binding-wrap ids labels w)) (r (extend-var-env labels new-vars r)))
  2059. (build-letrec
  2060. s
  2061. #f
  2062. (map syntax->datum ids)
  2063. new-vars
  2064. (map (lambda (x) (expand x r w mod)) val)
  2065. (expand-body (cons e1 e2) (source-wrap e w s mod) r w mod)))))))
  2066. tmp)
  2067. (syntax-violation 'letrec "bad letrec" (source-wrap e w s mod))))))
  2068. (expand-letrec*
  2069. (lambda (e r w s mod)
  2070. (let* ((tmp e) (tmp ($sc-dispatch tmp '(_ #(each (any any)) any . each-any))))
  2071. (if (and tmp (apply (lambda (id val e1 e2) (and-map id? id)) tmp))
  2072. (apply (lambda (id val e1 e2)
  2073. (let ((ids id))
  2074. (if (not (valid-bound-ids? ids))
  2075. (syntax-violation 'letrec* "duplicate bound variable" e)
  2076. (let ((labels (gen-labels ids)) (new-vars (map gen-var ids)))
  2077. (let ((w (make-binding-wrap ids labels w)) (r (extend-var-env labels new-vars r)))
  2078. (build-letrec
  2079. s
  2080. #t
  2081. (map syntax->datum ids)
  2082. new-vars
  2083. (map (lambda (x) (expand x r w mod)) val)
  2084. (expand-body (cons e1 e2) (source-wrap e w s mod) r w mod)))))))
  2085. tmp)
  2086. (syntax-violation 'letrec* "bad letrec*" (source-wrap e w s mod))))))
  2087. (expand-set!
  2088. (lambda (e r w s mod)
  2089. (let* ((tmp-1 e) (tmp ($sc-dispatch tmp-1 '(_ any any))))
  2090. (if (and tmp (apply (lambda (id val) (id? id)) tmp))
  2091. (apply (lambda (id val)
  2092. (call-with-values
  2093. (lambda () (resolve-identifier id w r mod #t))
  2094. (lambda (type value id-mod)
  2095. (let ((key type))
  2096. (cond
  2097. ((memv key '(lexical))
  2098. (build-lexical-assignment s (syntax->datum id) value (expand val r w mod)))
  2099. ((memv key '(global))
  2100. (build-global-assignment s value (expand val r w mod) id-mod))
  2101. ((memv key '(macro))
  2102. (if (procedure-property value 'variable-transformer)
  2103. (expand (expand-macro value e r w s #f mod) r empty-wrap mod)
  2104. (syntax-violation
  2105. 'set!
  2106. "not a variable transformer"
  2107. (wrap e w mod)
  2108. (wrap id w id-mod))))
  2109. ((memv key '(displaced-lexical))
  2110. (syntax-violation 'set! "identifier out of context" (wrap id w mod)))
  2111. (else (syntax-violation 'set! "bad set!" (source-wrap e w s mod))))))))
  2112. tmp)
  2113. (let ((tmp ($sc-dispatch tmp-1 '(_ (any . each-any) any))))
  2114. (if tmp
  2115. (apply (lambda (head tail val)
  2116. (call-with-values
  2117. (lambda () (syntax-type head r empty-wrap no-source #f mod #t))
  2118. (lambda (type value ee* ee ww ss modmod)
  2119. (let ((key type))
  2120. (if (memv key '(module-ref))
  2121. (let ((val (expand val r w mod)))
  2122. (call-with-values
  2123. (lambda () (value (cons head tail) r w mod))
  2124. (lambda (e r w s* mod)
  2125. (let* ((tmp-1 e) (tmp (list tmp-1)))
  2126. (if (and tmp (apply (lambda (e) (id? e)) tmp))
  2127. (apply (lambda (e)
  2128. (build-global-assignment s (syntax->datum e) val mod))
  2129. tmp)
  2130. (syntax-violation
  2131. #f
  2132. "source expression failed to match any pattern"
  2133. tmp-1))))))
  2134. (build-call
  2135. s
  2136. (expand
  2137. (list (make-syntax 'setter '((top)) '(hygiene guile)) head)
  2138. r
  2139. w
  2140. mod)
  2141. (map (lambda (e) (expand e r w mod)) (append tail (list val)))))))))
  2142. tmp)
  2143. (syntax-violation 'set! "bad set!" (source-wrap e w s mod))))))))
  2144. (expand-public-ref
  2145. (lambda (e r w mod)
  2146. (let* ((tmp-1 e) (tmp ($sc-dispatch tmp-1 '(_ each-any any))))
  2147. (if (and tmp (apply (lambda (mod id) (and (and-map id? mod) (id? id))) tmp))
  2148. (apply (lambda (mod id)
  2149. (values
  2150. (syntax->datum id)
  2151. r
  2152. top-wrap
  2153. #f
  2154. (syntax->datum (cons (make-syntax 'public '((top)) '(hygiene guile)) mod))))
  2155. tmp)
  2156. (syntax-violation #f "source expression failed to match any pattern" tmp-1)))))
  2157. (expand-private-ref
  2158. (lambda (e r w mod)
  2159. (letrec* ((remodulate
  2160. (lambda (x mod)
  2161. (cond
  2162. ((pair? x) (cons (remodulate (car x) mod) (remodulate (cdr x) mod)))
  2163. ((syntax? x)
  2164. (make-syntax
  2165. (remodulate (syntax-expression x) mod)
  2166. (syntax-wrap x)
  2167. mod
  2168. (syntax-sourcev x)))
  2169. ((vector? x)
  2170. (let* ((n (vector-length x)) (v (make-vector n)))
  2171. (let loop ((i 0))
  2172. (if (= i n)
  2173. (begin (if #f #f) v)
  2174. (begin (vector-set! v i (remodulate (vector-ref x i) mod)) (loop (#{1+}# i)))))))
  2175. (else x)))))
  2176. (let* ((tmp e)
  2177. (tmp-1 ($sc-dispatch
  2178. tmp
  2179. (list '_ (vector 'free-id (make-syntax 'primitive '((top)) '(hygiene guile))) 'any))))
  2180. (if (and tmp-1
  2181. (apply (lambda (id)
  2182. (and (id? id)
  2183. (equal? (cdr (or (and (syntax? id) (syntax-module id)) mod)) '(guile))))
  2184. tmp-1))
  2185. (apply (lambda (id) (values (syntax->datum id) r top-wrap #f '(primitive))) tmp-1)
  2186. (let ((tmp-1 ($sc-dispatch tmp '(_ each-any any))))
  2187. (if (and tmp-1 (apply (lambda (mod id) (and (and-map id? mod) (id? id))) tmp-1))
  2188. (apply (lambda (mod id)
  2189. (values
  2190. (syntax->datum id)
  2191. r
  2192. top-wrap
  2193. #f
  2194. (syntax->datum (cons (make-syntax 'private '((top)) '(hygiene guile)) mod))))
  2195. tmp-1)
  2196. (let ((tmp-1 ($sc-dispatch
  2197. tmp
  2198. (list '_
  2199. (vector 'free-id (make-syntax '@@ '((top)) '(hygiene guile)))
  2200. 'each-any
  2201. 'any))))
  2202. (if (and tmp-1 (apply (lambda (mod exp) (and-map id? mod)) tmp-1))
  2203. (apply (lambda (mod exp)
  2204. (let ((mod (syntax->datum
  2205. (cons (make-syntax 'private '((top)) '(hygiene guile)) mod))))
  2206. (values (remodulate exp mod) r w (source-annotation exp) mod)))
  2207. tmp-1)
  2208. (syntax-violation #f "source expression failed to match any pattern" tmp))))))))))
  2209. (expand-if
  2210. (lambda (e r w s mod)
  2211. (let* ((tmp e) (tmp-1 ($sc-dispatch tmp '(_ any any))))
  2212. (if tmp-1
  2213. (apply (lambda (test then)
  2214. (build-conditional s (expand test r w mod) (expand then r w mod) (build-void no-source)))
  2215. tmp-1)
  2216. (let ((tmp-1 ($sc-dispatch tmp '(_ any any any))))
  2217. (if tmp-1
  2218. (apply (lambda (test then else)
  2219. (build-conditional
  2220. s
  2221. (expand test r w mod)
  2222. (expand then r w mod)
  2223. (expand else r w mod)))
  2224. tmp-1)
  2225. (syntax-violation #f "source expression failed to match any pattern" tmp)))))))
  2226. (expand-syntax-case
  2227. (letrec* ((convert-pattern
  2228. (lambda (pattern keys ellipsis?)
  2229. (letrec* ((cvt* (lambda (p* n ids)
  2230. (let* ((tmp p*) (tmp ($sc-dispatch tmp '(any . any))))
  2231. (if tmp
  2232. (apply (lambda (x y)
  2233. (call-with-values
  2234. (lambda () (cvt* y n ids))
  2235. (lambda (y ids)
  2236. (call-with-values
  2237. (lambda () (cvt x n ids))
  2238. (lambda (x ids) (values (cons x y) ids))))))
  2239. tmp)
  2240. (cvt p* n ids)))))
  2241. (v-reverse
  2242. (lambda (x)
  2243. (let loop ((r '()) (x x))
  2244. (if (not (pair? x)) (values r x) (loop (cons (car x) r) (cdr x))))))
  2245. (cvt (lambda (p n ids)
  2246. (if (id? p)
  2247. (cond
  2248. ((bound-id-member? p keys) (values (vector 'free-id p) ids))
  2249. ((free-id=? p (make-syntax '_ '((top)) '(hygiene guile)))
  2250. (values '_ ids))
  2251. (else (values 'any (cons (cons p n) ids))))
  2252. (let* ((tmp p) (tmp-1 ($sc-dispatch tmp '(any any))))
  2253. (if (and tmp-1 (apply (lambda (x dots) (ellipsis? dots)) tmp-1))
  2254. (apply (lambda (x dots)
  2255. (call-with-values
  2256. (lambda () (cvt x (#{1+}# n) ids))
  2257. (lambda (p ids)
  2258. (values
  2259. (if (eq? p 'any) 'each-any (vector 'each p))
  2260. ids))))
  2261. tmp-1)
  2262. (let ((tmp-1 ($sc-dispatch tmp '(any any . any))))
  2263. (if (and tmp-1
  2264. (apply (lambda (x dots ys) (ellipsis? dots)) tmp-1))
  2265. (apply (lambda (x dots ys)
  2266. (call-with-values
  2267. (lambda () (cvt* ys n ids))
  2268. (lambda (ys ids)
  2269. (call-with-values
  2270. (lambda () (cvt x (+ n 1) ids))
  2271. (lambda (x ids)
  2272. (call-with-values
  2273. (lambda () (v-reverse ys))
  2274. (lambda (ys e)
  2275. (values (vector 'each+ x ys e) ids))))))))
  2276. tmp-1)
  2277. (let ((tmp-1 ($sc-dispatch tmp '(any . any))))
  2278. (if tmp-1
  2279. (apply (lambda (x y)
  2280. (call-with-values
  2281. (lambda () (cvt y n ids))
  2282. (lambda (y ids)
  2283. (call-with-values
  2284. (lambda () (cvt x n ids))
  2285. (lambda (x ids) (values (cons x y) ids))))))
  2286. tmp-1)
  2287. (let ((tmp-1 ($sc-dispatch tmp '())))
  2288. (if tmp-1
  2289. (apply (lambda () (values '() ids)) tmp-1)
  2290. (let ((tmp-1 ($sc-dispatch
  2291. tmp
  2292. '#(vector each-any))))
  2293. (if tmp-1
  2294. (apply (lambda (x)
  2295. (call-with-values
  2296. (lambda () (cvt x n ids))
  2297. (lambda (p ids)
  2298. (values (vector 'vector p) ids))))
  2299. tmp-1)
  2300. (let ((x tmp))
  2301. (values (vector 'atom (strip p)) ids))))))))))))))))
  2302. (cvt pattern 0 '()))))
  2303. (build-dispatch-call
  2304. (lambda (pvars exp y r mod)
  2305. (let ((ids (map car pvars)) (levels (map cdr pvars)))
  2306. (let ((labels (gen-labels ids)) (new-vars (map gen-var ids)))
  2307. (build-primcall
  2308. no-source
  2309. 'apply
  2310. (list (build-simple-lambda
  2311. no-source
  2312. (map syntax->datum ids)
  2313. #f
  2314. new-vars
  2315. '()
  2316. (expand
  2317. exp
  2318. (extend-env
  2319. labels
  2320. (map (lambda (var level) (cons 'syntax (cons var level)))
  2321. new-vars
  2322. (map cdr pvars))
  2323. r)
  2324. (make-binding-wrap ids labels empty-wrap)
  2325. mod))
  2326. y))))))
  2327. (gen-clause
  2328. (lambda (x keys clauses r pat fender exp mod)
  2329. (call-with-values
  2330. (lambda () (convert-pattern pat keys (lambda (e) (ellipsis? e r mod))))
  2331. (lambda (p pvars)
  2332. (cond
  2333. ((not (and-map (lambda (x) (not (ellipsis? (car x) r mod))) pvars))
  2334. (syntax-violation 'syntax-case "misplaced ellipsis" pat))
  2335. ((not (distinct-bound-ids? (map car pvars)))
  2336. (syntax-violation 'syntax-case "duplicate pattern variable" pat))
  2337. (else (let ((y (gen-var 'tmp)))
  2338. (build-call
  2339. no-source
  2340. (build-simple-lambda
  2341. no-source
  2342. (list 'tmp)
  2343. #f
  2344. (list y)
  2345. '()
  2346. (let ((y (build-lexical-reference no-source 'tmp y)))
  2347. (build-conditional
  2348. no-source
  2349. (let* ((tmp fender) (tmp ($sc-dispatch tmp '#(atom #t))))
  2350. (if tmp
  2351. (apply (lambda () y) tmp)
  2352. (build-conditional
  2353. no-source
  2354. y
  2355. (build-dispatch-call pvars fender y r mod)
  2356. (build-data no-source #f))))
  2357. (build-dispatch-call pvars exp y r mod)
  2358. (gen-syntax-case x keys clauses r mod))))
  2359. (list (if (eq? p 'any)
  2360. (build-primcall no-source 'list (list x))
  2361. (build-primcall
  2362. no-source
  2363. '$sc-dispatch
  2364. (list x (build-data no-source p)))))))))))))
  2365. (gen-syntax-case
  2366. (lambda (x keys clauses r mod)
  2367. (if (null? clauses)
  2368. (build-primcall
  2369. no-source
  2370. 'syntax-violation
  2371. (list (build-data no-source #f)
  2372. (build-data no-source "source expression failed to match any pattern")
  2373. x))
  2374. (let* ((tmp-1 (car clauses)) (tmp ($sc-dispatch tmp-1 '(any any))))
  2375. (if tmp
  2376. (apply (lambda (pat exp)
  2377. (if (and (id? pat)
  2378. (and-map
  2379. (lambda (x) (not (free-id=? pat x)))
  2380. (cons (make-syntax '... '((top)) '(hygiene guile)) keys)))
  2381. (if (free-id=? pat (make-syntax '_ '((top)) '(hygiene guile)))
  2382. (expand exp r empty-wrap mod)
  2383. (let ((labels (list (gen-label))) (var (gen-var pat)))
  2384. (build-call
  2385. no-source
  2386. (build-simple-lambda
  2387. no-source
  2388. (list (syntax->datum pat))
  2389. #f
  2390. (list var)
  2391. '()
  2392. (expand
  2393. exp
  2394. (extend-env labels (list (cons 'syntax (cons var 0))) r)
  2395. (make-binding-wrap (list pat) labels empty-wrap)
  2396. mod))
  2397. (list x))))
  2398. (gen-clause x keys (cdr clauses) r pat #t exp mod)))
  2399. tmp)
  2400. (let ((tmp ($sc-dispatch tmp-1 '(any any any))))
  2401. (if tmp
  2402. (apply (lambda (pat fender exp)
  2403. (gen-clause x keys (cdr clauses) r pat fender exp mod))
  2404. tmp)
  2405. (syntax-violation 'syntax-case "invalid clause" (car clauses))))))))))
  2406. (lambda (e r w s mod)
  2407. (let* ((e (source-wrap e w s mod)) (tmp-1 e) (tmp ($sc-dispatch tmp-1 '(_ any each-any . each-any))))
  2408. (if tmp
  2409. (apply (lambda (val key m)
  2410. (if (and-map (lambda (x) (and (id? x) (not (ellipsis? x r mod)))) key)
  2411. (let ((x (gen-var 'tmp)))
  2412. (build-call
  2413. s
  2414. (build-simple-lambda
  2415. no-source
  2416. (list 'tmp)
  2417. #f
  2418. (list x)
  2419. '()
  2420. (gen-syntax-case (build-lexical-reference no-source 'tmp x) key m r mod))
  2421. (list (expand val r empty-wrap mod))))
  2422. (syntax-violation 'syntax-case "invalid literals list" e)))
  2423. tmp)
  2424. (syntax-violation #f "source expression failed to match any pattern" tmp-1)))))))
  2425. (global-extend 'local-syntax 'letrec-syntax #t)
  2426. (global-extend 'local-syntax 'let-syntax #f)
  2427. (global-extend 'core 'syntax-parameterize expand-syntax-parameterize)
  2428. (global-extend 'core 'quote expand-quote)
  2429. (global-extend 'core 'quote-syntax expand-quote-syntax)
  2430. (global-extend 'core 'syntax expand-syntax)
  2431. (global-extend 'core 'lambda expand-lambda)
  2432. (global-extend 'core 'lambda* expand-lambda*)
  2433. (global-extend 'core 'case-lambda expand-case-lambda)
  2434. (global-extend 'core 'case-lambda* expand-case-lambda*)
  2435. (global-extend 'core 'with-ellipsis expand-with-ellipsis)
  2436. (global-extend 'core 'let expand-let)
  2437. (global-extend 'core 'letrec expand-letrec)
  2438. (global-extend 'core 'letrec* expand-letrec*)
  2439. (global-extend 'core 'set! expand-set!)
  2440. (global-extend 'module-ref '@ expand-public-ref)
  2441. (global-extend 'module-ref '@@ expand-private-ref)
  2442. (global-extend 'core 'if expand-if)
  2443. (global-extend 'begin 'begin '())
  2444. (global-extend 'define 'define '())
  2445. (global-extend 'define-syntax 'define-syntax '())
  2446. (global-extend 'define-syntax-parameter 'define-syntax-parameter '())
  2447. (global-extend 'eval-when 'eval-when '())
  2448. (global-extend 'core 'syntax-case expand-syntax-case)
  2449. (set! macroexpand
  2450. (lambda* (x #:optional (m 'e) (esew '(eval)))
  2451. (letrec* ((unstrip
  2452. (lambda (x)
  2453. (letrec* ((annotate
  2454. (lambda (result)
  2455. (let ((props (source-properties x)))
  2456. (if (pair? props) (datum->syntax #f result #:source props) result)))))
  2457. (cond
  2458. ((pair? x) (annotate (cons (unstrip (car x)) (unstrip (cdr x)))))
  2459. ((vector? x)
  2460. (let ((v (make-vector (vector-length x))))
  2461. (annotate (list->vector (map unstrip (vector->list x))))))
  2462. ((syntax? x) x)
  2463. (else (annotate x)))))))
  2464. (expand-top-sequence
  2465. (list (unstrip x))
  2466. null-env
  2467. top-wrap
  2468. #f
  2469. m
  2470. esew
  2471. (cons 'hygiene (module-name (current-module)))))))
  2472. (set! identifier? (lambda (x) (nonsymbol-id? x)))
  2473. (set! datum->syntax
  2474. (lambda* (id datum #:key (source #f #:source))
  2475. (letrec* ((props->sourcev
  2476. (lambda (alist)
  2477. (and (pair? alist)
  2478. (vector (assq-ref alist 'filename) (assq-ref alist 'line) (assq-ref alist 'column))))))
  2479. (make-syntax
  2480. datum
  2481. (if id (syntax-wrap id) empty-wrap)
  2482. (and id (syntax-module id))
  2483. (cond
  2484. ((not source) (props->sourcev (source-properties datum)))
  2485. ((and (list? source) (and-map pair? source)) (props->sourcev source))
  2486. ((and (vector? source) (= 3 (vector-length source))) source)
  2487. (else (syntax-sourcev source)))))))
  2488. (set! syntax->datum (lambda (x) (strip x)))
  2489. (set! generate-temporaries
  2490. (lambda (ls)
  2491. (let ((x ls)) (if (not (list? x)) (syntax-violation 'generate-temporaries "invalid argument" x)))
  2492. (let ((mod (cons 'hygiene (module-name (current-module)))))
  2493. (map (lambda (x) (wrap (gen-var 't) top-wrap mod)) ls))))
  2494. (set! free-identifier=?
  2495. (lambda (x y)
  2496. (let ((x x)) (if (not (nonsymbol-id? x)) (syntax-violation 'free-identifier=? "invalid argument" x)))
  2497. (let ((x y)) (if (not (nonsymbol-id? x)) (syntax-violation 'free-identifier=? "invalid argument" x)))
  2498. (free-id=? x y)))
  2499. (set! bound-identifier=?
  2500. (lambda (x y)
  2501. (let ((x x)) (if (not (nonsymbol-id? x)) (syntax-violation 'bound-identifier=? "invalid argument" x)))
  2502. (let ((x y)) (if (not (nonsymbol-id? x)) (syntax-violation 'bound-identifier=? "invalid argument" x)))
  2503. (bound-id=? x y)))
  2504. (set! syntax-violation
  2505. (lambda* (who message form #:optional (subform #f))
  2506. (let ((x who))
  2507. (if (not (let ((x x)) (or (not x) (string? x) (symbol? x))))
  2508. (syntax-violation 'syntax-violation "invalid argument" x)))
  2509. (let ((x message)) (if (not (string? x)) (syntax-violation 'syntax-violation "invalid argument" x)))
  2510. (throw 'syntax-error
  2511. who
  2512. message
  2513. (sourcev->alist (or (source-annotation subform) (source-annotation form)))
  2514. (strip form)
  2515. (strip subform))))
  2516. (letrec* ((%syntax-module
  2517. (lambda (id)
  2518. (let ((x id)) (if (not (nonsymbol-id? x)) (syntax-violation 'syntax-module "invalid argument" x)))
  2519. (let ((mod (syntax-module id))) (and mod (not (equal? mod '(primitive))) (cdr mod)))))
  2520. (syntax-local-binding
  2521. (lambda* (id #:key (resolve-syntax-parameters? #t #:resolve-syntax-parameters?))
  2522. (let ((x id))
  2523. (if (not (nonsymbol-id? x)) (syntax-violation 'syntax-local-binding "invalid argument" x)))
  2524. (with-transformer-environment
  2525. (lambda (e r w s rib mod)
  2526. (letrec* ((strip-anti-mark
  2527. (lambda (w)
  2528. (let ((ms (wrap-marks w)) (s (wrap-subst w)))
  2529. (if (and (pair? ms) (eq? (car ms) the-anti-mark))
  2530. (make-wrap (cdr ms) (if rib (cons rib (cdr s)) (cdr s)))
  2531. (make-wrap ms (if rib (cons rib s) s)))))))
  2532. (call-with-values
  2533. (lambda ()
  2534. (resolve-identifier
  2535. (syntax-expression id)
  2536. (strip-anti-mark (syntax-wrap id))
  2537. r
  2538. (or (syntax-module id) mod)
  2539. resolve-syntax-parameters?))
  2540. (lambda (type value mod)
  2541. (let ((key type))
  2542. (cond
  2543. ((memv key '(lexical)) (values 'lexical value))
  2544. ((memv key '(macro)) (values 'macro value))
  2545. ((memv key '(syntax-parameter)) (values 'syntax-parameter value))
  2546. ((memv key '(syntax)) (values 'pattern-variable value))
  2547. ((memv key '(displaced-lexical)) (values 'displaced-lexical #f))
  2548. ((memv key '(global))
  2549. (if (equal? mod '(primitive))
  2550. (values 'primitive value)
  2551. (values 'global (cons value (cdr mod)))))
  2552. ((memv key '(ellipsis))
  2553. (values 'ellipsis (wrap-syntax value (anti-mark (syntax-wrap value)) mod)))
  2554. (else (values 'other #f)))))))))))
  2555. (syntax-locally-bound-identifiers
  2556. (lambda (id)
  2557. (let ((x id))
  2558. (if (not (nonsymbol-id? x))
  2559. (syntax-violation 'syntax-locally-bound-identifiers "invalid argument" x)))
  2560. (locally-bound-identifiers (syntax-wrap id) (syntax-module id)))))
  2561. (define! '%syntax-module %syntax-module)
  2562. (define! 'syntax-local-binding syntax-local-binding)
  2563. (define! 'syntax-locally-bound-identifiers syntax-locally-bound-identifiers))
  2564. (set! $sc-dispatch
  2565. (lambda (e p)
  2566. (letrec* ((match-each
  2567. (lambda (e p w mod)
  2568. (cond
  2569. ((pair? e)
  2570. (let ((first (match (car e) p w '() mod)))
  2571. (and first (let ((rest (match-each (cdr e) p w mod))) (and rest (cons first rest))))))
  2572. ((null? e) '())
  2573. ((syntax? e)
  2574. (match-each
  2575. (syntax-expression e)
  2576. p
  2577. (join-wraps w (syntax-wrap e))
  2578. (or (syntax-module e) mod)))
  2579. (else #f))))
  2580. (match-each+
  2581. (lambda (e x-pat y-pat z-pat w r mod)
  2582. (let f ((e e) (w w))
  2583. (cond
  2584. ((pair? e)
  2585. (call-with-values
  2586. (lambda () (f (cdr e) w))
  2587. (lambda (xr* y-pat r)
  2588. (if r
  2589. (if (null? y-pat)
  2590. (let ((xr (match (car e) x-pat w '() mod)))
  2591. (if xr (values (cons xr xr*) y-pat r) (values #f #f #f)))
  2592. (values '() (cdr y-pat) (match (car e) (car y-pat) w r mod)))
  2593. (values #f #f #f)))))
  2594. ((syntax? e) (f (syntax-expression e) (join-wraps w (syntax-wrap e))))
  2595. (else (values '() y-pat (match e z-pat w r mod)))))))
  2596. (match-each-any
  2597. (lambda (e w mod)
  2598. (cond
  2599. ((pair? e) (let ((l (match-each-any (cdr e) w mod))) (and l (cons (wrap (car e) w mod) l))))
  2600. ((null? e) '())
  2601. ((syntax? e) (match-each-any (syntax-expression e) (join-wraps w (syntax-wrap e)) mod))
  2602. (else #f))))
  2603. (match-empty
  2604. (lambda (p r)
  2605. (cond
  2606. ((null? p) r)
  2607. ((eq? p '_) r)
  2608. ((eq? p 'any) (cons '() r))
  2609. ((pair? p) (match-empty (car p) (match-empty (cdr p) r)))
  2610. ((eq? p 'each-any) (cons '() r))
  2611. (else (let ((key (vector-ref p 0)))
  2612. (cond
  2613. ((memv key '(each)) (match-empty (vector-ref p 1) r))
  2614. ((memv key '(each+))
  2615. (match-empty
  2616. (vector-ref p 1)
  2617. (match-empty (reverse (vector-ref p 2)) (match-empty (vector-ref p 3) r))))
  2618. ((memv key '(free-id atom)) r)
  2619. ((memv key '(vector)) (match-empty (vector-ref p 1) r))))))))
  2620. (combine (lambda (r* r) (if (null? (car r*)) r (cons (map car r*) (combine (map cdr r*) r)))))
  2621. (match*
  2622. (lambda (e p w r mod)
  2623. (cond
  2624. ((null? p) (and (null? e) r))
  2625. ((pair? p) (and (pair? e) (match (car e) (car p) w (match (cdr e) (cdr p) w r mod) mod)))
  2626. ((eq? p 'each-any) (let ((l (match-each-any e w mod))) (and l (cons l r))))
  2627. (else (let ((key (vector-ref p 0)))
  2628. (cond
  2629. ((memv key '(each))
  2630. (if (null? e)
  2631. (match-empty (vector-ref p 1) r)
  2632. (let ((l (match-each e (vector-ref p 1) w mod)))
  2633. (and l
  2634. (let collect ((l l))
  2635. (if (null? (car l)) r (cons (map car l) (collect (map cdr l)))))))))
  2636. ((memv key '(each+))
  2637. (call-with-values
  2638. (lambda ()
  2639. (match-each+ e (vector-ref p 1) (vector-ref p 2) (vector-ref p 3) w r mod))
  2640. (lambda (xr* y-pat r)
  2641. (and r
  2642. (null? y-pat)
  2643. (if (null? xr*) (match-empty (vector-ref p 1) r) (combine xr* r))))))
  2644. ((memv key '(free-id)) (and (id? e) (free-id=? (wrap e w mod) (vector-ref p 1)) r))
  2645. ((memv key '(atom)) (and (equal? (vector-ref p 1) (strip e)) r))
  2646. ((memv key '(vector))
  2647. (and (vector? e) (match (vector->list e) (vector-ref p 1) w r mod)))))))))
  2648. (match (lambda (e p w r mod)
  2649. (cond
  2650. ((not r) #f)
  2651. ((eq? p '_) r)
  2652. ((eq? p 'any) (cons (wrap e w mod) r))
  2653. ((syntax? e)
  2654. (match*
  2655. (syntax-expression e)
  2656. p
  2657. (join-wraps w (syntax-wrap e))
  2658. r
  2659. (or (syntax-module e) mod)))
  2660. (else (match* e p w r mod))))))
  2661. (cond
  2662. ((eq? p 'any) (list e))
  2663. ((eq? p '_) '())
  2664. ((syntax? e) (match* (syntax-expression e) p (syntax-wrap e) '() (syntax-module e)))
  2665. (else (match* e p empty-wrap '() #f))))))))
  2666. (define with-syntax
  2667. (let ((make-syntax make-syntax))
  2668. (make-syntax-transformer
  2669. 'with-syntax
  2670. 'macro
  2671. (lambda (x)
  2672. (let ((tmp x))
  2673. (let ((tmp-1 ($sc-dispatch tmp '(_ () any . each-any))))
  2674. (if tmp-1
  2675. (apply (lambda (e1 e2) (cons (make-syntax 'let '((top)) '(hygiene guile)) (cons '() (cons e1 e2))))
  2676. tmp-1)
  2677. (let ((tmp-1 ($sc-dispatch tmp '(_ ((any any)) any . each-any))))
  2678. (if tmp-1
  2679. (apply (lambda (out in e1 e2)
  2680. (list (make-syntax 'syntax-case '((top)) '(hygiene guile))
  2681. in
  2682. '()
  2683. (list out
  2684. (cons (make-syntax 'let '((top)) '(hygiene guile)) (cons '() (cons e1 e2))))))
  2685. tmp-1)
  2686. (let ((tmp-1 ($sc-dispatch tmp '(_ #(each (any any)) any . each-any))))
  2687. (if tmp-1
  2688. (apply (lambda (out in e1 e2)
  2689. (list (make-syntax 'syntax-case '((top)) '(hygiene guile))
  2690. (cons (make-syntax 'list '((top)) '(hygiene guile)) in)
  2691. '()
  2692. (list out
  2693. (cons (make-syntax 'let '((top)) '(hygiene guile))
  2694. (cons '() (cons e1 e2))))))
  2695. tmp-1)
  2696. (syntax-violation #f "source expression failed to match any pattern" tmp))))))))))))
  2697. (define syntax-error
  2698. (let ((make-syntax make-syntax))
  2699. (make-syntax-transformer
  2700. 'syntax-error
  2701. 'macro
  2702. (lambda (x)
  2703. (let ((tmp-1 x))
  2704. (let ((tmp ($sc-dispatch tmp-1 '(_ (any . any) any . each-any))))
  2705. (if (if tmp (apply (lambda (keyword operands message arg) (string? (syntax->datum message))) tmp) #f)
  2706. (apply (lambda (keyword operands message arg)
  2707. (syntax-violation
  2708. (syntax->datum keyword)
  2709. (string-join
  2710. (cons (syntax->datum message) (map (lambda (x) (object->string (syntax->datum x))) arg)))
  2711. (if (syntax->datum keyword) (cons keyword operands) #f)))
  2712. tmp)
  2713. (let ((tmp ($sc-dispatch tmp-1 '(_ any . each-any))))
  2714. (if (if tmp (apply (lambda (message arg) (string? (syntax->datum message))) tmp) #f)
  2715. (apply (lambda (message arg)
  2716. (cons (make-syntax
  2717. 'syntax-error
  2718. (list '(top)
  2719. (vector
  2720. 'ribcage
  2721. '#(syntax-error)
  2722. '#((top))
  2723. (vector
  2724. (cons '(hygiene guile)
  2725. (make-syntax 'syntax-error '((top)) '(hygiene guile))))))
  2726. '(hygiene guile))
  2727. (cons '(#f) (cons message arg))))
  2728. tmp)
  2729. (syntax-violation #f "source expression failed to match any pattern" tmp-1))))))))))
  2730. (define syntax-rules
  2731. (let ((make-syntax make-syntax))
  2732. (make-syntax-transformer
  2733. 'syntax-rules
  2734. 'macro
  2735. (lambda (xx)
  2736. (letrec* ((expand-clause
  2737. (lambda (clause)
  2738. (let ((tmp-1 clause))
  2739. (let ((tmp ($sc-dispatch
  2740. tmp-1
  2741. (list '(any . any)
  2742. (cons (vector 'free-id (make-syntax 'syntax-error '((top)) '(hygiene guile)))
  2743. '(any . each-any))))))
  2744. (if (if tmp
  2745. (apply (lambda (keyword pattern message arg) (string? (syntax->datum message))) tmp)
  2746. #f)
  2747. (apply (lambda (keyword pattern message arg)
  2748. (list (cons (make-syntax 'dummy '((top)) '(hygiene guile)) pattern)
  2749. (list (make-syntax 'syntax '((top)) '(hygiene guile))
  2750. (cons (make-syntax 'syntax-error '((top)) '(hygiene guile))
  2751. (cons (cons (make-syntax 'dummy '((top)) '(hygiene guile))
  2752. pattern)
  2753. (cons message arg))))))
  2754. tmp)
  2755. (let ((tmp ($sc-dispatch tmp-1 '((any . any) any))))
  2756. (if tmp
  2757. (apply (lambda (keyword pattern template)
  2758. (list (cons (make-syntax 'dummy '((top)) '(hygiene guile)) pattern)
  2759. (list (make-syntax 'syntax '((top)) '(hygiene guile)) template)))
  2760. tmp)
  2761. (syntax-violation #f "source expression failed to match any pattern" tmp-1))))))))
  2762. (expand-syntax-rules
  2763. (lambda (dots keys docstrings clauses)
  2764. (let ((tmp-1 (list keys docstrings clauses (map expand-clause clauses))))
  2765. (let ((tmp ($sc-dispatch tmp-1 '(each-any each-any #(each ((any . any) any)) each-any))))
  2766. (if tmp
  2767. (apply (lambda (k docstring keyword pattern template clause)
  2768. (let ((tmp (cons (make-syntax 'lambda '((top)) '(hygiene guile))
  2769. (cons (list (make-syntax 'x '((top)) '(hygiene guile)))
  2770. (append
  2771. docstring
  2772. (list (vector
  2773. (cons (make-syntax
  2774. 'macro-type
  2775. '((top))
  2776. '(hygiene guile))
  2777. (make-syntax
  2778. 'syntax-rules
  2779. (list '(top)
  2780. (vector
  2781. 'ribcage
  2782. '#(syntax-rules)
  2783. '#((top))
  2784. (vector
  2785. (cons '(hygiene guile)
  2786. (make-syntax
  2787. 'syntax-rules
  2788. '((top))
  2789. '(hygiene guile))))))
  2790. '(hygiene guile)))
  2791. (cons (make-syntax
  2792. 'patterns
  2793. '((top))
  2794. '(hygiene guile))
  2795. pattern))
  2796. (cons (make-syntax
  2797. 'syntax-case
  2798. '((top))
  2799. '(hygiene guile))
  2800. (cons (make-syntax
  2801. 'x
  2802. '((top))
  2803. '(hygiene guile))
  2804. (cons k clause)))))))))
  2805. (let ((form tmp))
  2806. (if dots
  2807. (let ((tmp dots))
  2808. (let ((dots tmp))
  2809. (list (make-syntax 'with-ellipsis '((top)) '(hygiene guile)) dots form)))
  2810. form))))
  2811. tmp)
  2812. (syntax-violation #f "source expression failed to match any pattern" tmp-1)))))))
  2813. (let ((tmp xx))
  2814. (let ((tmp-1 ($sc-dispatch tmp '(_ each-any . #(each ((any . any) any))))))
  2815. (if tmp-1
  2816. (apply (lambda (k keyword pattern template)
  2817. (expand-syntax-rules
  2818. #f
  2819. k
  2820. '()
  2821. (map (lambda (tmp-680b775fb37a463-145d tmp-680b775fb37a463-145c tmp-680b775fb37a463-145b)
  2822. (list (cons tmp-680b775fb37a463-145b tmp-680b775fb37a463-145c)
  2823. tmp-680b775fb37a463-145d))
  2824. template
  2825. pattern
  2826. keyword)))
  2827. tmp-1)
  2828. (let ((tmp-1 ($sc-dispatch tmp '(_ each-any any . #(each ((any . any) any))))))
  2829. (if (if tmp-1
  2830. (apply (lambda (k docstring keyword pattern template) (string? (syntax->datum docstring)))
  2831. tmp-1)
  2832. #f)
  2833. (apply (lambda (k docstring keyword pattern template)
  2834. (expand-syntax-rules
  2835. #f
  2836. k
  2837. (list docstring)
  2838. (map (lambda (tmp-680b775fb37a463-2 tmp-680b775fb37a463-1 tmp-680b775fb37a463)
  2839. (list (cons tmp-680b775fb37a463 tmp-680b775fb37a463-1) tmp-680b775fb37a463-2))
  2840. template
  2841. pattern
  2842. keyword)))
  2843. tmp-1)
  2844. (let ((tmp-1 ($sc-dispatch tmp '(_ any each-any . #(each ((any . any) any))))))
  2845. (if (if tmp-1 (apply (lambda (dots k keyword pattern template) (identifier? dots)) tmp-1) #f)
  2846. (apply (lambda (dots k keyword pattern template)
  2847. (expand-syntax-rules
  2848. dots
  2849. k
  2850. '()
  2851. (map (lambda (tmp-680b775fb37a463-148f
  2852. tmp-680b775fb37a463-148e
  2853. tmp-680b775fb37a463-148d)
  2854. (list (cons tmp-680b775fb37a463-148d tmp-680b775fb37a463-148e)
  2855. tmp-680b775fb37a463-148f))
  2856. template
  2857. pattern
  2858. keyword)))
  2859. tmp-1)
  2860. (let ((tmp-1 ($sc-dispatch tmp '(_ any each-any any . #(each ((any . any) any))))))
  2861. (if (if tmp-1
  2862. (apply (lambda (dots k docstring keyword pattern template)
  2863. (if (identifier? dots) (string? (syntax->datum docstring)) #f))
  2864. tmp-1)
  2865. #f)
  2866. (apply (lambda (dots k docstring keyword pattern template)
  2867. (expand-syntax-rules
  2868. dots
  2869. k
  2870. (list docstring)
  2871. (map (lambda (tmp-680b775fb37a463-14ae
  2872. tmp-680b775fb37a463-14ad
  2873. tmp-680b775fb37a463-14ac)
  2874. (list (cons tmp-680b775fb37a463-14ac tmp-680b775fb37a463-14ad)
  2875. tmp-680b775fb37a463-14ae))
  2876. template
  2877. pattern
  2878. keyword)))
  2879. tmp-1)
  2880. (syntax-violation #f "source expression failed to match any pattern" tmp)))))))))))))))
  2881. (define define-syntax-rule
  2882. (let ((make-syntax make-syntax))
  2883. (make-syntax-transformer
  2884. 'define-syntax-rule
  2885. 'macro
  2886. (lambda (x)
  2887. (let ((tmp-1 x))
  2888. (let ((tmp ($sc-dispatch tmp-1 '(_ (any . any) any))))
  2889. (if tmp
  2890. (apply (lambda (name pattern template)
  2891. (list (make-syntax 'define-syntax '((top)) '(hygiene guile))
  2892. name
  2893. (list (make-syntax 'syntax-rules '((top)) '(hygiene guile))
  2894. '()
  2895. (list (cons (make-syntax '_ '((top)) '(hygiene guile)) pattern) template))))
  2896. tmp)
  2897. (let ((tmp ($sc-dispatch tmp-1 '(_ (any . any) any any))))
  2898. (if (if tmp
  2899. (apply (lambda (name pattern docstring template) (string? (syntax->datum docstring))) tmp)
  2900. #f)
  2901. (apply (lambda (name pattern docstring template)
  2902. (list (make-syntax 'define-syntax '((top)) '(hygiene guile))
  2903. name
  2904. (list (make-syntax 'syntax-rules '((top)) '(hygiene guile))
  2905. '()
  2906. docstring
  2907. (list (cons (make-syntax '_ '((top)) '(hygiene guile)) pattern) template))))
  2908. tmp)
  2909. (syntax-violation #f "source expression failed to match any pattern" tmp-1))))))))))
  2910. (define let*
  2911. (let ((make-syntax make-syntax))
  2912. (make-syntax-transformer
  2913. 'let*
  2914. 'macro
  2915. (lambda (x)
  2916. (let ((tmp-1 x))
  2917. (let ((tmp ($sc-dispatch tmp-1 '(any #(each (any any)) any . each-any))))
  2918. (if (if tmp (apply (lambda (let* x v e1 e2) (and-map identifier? x)) tmp) #f)
  2919. (apply (lambda (let* x v e1 e2)
  2920. (let f ((bindings (map list x v)))
  2921. (if (null? bindings)
  2922. (cons (make-syntax 'let '((top)) '(hygiene guile)) (cons '() (cons e1 e2)))
  2923. (let ((tmp-1 (list (f (cdr bindings)) (car bindings))))
  2924. (let ((tmp ($sc-dispatch tmp-1 '(any any))))
  2925. (if tmp
  2926. (apply (lambda (body binding)
  2927. (list (make-syntax 'let '((top)) '(hygiene guile)) (list binding) body))
  2928. tmp)
  2929. (syntax-violation #f "source expression failed to match any pattern" tmp-1)))))))
  2930. tmp)
  2931. (syntax-violation #f "source expression failed to match any pattern" tmp-1))))))))
  2932. (define quasiquote
  2933. (let ((make-syntax make-syntax))
  2934. (make-syntax-transformer
  2935. 'quasiquote
  2936. 'macro
  2937. (letrec* ((quasi (lambda (p lev)
  2938. (let ((tmp p))
  2939. (let ((tmp-1 ($sc-dispatch
  2940. tmp
  2941. (list (vector 'free-id (make-syntax 'unquote '((top)) '(hygiene guile))) 'any))))
  2942. (if tmp-1
  2943. (apply (lambda (p)
  2944. (if (= lev 0)
  2945. (list "value" p)
  2946. (quasicons
  2947. (list "quote" (make-syntax 'unquote '((top)) '(hygiene guile)))
  2948. (quasi (list p) (- lev 1)))))
  2949. tmp-1)
  2950. (let ((tmp-1 ($sc-dispatch
  2951. tmp
  2952. (list (vector
  2953. 'free-id
  2954. (make-syntax
  2955. 'quasiquote
  2956. (list '(top)
  2957. (vector
  2958. 'ribcage
  2959. '#(quasiquote)
  2960. '#((top))
  2961. (vector
  2962. (cons '(hygiene guile)
  2963. (make-syntax 'quasiquote '((top)) '(hygiene guile))))))
  2964. '(hygiene guile)))
  2965. 'any))))
  2966. (if tmp-1
  2967. (apply (lambda (p)
  2968. (quasicons
  2969. (list "quote"
  2970. (make-syntax
  2971. 'quasiquote
  2972. (list '(top)
  2973. (vector
  2974. 'ribcage
  2975. '#(quasiquote)
  2976. '#((top))
  2977. (vector
  2978. (cons '(hygiene guile)
  2979. (make-syntax 'quasiquote '((top)) '(hygiene guile))))))
  2980. '(hygiene guile)))
  2981. (quasi (list p) (+ lev 1))))
  2982. tmp-1)
  2983. (let ((tmp-1 ($sc-dispatch tmp '(any . any))))
  2984. (if tmp-1
  2985. (apply (lambda (p q)
  2986. (let ((tmp-1 p))
  2987. (let ((tmp ($sc-dispatch
  2988. tmp-1
  2989. (cons (vector
  2990. 'free-id
  2991. (make-syntax
  2992. 'unquote
  2993. '((top))
  2994. '(hygiene guile)))
  2995. 'each-any))))
  2996. (if tmp
  2997. (apply (lambda (p)
  2998. (if (= lev 0)
  2999. (quasilist*
  3000. (map (lambda (tmp-680b775fb37a463-155b)
  3001. (list "value"
  3002. tmp-680b775fb37a463-155b))
  3003. p)
  3004. (quasi q lev))
  3005. (quasicons
  3006. (quasicons
  3007. (list "quote"
  3008. (make-syntax
  3009. 'unquote
  3010. '((top))
  3011. '(hygiene guile)))
  3012. (quasi p (- lev 1)))
  3013. (quasi q lev))))
  3014. tmp)
  3015. (let ((tmp ($sc-dispatch
  3016. tmp-1
  3017. (cons (vector
  3018. 'free-id
  3019. (make-syntax
  3020. 'unquote-splicing
  3021. '((top))
  3022. '(hygiene guile)))
  3023. 'each-any))))
  3024. (if tmp
  3025. (apply (lambda (p)
  3026. (if (= lev 0)
  3027. (quasiappend
  3028. (map (lambda (tmp-680b775fb37a463)
  3029. (list "value"
  3030. tmp-680b775fb37a463))
  3031. p)
  3032. (quasi q lev))
  3033. (quasicons
  3034. (quasicons
  3035. (list "quote"
  3036. (make-syntax
  3037. 'unquote-splicing
  3038. '((top))
  3039. '(hygiene guile)))
  3040. (quasi p (- lev 1)))
  3041. (quasi q lev))))
  3042. tmp)
  3043. (quasicons (quasi p lev) (quasi q lev))))))))
  3044. tmp-1)
  3045. (let ((tmp-1 ($sc-dispatch tmp '#(vector each-any))))
  3046. (if tmp-1
  3047. (apply (lambda (x) (quasivector (vquasi x lev))) tmp-1)
  3048. (let ((p tmp)) (list "quote" p)))))))))))))
  3049. (vquasi
  3050. (lambda (p lev)
  3051. (let ((tmp p))
  3052. (let ((tmp-1 ($sc-dispatch tmp '(any . any))))
  3053. (if tmp-1
  3054. (apply (lambda (p q)
  3055. (let ((tmp-1 p))
  3056. (let ((tmp ($sc-dispatch
  3057. tmp-1
  3058. (cons (vector
  3059. 'free-id
  3060. (make-syntax 'unquote '((top)) '(hygiene guile)))
  3061. 'each-any))))
  3062. (if tmp
  3063. (apply (lambda (p)
  3064. (if (= lev 0)
  3065. (quasilist*
  3066. (map (lambda (tmp-680b775fb37a463)
  3067. (list "value" tmp-680b775fb37a463))
  3068. p)
  3069. (vquasi q lev))
  3070. (quasicons
  3071. (quasicons
  3072. (list "quote"
  3073. (make-syntax 'unquote '((top)) '(hygiene guile)))
  3074. (quasi p (- lev 1)))
  3075. (vquasi q lev))))
  3076. tmp)
  3077. (let ((tmp ($sc-dispatch
  3078. tmp-1
  3079. (cons (vector
  3080. 'free-id
  3081. (make-syntax 'unquote-splicing '((top)) '(hygiene guile)))
  3082. 'each-any))))
  3083. (if tmp
  3084. (apply (lambda (p)
  3085. (if (= lev 0)
  3086. (quasiappend
  3087. (map (lambda (tmp-680b775fb37a463-157b)
  3088. (list "value" tmp-680b775fb37a463-157b))
  3089. p)
  3090. (vquasi q lev))
  3091. (quasicons
  3092. (quasicons
  3093. (list "quote"
  3094. (make-syntax
  3095. 'unquote-splicing
  3096. '((top))
  3097. '(hygiene guile)))
  3098. (quasi p (- lev 1)))
  3099. (vquasi q lev))))
  3100. tmp)
  3101. (quasicons (quasi p lev) (vquasi q lev))))))))
  3102. tmp-1)
  3103. (let ((tmp-1 ($sc-dispatch tmp '())))
  3104. (if tmp-1
  3105. (apply (lambda () '("quote" ())) tmp-1)
  3106. (syntax-violation #f "source expression failed to match any pattern" tmp))))))))
  3107. (quasicons
  3108. (lambda (x y)
  3109. (let ((tmp-1 (list x y)))
  3110. (let ((tmp ($sc-dispatch tmp-1 '(any any))))
  3111. (if tmp
  3112. (apply (lambda (x y)
  3113. (let ((tmp y))
  3114. (let ((tmp-1 ($sc-dispatch tmp '(#(atom "quote") any))))
  3115. (if tmp-1
  3116. (apply (lambda (dy)
  3117. (let ((tmp x))
  3118. (let ((tmp ($sc-dispatch tmp '(#(atom "quote") any))))
  3119. (if tmp
  3120. (apply (lambda (dx) (list "quote" (cons dx dy))) tmp)
  3121. (if (null? dy) (list "list" x) (list "list*" x y))))))
  3122. tmp-1)
  3123. (let ((tmp-1 ($sc-dispatch tmp '(#(atom "list") . any))))
  3124. (if tmp-1
  3125. (apply (lambda (stuff) (cons "list" (cons x stuff))) tmp-1)
  3126. (let ((tmp ($sc-dispatch tmp '(#(atom "list*") . any))))
  3127. (if tmp
  3128. (apply (lambda (stuff) (cons "list*" (cons x stuff))) tmp)
  3129. (list "list*" x y)))))))))
  3130. tmp)
  3131. (syntax-violation #f "source expression failed to match any pattern" tmp-1))))))
  3132. (quasiappend
  3133. (lambda (x y)
  3134. (let ((tmp y))
  3135. (let ((tmp ($sc-dispatch tmp '(#(atom "quote") ()))))
  3136. (if tmp
  3137. (apply (lambda ()
  3138. (if (null? x)
  3139. '("quote" ())
  3140. (if (null? (cdr x))
  3141. (car x)
  3142. (let ((tmp-1 x))
  3143. (let ((tmp ($sc-dispatch tmp-1 'each-any)))
  3144. (if tmp
  3145. (apply (lambda (p) (cons "append" p)) tmp)
  3146. (syntax-violation
  3147. #f
  3148. "source expression failed to match any pattern"
  3149. tmp-1)))))))
  3150. tmp)
  3151. (if (null? x)
  3152. y
  3153. (let ((tmp-1 (list x y)))
  3154. (let ((tmp ($sc-dispatch tmp-1 '(each-any any))))
  3155. (if tmp
  3156. (apply (lambda (p y) (cons "append" (append p (list y)))) tmp)
  3157. (syntax-violation #f "source expression failed to match any pattern" tmp-1))))))))))
  3158. (quasilist* (lambda (x y) (let f ((x x)) (if (null? x) y (quasicons (car x) (f (cdr x)))))))
  3159. (quasivector
  3160. (lambda (x)
  3161. (let ((tmp x))
  3162. (let ((tmp ($sc-dispatch tmp '(#(atom "quote") each-any))))
  3163. (if tmp
  3164. (apply (lambda (x) (list "quote" (list->vector x))) tmp)
  3165. (let f ((y x)
  3166. (k (lambda (ls)
  3167. (let ((tmp-1 ls))
  3168. (let ((tmp ($sc-dispatch tmp-1 'each-any)))
  3169. (if tmp
  3170. (apply (lambda (t-680b775fb37a463-15c4)
  3171. (cons "vector" t-680b775fb37a463-15c4))
  3172. tmp)
  3173. (syntax-violation
  3174. #f
  3175. "source expression failed to match any pattern"
  3176. tmp-1)))))))
  3177. (let ((tmp y))
  3178. (let ((tmp-1 ($sc-dispatch tmp '(#(atom "quote") each-any))))
  3179. (if tmp-1
  3180. (apply (lambda (y)
  3181. (k (map (lambda (tmp-680b775fb37a463-15d0)
  3182. (list "quote" tmp-680b775fb37a463-15d0))
  3183. y)))
  3184. tmp-1)
  3185. (let ((tmp-1 ($sc-dispatch tmp '(#(atom "list") . each-any))))
  3186. (if tmp-1
  3187. (apply (lambda (y) (k y)) tmp-1)
  3188. (let ((tmp-1 ($sc-dispatch tmp '(#(atom "list*") . #(each+ any (any) ())))))
  3189. (if tmp-1
  3190. (apply (lambda (y z) (f z (lambda (ls) (k (append y ls))))) tmp-1)
  3191. (let ((else tmp))
  3192. (let ((tmp x))
  3193. (let ((t-680b775fb37a463-15df tmp))
  3194. (list "list->vector" t-680b775fb37a463-15df)))))))))))))))))
  3195. (emit (lambda (x)
  3196. (let ((tmp x))
  3197. (let ((tmp-1 ($sc-dispatch tmp '(#(atom "quote") any))))
  3198. (if tmp-1
  3199. (apply (lambda (x) (list (make-syntax 'quote '((top)) '(hygiene guile)) x)) tmp-1)
  3200. (let ((tmp-1 ($sc-dispatch tmp '(#(atom "list") . each-any))))
  3201. (if tmp-1
  3202. (apply (lambda (x)
  3203. (let ((tmp-1 (map emit x)))
  3204. (let ((tmp ($sc-dispatch tmp-1 'each-any)))
  3205. (if tmp
  3206. (apply (lambda (t-680b775fb37a463-15ee)
  3207. (cons (make-syntax 'list '((top)) '(hygiene guile))
  3208. t-680b775fb37a463-15ee))
  3209. tmp)
  3210. (syntax-violation
  3211. #f
  3212. "source expression failed to match any pattern"
  3213. tmp-1)))))
  3214. tmp-1)
  3215. (let ((tmp-1 ($sc-dispatch tmp '(#(atom "list*") . #(each+ any (any) ())))))
  3216. (if tmp-1
  3217. (apply (lambda (x y)
  3218. (let f ((x* x))
  3219. (if (null? x*)
  3220. (emit y)
  3221. (let ((tmp-1 (list (emit (car x*)) (f (cdr x*)))))
  3222. (let ((tmp ($sc-dispatch tmp-1 '(any any))))
  3223. (if tmp
  3224. (apply (lambda (t-680b775fb37a463-1 t-680b775fb37a463)
  3225. (list (make-syntax
  3226. 'cons
  3227. '((top))
  3228. '(hygiene guile))
  3229. t-680b775fb37a463-1
  3230. t-680b775fb37a463))
  3231. tmp)
  3232. (syntax-violation
  3233. #f
  3234. "source expression failed to match any pattern"
  3235. tmp-1)))))))
  3236. tmp-1)
  3237. (let ((tmp-1 ($sc-dispatch tmp '(#(atom "append") . each-any))))
  3238. (if tmp-1
  3239. (apply (lambda (x)
  3240. (let ((tmp-1 (map emit x)))
  3241. (let ((tmp ($sc-dispatch tmp-1 'each-any)))
  3242. (if tmp
  3243. (apply (lambda (t-680b775fb37a463-160e)
  3244. (cons (make-syntax
  3245. 'append
  3246. '((top))
  3247. '(hygiene guile))
  3248. t-680b775fb37a463-160e))
  3249. tmp)
  3250. (syntax-violation
  3251. #f
  3252. "source expression failed to match any pattern"
  3253. tmp-1)))))
  3254. tmp-1)
  3255. (let ((tmp-1 ($sc-dispatch tmp '(#(atom "vector") . each-any))))
  3256. (if tmp-1
  3257. (apply (lambda (x)
  3258. (let ((tmp-1 (map emit x)))
  3259. (let ((tmp ($sc-dispatch tmp-1 'each-any)))
  3260. (if tmp
  3261. (apply (lambda (t-680b775fb37a463-161a)
  3262. (cons (make-syntax
  3263. 'vector
  3264. '((top))
  3265. '(hygiene guile))
  3266. t-680b775fb37a463-161a))
  3267. tmp)
  3268. (syntax-violation
  3269. #f
  3270. "source expression failed to match any pattern"
  3271. tmp-1)))))
  3272. tmp-1)
  3273. (let ((tmp-1 ($sc-dispatch tmp '(#(atom "list->vector") any))))
  3274. (if tmp-1
  3275. (apply (lambda (x)
  3276. (let ((tmp (emit x)))
  3277. (let ((t-680b775fb37a463 tmp))
  3278. (list (make-syntax
  3279. 'list->vector
  3280. '((top))
  3281. '(hygiene guile))
  3282. t-680b775fb37a463))))
  3283. tmp-1)
  3284. (let ((tmp-1 ($sc-dispatch tmp '(#(atom "value") any))))
  3285. (if tmp-1
  3286. (apply (lambda (x) x) tmp-1)
  3287. (syntax-violation
  3288. #f
  3289. "source expression failed to match any pattern"
  3290. tmp)))))))))))))))))))
  3291. (lambda (x)
  3292. (let ((tmp-1 x))
  3293. (let ((tmp ($sc-dispatch tmp-1 '(_ any))))
  3294. (if tmp
  3295. (apply (lambda (e) (emit (quasi e 0))) tmp)
  3296. (syntax-violation #f "source expression failed to match any pattern" tmp-1)))))))))
  3297. (define call-with-include-port
  3298. (let ((syntax-dirname
  3299. (lambda (stx)
  3300. (letrec* ((src (syntax-source stx)) (filename (if src (assq-ref src 'filename) #f)))
  3301. (if (string? filename) (dirname filename) #f)))))
  3302. (lambda* (filename proc #:key (dirname (syntax-dirname filename) #:dirname))
  3303. "Like @code{call-with-input-file}, except relative paths are\nsearched relative to the @var{dirname} instead of the current working\ndirectory. Also, @var{filename} can be a syntax object; in that case,\nand if @var{dirname} is not specified, the @code{syntax-source} of\n@var{filename} is used to obtain a base directory for relative file\nnames."
  3304. (let ((filename (syntax->datum filename)))
  3305. (let ((p (open-input-file
  3306. (if (absolute-file-name? filename)
  3307. filename
  3308. (if dirname
  3309. (in-vicinity dirname filename)
  3310. (error "attempt to include relative file name but could not determine base dir"))))))
  3311. (let ((enc (file-encoding p)))
  3312. (set-port-encoding! p (let ((t enc)) (if t t "UTF-8")))
  3313. (call-with-values (lambda () (proc p)) (lambda results (close-port p) (apply values results)))))))))
  3314. (define include
  3315. (let ((make-syntax make-syntax))
  3316. (make-syntax-transformer
  3317. 'include
  3318. 'macro
  3319. (lambda (stx)
  3320. (let ((tmp-1 stx))
  3321. (let ((tmp ($sc-dispatch tmp-1 '(_ any))))
  3322. (if tmp
  3323. (apply (lambda (filename)
  3324. (call-with-include-port
  3325. filename
  3326. (lambda (p)
  3327. (cons (make-syntax 'begin '((top)) '(hygiene guile))
  3328. (let lp ()
  3329. (let ((x (read-syntax p)))
  3330. (if (eof-object? x) '() (cons (datum->syntax filename x) (lp)))))))))
  3331. tmp)
  3332. (syntax-violation #f "source expression failed to match any pattern" tmp-1))))))))
  3333. (define include-from-path
  3334. (let ((make-syntax make-syntax))
  3335. (make-syntax-transformer
  3336. 'include-from-path
  3337. 'macro
  3338. (lambda (x)
  3339. (let ((tmp-1 x))
  3340. (let ((tmp ($sc-dispatch tmp-1 '(any any))))
  3341. (if tmp
  3342. (apply (lambda (k filename)
  3343. (let ((fn (syntax->datum filename)))
  3344. (let ((tmp (datum->syntax
  3345. filename
  3346. (canonicalize-path
  3347. (let ((t (%search-load-path fn)))
  3348. (if t
  3349. t
  3350. (syntax-violation 'include-from-path "file not found in path" x filename)))))))
  3351. (let ((fn tmp)) (list (make-syntax 'include '((top)) '(hygiene guile)) fn)))))
  3352. tmp)
  3353. (syntax-violation #f "source expression failed to match any pattern" tmp-1))))))))
  3354. (define unquote
  3355. (make-syntax-transformer
  3356. 'unquote
  3357. 'macro
  3358. (lambda (x) (syntax-violation 'unquote "expression not valid outside of quasiquote" x))))
  3359. (define unquote-splicing
  3360. (make-syntax-transformer
  3361. 'unquote-splicing
  3362. 'macro
  3363. (lambda (x) (syntax-violation 'unquote-splicing "expression not valid outside of quasiquote" x))))
  3364. (define make-variable-transformer
  3365. (lambda (proc)
  3366. (if (procedure? proc)
  3367. (let ((trans (lambda (x) (proc x)))) (set-procedure-property! trans 'variable-transformer #t) trans)
  3368. (error "variable transformer not a procedure" proc))))
  3369. (define identifier-syntax
  3370. (let ((make-syntax make-syntax))
  3371. (make-syntax-transformer
  3372. 'identifier-syntax
  3373. 'macro
  3374. (lambda (xx)
  3375. (let ((tmp-1 xx))
  3376. (let ((tmp ($sc-dispatch tmp-1 '(_ any))))
  3377. (if tmp
  3378. (apply (lambda (e)
  3379. (list (make-syntax 'lambda '((top)) '(hygiene guile))
  3380. (list (make-syntax 'x '((top)) '(hygiene guile)))
  3381. (vector
  3382. (cons (make-syntax 'macro-type '((top)) '(hygiene guile))
  3383. (make-syntax
  3384. 'identifier-syntax
  3385. (list '(top)
  3386. (vector
  3387. 'ribcage
  3388. '#(identifier-syntax)
  3389. '#((top))
  3390. (vector
  3391. (cons '(hygiene guile)
  3392. (make-syntax 'identifier-syntax '((top)) '(hygiene guile))))))
  3393. '(hygiene guile))))
  3394. (list (make-syntax 'syntax-case '((top)) '(hygiene guile))
  3395. (make-syntax 'x '((top)) '(hygiene guile))
  3396. '()
  3397. (list (make-syntax 'id '((top)) '(hygiene guile))
  3398. (list (make-syntax 'identifier? '((top)) '(hygiene guile))
  3399. (list (make-syntax 'syntax '((top)) '(hygiene guile))
  3400. (make-syntax 'id '((top)) '(hygiene guile))))
  3401. (list (make-syntax 'syntax '((top)) '(hygiene guile)) e))
  3402. (list (list (make-syntax '_ '((top)) '(hygiene guile))
  3403. (make-syntax 'x '((top)) '(hygiene guile))
  3404. (make-syntax '... '((top)) '(hygiene guile)))
  3405. (list (make-syntax 'syntax '((top)) '(hygiene guile))
  3406. (cons e
  3407. (list (make-syntax 'x '((top)) '(hygiene guile))
  3408. (make-syntax '... '((top)) '(hygiene guile)))))))))
  3409. tmp)
  3410. (let ((tmp ($sc-dispatch
  3411. tmp-1
  3412. (list '_
  3413. '(any any)
  3414. (list (list (vector 'free-id (make-syntax 'set! '((top)) '(hygiene guile))) 'any 'any)
  3415. 'any)))))
  3416. (if (if tmp (apply (lambda (id exp1 var val exp2) (if (identifier? id) (identifier? var) #f)) tmp) #f)
  3417. (apply (lambda (id exp1 var val exp2)
  3418. (list (make-syntax 'make-variable-transformer '((top)) '(hygiene guile))
  3419. (list (make-syntax 'lambda '((top)) '(hygiene guile))
  3420. (list (make-syntax 'x '((top)) '(hygiene guile)))
  3421. (vector
  3422. (cons (make-syntax 'macro-type '((top)) '(hygiene guile))
  3423. (make-syntax 'variable-transformer '((top)) '(hygiene guile))))
  3424. (list (make-syntax 'syntax-case '((top)) '(hygiene guile))
  3425. (make-syntax 'x '((top)) '(hygiene guile))
  3426. (list (make-syntax 'set! '((top)) '(hygiene guile)))
  3427. (list (list (make-syntax 'set! '((top)) '(hygiene guile)) var val)
  3428. (list (make-syntax 'syntax '((top)) '(hygiene guile)) exp2))
  3429. (list (cons id
  3430. (list (make-syntax 'x '((top)) '(hygiene guile))
  3431. (make-syntax '... '((top)) '(hygiene guile))))
  3432. (list (make-syntax 'syntax '((top)) '(hygiene guile))
  3433. (cons exp1
  3434. (list (make-syntax 'x '((top)) '(hygiene guile))
  3435. (make-syntax '... '((top)) '(hygiene guile))))))
  3436. (list id
  3437. (list (make-syntax 'identifier? '((top)) '(hygiene guile))
  3438. (list (make-syntax 'syntax '((top)) '(hygiene guile)) id))
  3439. (list (make-syntax 'syntax '((top)) '(hygiene guile)) exp1))))))
  3440. tmp)
  3441. (syntax-violation #f "source expression failed to match any pattern" tmp-1))))))))))
  3442. (define define*
  3443. (let ((make-syntax make-syntax))
  3444. (make-syntax-transformer
  3445. 'define*
  3446. 'macro
  3447. (lambda (x)
  3448. (let ((tmp-1 x))
  3449. (let ((tmp ($sc-dispatch tmp-1 '(_ (any . any) any . each-any))))
  3450. (if tmp
  3451. (apply (lambda (id args b0 b1)
  3452. (list (make-syntax 'define '((top)) '(hygiene guile))
  3453. id
  3454. (cons (make-syntax 'lambda* '((top)) '(hygiene guile)) (cons args (cons b0 b1)))))
  3455. tmp)
  3456. (let ((tmp ($sc-dispatch tmp-1 '(_ any any))))
  3457. (if (if tmp (apply (lambda (id val) (identifier? id)) tmp) #f)
  3458. (apply (lambda (id val) (list (make-syntax 'define '((top)) '(hygiene guile)) id val)) tmp)
  3459. (syntax-violation #f "source expression failed to match any pattern" tmp-1))))))))))