psyntax-pp.scm 157 KB

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