/compiler/syntax2.rkt

http://github.com/masm/sines · Racket · 525 lines · 487 code · 38 blank · 0 comment · 1 complexity · 9ee8e182f19bb443214f45360a2cfde7 MD5 · raw file

  1. #lang scheme/base
  2. (require scheme/base
  3. (for-syntax scheme/base)
  4. scheme/match
  5. "syntax.rkt")
  6. (define-match-expander literal
  7. (syntax-rules ()
  8. [(_ value loc)
  9. (struct literal-stx [loc value])]
  10. [(_ value)
  11. (struct literal-stx [_ value])]
  12. [(_)
  13. (struct literal-stx _)])
  14. (syntax-rules ()
  15. [(_ value loc)
  16. (make-literal-stx loc value)]
  17. [(_ value)
  18. (make-literal-stx #f value)]))
  19. (define-match-expander lexical-ref
  20. (syntax-rules ()
  21. [(_ id loc)
  22. (struct lexical-ref-stx [loc id])]
  23. [(_ id)
  24. (struct lexical-ref-stx [_ id])]
  25. [(_)
  26. (struct lexical-ref-stx _)])
  27. (syntax-rules ()
  28. [(_ id loc)
  29. (make-lexical-ref-stx loc id)]
  30. [(_ id)
  31. (make-lexical-ref-stx #f id)]))
  32. (define-match-expander global-ref
  33. (syntax-rules ()
  34. [(_ id loc)
  35. (struct global-ref-stx [loc id])]
  36. [(_ id)
  37. (struct global-ref-stx [_ id])]
  38. [(_)
  39. (struct global-ref-stx _)])
  40. (syntax-rules ()
  41. [(_ id loc)
  42. (make-global-ref-stx loc id)]
  43. [(_ id)
  44. (make-global-ref-stx #f id)]))
  45. (define-match-expander primapp
  46. (syntax-rules ()
  47. [(_ op args loc)
  48. (struct primapp-stx [loc op args])]
  49. [(_ op args)
  50. (struct primapp-stx [_ op args])]
  51. [(_)
  52. (struct primapp-stx _)])
  53. (syntax-rules ()
  54. [(_ op args loc)
  55. (make-primapp-stx loc op args)]
  56. [(_ op args)
  57. (make-primapp-stx #f op args)]))
  58. (define-match-expander app
  59. (syntax-rules ()
  60. [(_ op args loc)
  61. (struct app-stx [loc op args])]
  62. [(_ op args)
  63. (struct app-stx [_ op args])]
  64. [(_)
  65. (struct app-stx _)])
  66. (syntax-rules ()
  67. [(_ op args loc)
  68. (make-app-stx loc op args)]
  69. [(_ op args)
  70. (make-app-stx #f op args)]))
  71. (define-match-expander _begin
  72. (syntax-rules ()
  73. [(_ body loc)
  74. (struct begin-stx [loc body])]
  75. [(_ body)
  76. (struct begin-stx [_ body])]
  77. [(_)
  78. (struct begin-stx _)])
  79. (syntax-rules ()
  80. [(_ body loc)
  81. (make-begin-stx loc body)]
  82. [(_ body)
  83. (make-begin-stx #f body)]))
  84. (define-match-expander begin/var
  85. (syntax-rules ()
  86. [(_ ids body loc)
  87. (struct begin/var-stx [loc ids body])]
  88. [(_ ids body)
  89. (struct begin/var-stx [_ ids body])]
  90. [(_)
  91. (struct begin/var-stx _)])
  92. (syntax-rules ()
  93. [(_ ids body loc)
  94. (make-begin/var-stx loc ids body)]
  95. [(_ ids body)
  96. (make-begin/var-stx #f ids body)]))
  97. (define-match-expander begin/const/var
  98. (syntax-rules ()
  99. [(_ const-ids const-values ids body loc)
  100. (struct begin/const/var-stx [loc const-ids const-values ids body])]
  101. [(_ const-ids const-values ids body)
  102. (struct begin/const/var-stx [_ const-ids const-values ids body])]
  103. [(_)
  104. (struct begin/var-stx _)])
  105. (syntax-rules ()
  106. [(_ const-ids const-values ids body loc)
  107. (make-begin/const/var-stx loc const-ids const-values ids body)]
  108. [(_ const-ids const-values ids body)
  109. (make-begin/const/var-stx #f const-ids const-values ids body)]))
  110. (define-match-expander blocks
  111. (syntax-rules ()
  112. [(_ ids blocks loc)
  113. (struct blocks-stx [loc ids blocks])]
  114. [(_ ids blocks)
  115. (struct blocks-stx [_ ids blocks])]
  116. [(_)
  117. (struct begin/var-stx _)])
  118. (syntax-rules ()
  119. [(_ ids blocks loc)
  120. (make-blocks-stx loc ids blocks)]
  121. [(_ ids blocks)
  122. (make-blocks-stx #f ids blocks)]))
  123. (define-match-expander block
  124. (syntax-rules ()
  125. [(_ frames body loc)
  126. (struct block-stx [loc frames body])]
  127. [(_ frames body)
  128. (struct block-stx [_ frames body])]
  129. [(_)
  130. (struct begin/var-stx _)])
  131. (syntax-rules ()
  132. [(_ frames body loc)
  133. (make-block-stx loc frames body)]
  134. [(_ frames body)
  135. (make-block-stx #f frames body)]))
  136. (define-match-expander _define-values
  137. (syntax-rules ()
  138. [(_ ids value loc)
  139. (struct define-values-stx [loc ids value])]
  140. [(_ ids value)
  141. (struct define-values-stx [_ ids value])]
  142. [(_)
  143. (struct define-values-stx _)])
  144. (syntax-rules ()
  145. [(_ ids value loc)
  146. (make-define-values-stx loc ids value)]
  147. [(_ ids value)
  148. (make-define-values-stx #f ids value)]))
  149. (define-match-expander _if
  150. (syntax-rules ()
  151. [(_ test then else loc)
  152. (struct if-stx [loc test then else])]
  153. [(_ test then else)
  154. (struct if-stx [_ test then else])]
  155. [(_)
  156. (struct if-stx _)])
  157. (syntax-rules ()
  158. [(_ test then else loc)
  159. (make-if-stx loc test then else)]
  160. [(_ test then else)
  161. (make-if-stx #f test then else)]))
  162. (define-match-expander if-true
  163. (syntax-rules ()
  164. [(_ test then loc)
  165. (struct if-true-stx [loc test then])]
  166. [(_ test then)
  167. (struct if-true-stx [_ test then])]
  168. [(_)
  169. (struct if-true-stx _)])
  170. (syntax-rules ()
  171. [(_ test then loc)
  172. (make-if-true-stx loc test then)]
  173. [(_ test then)
  174. (make-if-true-stx #f test then)]))
  175. (define-match-expander if-false
  176. (syntax-rules ()
  177. [(_ test then loc)
  178. (struct if-false-stx [loc test then])]
  179. [(_ test then)
  180. (struct if-false-stx [_ test then])]
  181. [(_)
  182. (struct if-false-stx _)])
  183. (syntax-rules ()
  184. [(_ test then loc)
  185. (make-if-false-stx loc test then)]
  186. [(_ test then)
  187. (make-if-false-stx #f test then)]))
  188. (define-match-expander _lambda
  189. (syntax-rules ()
  190. [(_ ids rest-id body loc)
  191. (struct lambda-stx [loc ids rest-id body])]
  192. [(_ ids rest-id body)
  193. (struct lambda-stx [_ ids rest-id body])]
  194. [(_)
  195. (struct lambda-stx _)])
  196. (syntax-rules ()
  197. [(_ ids rest-id body loc)
  198. (make-lambda-stx loc ids rest-id body)]
  199. [(_ ids rest-id body)
  200. (make-lambda-stx #f ids rest-id body)]))
  201. (define-match-expander _case-lambda
  202. (syntax-rules ()
  203. [(_ clauses loc)
  204. (struct case-lambda-stx [loc clauses])]
  205. [(_ clauses)
  206. (struct case-lambda-stx [_ clauses])]
  207. [(_)
  208. (struct case-lambda-stx _)])
  209. (syntax-rules ()
  210. [(_ clauses loc)
  211. (make-case-lambda-stx loc clauses)]
  212. [(_ clauses)
  213. (make-case-lambda-stx #f clauses)]))
  214. (define-match-expander _case-lambda-clause
  215. (syntax-rules ()
  216. [(_ ids rest-id body loc)
  217. (struct case-lambda-clause-stx [loc ids rest-id body])]
  218. [(_ ids rest-id body)
  219. (struct case-lambda-clause-stx [_ ids rest-id body])]
  220. [(_)
  221. (struct case-lambda-clause-stx _)])
  222. (syntax-rules ()
  223. [(_ ids rest-id body loc)
  224. (make-case-lambda-clause-stx loc ids rest-id body)]
  225. [(_ ids rest-id body)
  226. (make-case-lambda-clause-stx #f ids rest-id body)]))
  227. (define-match-expander dispatch-lambda
  228. (syntax-rules ()
  229. [(_ procs loc)
  230. (struct dispatch-lambda-stx [loc procs])]
  231. [(_ procs)
  232. (struct dispatch-lambda-stx [_ procs])]
  233. [(_)
  234. (struct dispatch-lambda-stx _)])
  235. (syntax-rules ()
  236. [(_ procs loc)
  237. (make-dispatch-lambda-stx loc procs)]
  238. [(_ procs)
  239. (make-dispatch-lambda-stx #f procs)]))
  240. (define-match-expander _let-values
  241. (syntax-rules ()
  242. [(_ ids values body loc)
  243. (struct let-values-stx [loc ids values body])]
  244. [(_ ids values body)
  245. (struct let-values-stx [_ ids values body])]
  246. [(_)
  247. (struct let-values-stx _)])
  248. (syntax-rules ()
  249. [(_ ids values body loc)
  250. (make-let-values-stx loc ids values body)]
  251. [(_ ids values body)
  252. (make-let-values-stx #f ids values body)]))
  253. (define-match-expander _letrec-values
  254. (syntax-rules ()
  255. [(_ ids values body loc)
  256. (struct letrec-values-stx [loc ids values body])]
  257. [(_ ids values body)
  258. (struct letrec-values-stx [_ ids values body])]
  259. [(_)
  260. (struct letrec-values-stx _)])
  261. (syntax-rules ()
  262. [(_ ids values body loc)
  263. (make-letrec-values-stx loc ids values body)]
  264. [(_ ids values body)
  265. (make-letrec-values-stx #f ids values body)]))
  266. (define-match-expander fix
  267. (syntax-rules ()
  268. [(_ id values body loc)
  269. (struct fix-stx [loc id values body])]
  270. [(_ id values body)
  271. (struct fix-stx [_ id values body])]
  272. [(_)
  273. (struct fix-stx _)])
  274. (syntax-rules ()
  275. [(_ id values body loc)
  276. (make-fix-stx loc id values body)]
  277. [(_ id values body)
  278. (make-fix-stx #f id values body)]))
  279. (define-match-expander _set!
  280. (syntax-rules ()
  281. [(_ var value loc)
  282. (struct set!-stx [loc var value])]
  283. [(_ var value)
  284. (struct set!-stx [_ var value])]
  285. [(_)
  286. (struct set!-stx _)])
  287. (syntax-rules ()
  288. [(_ var value loc)
  289. (make-set!-stx loc var value)]
  290. [(_ var value)
  291. (make-set!-stx #f var value)]))
  292. (define-match-expander wcm
  293. (syntax-rules ()
  294. [(_ key value expr loc)
  295. (struct wcm-stx [loc key value expr])]
  296. [(_ key value expr)
  297. (struct wcm-stx [_ key value expr])]
  298. [(_)
  299. (struct wcm-stx _)])
  300. (syntax-rules ()
  301. [(_ key value expr loc)
  302. (make-wcm-stx loc key value expr)]
  303. [(_ key value expr)
  304. (make-wcm-stx #f key value expr)]))
  305. (define-match-expander wcmf
  306. (syntax-rules ()
  307. [(_ ids expr loc)
  308. (struct wcmf-stx [loc ids expr])]
  309. [(_ ids expr)
  310. (struct wcmf-stx [_ ids expr])]
  311. [(_)
  312. (struct wcmf-stx _)])
  313. (syntax-rules ()
  314. [(_ ids expr loc)
  315. (make-wcmf-stx loc ids expr)]
  316. [(_ ids expr)
  317. (make-wcmf-stx #f ids expr)]))
  318. (define-match-expander wcmtf
  319. (syntax-rules ()
  320. [(_ ids expr loc)
  321. (struct wcmtf-stx [loc ids expr])]
  322. [(_ ids expr)
  323. (struct wcmtf-stx [_ ids expr])]
  324. [(_)
  325. (struct wcmtf-stx _)])
  326. (syntax-rules ()
  327. [(_ ids expr loc)
  328. (make-wcmtf-stx loc ids expr)]
  329. [(_ ids expr)
  330. (make-wcmtf-stx #f ids expr)]))
  331. (define-match-expander wcm/body
  332. (syntax-rules ()
  333. [(_ key value body loc)
  334. (struct wcm/body-stx [loc key value body])]
  335. [(_ key value body)
  336. (struct wcm/body-stx [_ key value body])]
  337. [(_)
  338. (struct wcm/body-stx _)])
  339. (syntax-rules ()
  340. [(_ key value body loc)
  341. (make-wcm/body-stx loc key value body)]
  342. [(_ key value body)
  343. (make-wcm/body-stx #f key value body)]))
  344. (define-match-expander lexical-init
  345. (syntax-rules ()
  346. [(_ id value loc)
  347. (struct lexical-init-stx [loc id value])]
  348. [(_ id value)
  349. (struct lexical-init-stx [_ id value])]
  350. [(_)
  351. (struct lexical-init-stx _)])
  352. (syntax-rules ()
  353. [(_ id value loc)
  354. (make-lexical-init-stx loc id value)]
  355. [(_ id value)
  356. (make-lexical-init-stx #f id value)]))
  357. (define-match-expander global-init
  358. (syntax-rules ()
  359. [(_ id value loc)
  360. (struct global-init-stx [loc id value])]
  361. [(_ id value)
  362. (struct global-init-stx [_ id value])]
  363. [(_)
  364. (struct global-init-stx _)])
  365. (syntax-rules ()
  366. [(_ id value loc)
  367. (make-global-init-stx loc id value)]
  368. [(_ id value)
  369. (make-global-init-stx #f id value)]))
  370. (define-match-expander program
  371. (syntax-rules ()
  372. [(_ body loc)
  373. (struct program-stx [loc body])]
  374. [(_ body)
  375. (struct program-stx [_ body])]
  376. [(_)
  377. (struct program-stx _)])
  378. (syntax-rules ()
  379. [(_ body loc)
  380. (make-program-stx loc body)]
  381. [(_ body)
  382. (make-program-stx #f body)]))
  383. (define-match-expander program/var
  384. (syntax-rules ()
  385. [(_ global-ids lexical-ids body loc)
  386. (struct program/var-stx [loc global-ids lexical-ids body])]
  387. [(_ global-ids lexical-ids body)
  388. (struct program/var-stx [_ global-ids lexical-ids body])]
  389. [(_)
  390. (struct program/var-stx _)])
  391. (syntax-rules ()
  392. [(_ global-ids lexical-ids body loc)
  393. (make-program/var-stx loc global-ids lexical-ids body)]
  394. [(_ global-ids lexical-ids body)
  395. (make-program/var-stx #f global-ids lexical-ids body)]))
  396. (define-match-expander program/const/var
  397. (syntax-rules ()
  398. [(_ const-global-ids const-global-values const-lexical-ids const-lexical-values global-ids lexical-ids body loc)
  399. (struct program/const/var-stx [loc const-global-ids const-global-values const-lexical-ids const-lexical-values global-ids lexical-ids body])]
  400. [(_ const-global-ids const-global-values const-lexical-ids const-lexical-values global-ids lexical-ids body)
  401. (struct program/const/var-stx [_ const-global-ids const-global-values const-lexical-ids const-lexical-values global-ids lexical-ids body])]
  402. [(_) (struct program/var-stx _)])
  403. (syntax-rules ()
  404. [(_ const-global-ids const-global-values const-lexical-ids const-lexical-values global-ids lexical-ids body loc)
  405. (make-program/const/var-stx loc const-global-ids const-global-values const-lexical-ids const-lexical-values global-ids lexical-ids body)]
  406. [(_ const-global-ids const-global-values const-lexical-ids const-lexical-values global-ids lexical-ids body)
  407. (make-program/const/var-stx #f const-global-ids const-global-values const-lexical-ids const-lexical-values global-ids lexical-ids body)]))
  408. (define-match-expander loop
  409. (syntax-rules ()
  410. [(_ ids values body loc)
  411. (struct loop-stx [loc ids values body])]
  412. [(_ ids values body)
  413. (struct loop-stx [_ ids values body])]
  414. [(_)
  415. (struct loop-stx _)])
  416. (syntax-rules ()
  417. [(_ ids values body loc)
  418. (make-loop-stx loc ids values body)]
  419. [(_ ids values body)
  420. (make-loop-stx #f ids values body)]))
  421. (define-match-expander iterate
  422. (syntax-rules ()
  423. [(_ args loc)
  424. (struct iterate-stx [loc args])]
  425. [(_ args)
  426. (struct iterate-stx [_ args])]
  427. [(_)
  428. (struct iterate-stx _)])
  429. (syntax-rules ()
  430. [(_ args loc)
  431. (make-iterate-stx loc args)]
  432. [(_ args)
  433. (make-iterate-stx #f args)]))
  434. (define-match-expander tail
  435. (syntax-rules ()
  436. [(_ app loc)
  437. (struct tail-stx [loc app])]
  438. [(_ app)
  439. (struct tail-stx [_ app])]
  440. [(_)
  441. (struct tail-stx _)])
  442. (syntax-rules ()
  443. [(_ app loc)
  444. (make-tail-stx loc app)]
  445. [(_ app)
  446. (make-tail-stx #f app)]))
  447. (define-match-expander non-tail
  448. (syntax-rules ()
  449. [(_ app loc)
  450. (struct non-tail-stx [loc app])]
  451. [(_ app)
  452. (struct non-tail-stx [_ app])]
  453. [(_)
  454. (struct non-tail-stx _)])
  455. (lambda (stx)
  456. (syntax-case stx ()
  457. [(_ app loc)
  458. #'(make-non-tail-stx loc app)]
  459. [(_ app)
  460. #'(make-non-tail-stx #f app)]
  461. [non-tail
  462. (identifier? #'non-tail)
  463. #'(lambda (app)
  464. (non-tail app))])))
  465. (provide literal lexical-ref global-ref
  466. primapp app
  467. (rename-out (_begin begin))
  468. begin/var begin/const/var blocks block
  469. (rename-out (_define-values define-values))
  470. (rename-out (_if if))
  471. if-true if-false
  472. (rename-out (_let-values let-values))
  473. (rename-out (_letrec-values letrec-values))
  474. fix
  475. (rename-out (_lambda lambda))
  476. (rename-out (_case-lambda case-lambda))
  477. (rename-out (_case-lambda-clause case-lambda-clause))
  478. dispatch-lambda
  479. (rename-out (_set! set!))
  480. wcm wcmf wcmtf wcm/body
  481. lexical-init global-init
  482. program program/var program/const/var
  483. loop iterate
  484. tail non-tail)
  485. #;
  486. (begin
  487. (define-struct (module-stx stx) (body) #:prefab))