psyntax-pp.scm 184 KB

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