PageRenderTime 482ms CodeModel.GetById 21ms RepoModel.GetById 1ms app.codeStats 0ms

/pkgs/racket-pkgs/racket-test/tests/racket/syntax.rktl

http://github.com/plt/racket
Unknown | 1817 lines | 1663 code | 154 blank | 0 comment | 0 complexity | 7c3cee4b16f0a20309cfd1cdfe0887e1 MD5 | raw file
Possible License(s): LGPL-3.0, GPL-3.0, BSD-3-Clause, CC-BY-SA-3.0
  1. (load-relative "loadtest.rktl")
  2. (Section 'syntax)
  3. ;; ----------------------------------------
  4. (test 0 'with-handlers (with-handlers () 0))
  5. (test 1 'with-handlers (with-handlers ([void void]) 1))
  6. (test 2 'with-handlers (with-handlers ([void void]) 1 2))
  7. (test 'zero 'zero
  8. (with-handlers ((zero? (lambda (x) 'zero)))
  9. (raise 0)))
  10. (test 'zero 'zero
  11. (with-handlers ((zero? (lambda (x) 'zero))
  12. (positive? (lambda (x) 'positive)))
  13. (raise 0)))
  14. (test 'positive 'positive
  15. (with-handlers ((zero? (lambda (x) 'zero))
  16. (positive? (lambda (x) 'positive)))
  17. (raise 1)))
  18. (test 5 'with-handlers
  19. (with-handlers ([void (lambda (x) 5)])
  20. (with-handlers ((zero? (lambda (x) 'zero)))
  21. (/ 0))))
  22. (error-test #'(with-handlers ()
  23. (/ 0))
  24. exn:fail:contract:divide-by-zero?)
  25. (error-test #'(with-handlers ((zero? (lambda (x) 'zero)))
  26. (/ 0))
  27. exn:application:type?)
  28. (error-test #'(with-handlers ((zero? (lambda (x) 'zero))
  29. (boolean? (lambda (x) 'boolean)))
  30. (/ 0))
  31. exn:application:type?)
  32. (syntax-test #'with-handlers)
  33. (syntax-test #'(with-handlers))
  34. (syntax-test #'(with-handlers . 1))
  35. (syntax-test #'(with-handlers ((zero? (lambda (x) 'zero)))))
  36. (syntax-test #'(with-handlers ((zero? (lambda (x) 'zero))) . 1))
  37. (syntax-test #'(with-handlers (zero?) 1))
  38. (syntax-test #'(with-handlers ((zero?)) 1))
  39. (syntax-test #'(with-handlers ((zero? . zero?)) 1))
  40. (syntax-test #'(with-handlers ((zero? zero?) . 2) 1))
  41. (syntax-test #'(with-handlers ((zero? zero?) zero?) 1))
  42. (syntax-test #'(with-handlers ((zero? zero?) (zero?)) 1))
  43. (syntax-test #'(with-handlers ((zero? zero?) (zero?)) 1))
  44. (syntax-test #'(with-handlers ((zero? zero? zero?)) 1))
  45. (syntax-test #'(with-handlers ((zero? zero? . zero?)) 1))
  46. (syntax-test #'(with-handlers ((zero? zero?)) 1 . 2))
  47. (error-test #'(with-handlers ((0 void)) (/ 0))
  48. exn:application:type?)
  49. (error-test #'(with-handlers ((void 0)) (/ 0))
  50. exn:application:type?)
  51. (error-test #'(with-handlers ((unbound-variable void)) 0)
  52. exn:fail:contract:variable?)
  53. (error-test #'(with-handlers ((void unbound-variable)) 0)
  54. exn:fail:contract:variable?)
  55. (error-test #'(with-handlers (((values 1 2) void)) 0)
  56. arity?)
  57. (error-test #'(with-handlers ((void (values 1 2))) 0)
  58. arity?)
  59. (test-values '(1 2) (lambda () (with-handlers ([void void])
  60. (values 1 2))))
  61. (test 'c (#%plain-lambda () 'a (define-values (x) 'b) 'c))
  62. (test '(quote a) 'quote (quote 'a))
  63. (test '(quote a) 'quote ''a)
  64. (syntax-test #'quote)
  65. (syntax-test #'(quote))
  66. (syntax-test #'(quote 1 2))
  67. (test 12 (if #f + *) 3 4)
  68. (syntax-test #'(+ 3 . 4))
  69. (syntax-test #'(apply + 1 . 2))
  70. (test 8 (lambda (x) (+ x x)) 4)
  71. (define reverse-subtract
  72. (lambda (x y) (- y x)))
  73. (test 3 reverse-subtract 7 10)
  74. (define add4
  75. (let ((x 4))
  76. (lambda (y) (+ x y))))
  77. (test 10 add4 6)
  78. (test (letrec([x x]) x) 'lambda (let ([x (lambda () (define d d) d)]) (x)))
  79. (test (letrec([x x]) x) 'lambda ((lambda () (define d d) d)))
  80. (test '(3 4 5 6) (lambda x x) 3 4 5 6)
  81. (test '(5 6) (lambda (x y . z) z) 3 4 5 6)
  82. (test 'second (lambda () (cons 'first 2) 'second))
  83. (syntax-test #'lambda)
  84. (syntax-test #'(lambda))
  85. (syntax-test #'(lambda x))
  86. (syntax-test #'(lambda ()))
  87. (syntax-test #'(lambda () (begin)))
  88. (syntax-test #'(lambda . x))
  89. (syntax-test #'(lambda x . x))
  90. (syntax-test #'(lambda x . 5))
  91. (syntax-test #'(lambda ((x)) x))
  92. (syntax-test #'(lambda 5 x))
  93. (syntax-test #'(lambda (5) x))
  94. (syntax-test #'(lambda (x (y)) x))
  95. (syntax-test #'(lambda (x . 5) x))
  96. (syntax-test #'(lambda (x) x . 5))
  97. (let ([f
  98. (case-lambda
  99. [() 'zero]
  100. [(x) (cons 1 1) 'one]
  101. [(x y) 'two]
  102. [(x y z . rest) 'three+]
  103. [x 'bad])]
  104. [g
  105. (case-lambda
  106. [(x y z) 'three]
  107. [(x y) (cons 2 2) 'two]
  108. [(x) 'one]
  109. [() 'zero]
  110. [x (cons 0 'more!) 'more])]
  111. [h
  112. (case-lambda
  113. [(x y) 'two]
  114. [(x y z w) 'four])])
  115. (test 'zero f)
  116. (test 'one f 1)
  117. (test 'two f 1 2)
  118. (test 'three+ f 1 2 3)
  119. (test 'three+ f 1 2 3 4)
  120. (test 'three+ f 1 2 3 4 5 6 7 8 9 10)
  121. (test 'zero g)
  122. (test 'one g 1)
  123. (test 'two g 1 2)
  124. (test 'three g 1 2 3)
  125. (test 'more g 1 2 3 4 5 6 7 8 9 10)
  126. (test 'two h 1 2)
  127. (test 'four h 1 2 3 4)
  128. (let ([h '(case-lambda
  129. [(x y) 'two]
  130. [(x y z w) 'four])])
  131. (error-test (datum->syntax #f (list h) #f) arity?)
  132. (error-test (datum->syntax #f (list* h '(1)) #f) arity?)
  133. (error-test (datum->syntax #f (list* h '(1 2 3)) #f) arity?)
  134. (error-test (datum->syntax #f (list* h '(1 2 3 4 5 6)) #f) arity?)))
  135. (error-test #'((case-lambda)) arity?)
  136. (syntax-test #'case-lambda)
  137. (syntax-test #'(case-lambda . 1))
  138. (syntax-test #'(case-lambda []))
  139. (syntax-test #'(case-lambda 1))
  140. (syntax-test #'(case-lambda x))
  141. (syntax-test #'(case-lambda [x]))
  142. (syntax-test #'(case-lambda [x 8][y]))
  143. (syntax-test #'(case-lambda [x][y 9]))
  144. (syntax-test #'(case-lambda [8 8]))
  145. (syntax-test #'(case-lambda [((x)) 8]))
  146. (syntax-test #'(case-lambda [(8) 8]))
  147. (syntax-test #'(case-lambda [(x . 9) 8]))
  148. (syntax-test #'(case-lambda [x . 8]))
  149. (syntax-test #'(case-lambda [(x) . 8]))
  150. (syntax-test #'(case-lambda . [(x) 8]))
  151. (syntax-test #'(case-lambda [(x) 8] . y))
  152. (syntax-test #'(case-lambda [(x) 8] . [y 7]))
  153. (syntax-test #'(case-lambda [(x) 8] [8 7]))
  154. (syntax-test #'(case-lambda [(x) 8] [((y)) 7]))
  155. (syntax-test #'(case-lambda [(x) 8] [(8) 7]))
  156. (syntax-test #'(case-lambda [(x) 8] [(y . 8) 7]))
  157. (syntax-test #'(case-lambda [(x) 8] [y . 7]))
  158. (syntax-test #'(case-lambda [(x) 8] [(y) . 7]))
  159. (syntax-test #'(case-lambda [(x x) 8] [(y) 7]))
  160. (syntax-test #'(case-lambda [(x . x) 8] [(y) 7]))
  161. (syntax-test #'(case-lambda [(y) 7] [(x x) 8]))
  162. (syntax-test #'(case-lambda [(y) 7] [(x . x) 8]))
  163. (test 'yes 'if (if (> 3 2) 'yes 'no))
  164. (test 'no 'if (if (> 2 3) 'yes 'no))
  165. (test '1 'if (if (> 3 2) (- 3 2) (+ 3 2)))
  166. (test-values '(1 2) (lambda () (if (cons 1 2) (values 1 2) 0)))
  167. (test-values '(1 2) (lambda () (if (not (cons 1 2)) 0 (values 1 2))))
  168. (syntax-test #'if)
  169. (syntax-test #'(if))
  170. (syntax-test #'(if . #t))
  171. (syntax-test #'(if #t . 1))
  172. (syntax-test #'(if #t 1 . 2))
  173. (syntax-test #'(if #t))
  174. (syntax-test #'(if #t 1))
  175. (syntax-test #'(if #t 1 2 3))
  176. (syntax-test #'(if #t 1 2 . 3))
  177. (error-test #'(if (values 1 2) 3 4) arity?)
  178. (test (void) 'when (when (> 1 2) 0))
  179. (test (void) 'when (when (> 1 2) (cons 1 2) 0))
  180. (test 0 'when (when (< 1 2) 0))
  181. (test 0 'when (when (< 1 2) (cons 1 2) 0))
  182. (test-values '(0 10) (lambda () (when (< 1 2) (values 0 10))))
  183. (syntax-test #'when)
  184. (syntax-test #'(when))
  185. (syntax-test #'(when . 1))
  186. (syntax-test #'(when 1))
  187. (syntax-test #'(when 1 . 2))
  188. (error-test #'(when (values 1 2) 0) arity?)
  189. (test (void) 'unless (unless (< 1 2) 0))
  190. (test (void) 'unless (unless (< 1 2) (cons 1 2) 0))
  191. (test 0 'unless (unless (> 1 2) 0))
  192. (test 0 'unless (unless (> 1 2) (cons 1 2) 0))
  193. (test-values '(0 10) (lambda () (unless (> 1 2) (values 0 10))))
  194. (syntax-test #'unless)
  195. (syntax-test #'(unless))
  196. (syntax-test #'(unless . 1))
  197. (syntax-test #'(unless 1))
  198. (syntax-test #'(unless 1 . 2))
  199. (error-test #'(unless (values 1 2) 0) arity?)
  200. (define x 2)
  201. (test 3 'define (+ x 1))
  202. (set! x 4)
  203. (test 5 'set! (+ x 1))
  204. (syntax-test #'set!)
  205. (syntax-test #'(set!))
  206. (syntax-test #'(set! x))
  207. (syntax-test #'(set! x 1 2))
  208. (syntax-test #'(set! 1 2))
  209. (syntax-test #'(set! (x) 1))
  210. (syntax-test #'(set! . x))
  211. (syntax-test #'(set! x . 1))
  212. (syntax-test #'(set! x 1 . 2))
  213. (define (set!-not-ever-defined) (set! not-ever-defined (add1 not-ever-defined)))
  214. (err/rt-test (set!-not-ever-defined) exn:fail:contract:variable?)
  215. (set!-values (x) 9)
  216. (test 9 'set!-values x)
  217. (test (void) 'set!-values (set!-values () (values)))
  218. (syntax-test #'set!-values)
  219. (syntax-test #'(set!-values))
  220. (syntax-test #'(set!-values . x))
  221. (syntax-test #'(set!-values x))
  222. (syntax-test #'(set!-values 8))
  223. (syntax-test #'(set!-values (x)))
  224. (syntax-test #'(set!-values (x) . 0))
  225. (syntax-test #'(set!-values x 0))
  226. (syntax-test #'(set!-values (x . y) 0))
  227. (syntax-test #'(set!-values (x . 8) 0))
  228. (syntax-test #'(set!-values (x 8) 0))
  229. (syntax-test #'(set!-values (x) 0 1))
  230. (syntax-test #'(set!-values (x) 0 . 1))
  231. (syntax-test #'(set!-values (x x) 0))
  232. (syntax-test #'(set!-values (x y x) 0))
  233. (syntax-test #'(set!-values (y x x) 0))
  234. (error-test #'(set!-values () 1) arity?)
  235. (error-test #'(set!-values () (values 1 2)) arity?)
  236. (error-test #'(set!-values (x) (values)) arity?)
  237. (error-test #'(set!-values (x) (values 1 2)) arity?)
  238. (error-test #'(set!-values (x y) 1) arity?)
  239. (error-test #'(set!-values (x y) (values 1 2 3)) arity?)
  240. (error-test #'(set! unbound-variable 5) exn:fail:contract:variable?)
  241. (test 'greater 'cond (cond ((> 3 2) 'greater)
  242. ((< 3 2) 'less)))
  243. (test 'equal 'cond (cond ((> 3 3) 'greater)
  244. ((< 3 3) 'less)
  245. (else 'equal)))
  246. (test 2 'cond (cond ((assv 'b '((a 1) (b 2))) => cadr)
  247. (else #f)))
  248. (test #f 'cond (cond ((assv 'z '((a 1) (b 2))) => cadr)
  249. (else #f)))
  250. (syntax-test #'(cond ((assv 'z '((a 1) (b 2))) => cadr)
  251. (else 8)
  252. (else #f)))
  253. (test #f 'cond (let ([else #f])
  254. (cond ((assv 'z '((a 1) (b 2))) => cadr)
  255. (else 8)
  256. (#t #f))))
  257. (test 'second 'cond (cond ((< 1 2) (cons 1 2) 'second)))
  258. (test 'second-again 'cond (cond ((> 1 2) 'ok) (else (cons 1 2) 'second-again)))
  259. (test 1 'cond (cond (1)))
  260. (test 1 'cond (cond (#f) (1)))
  261. (test 1 'cond (cond (#f 7) (1)))
  262. (test 2 'cond (cond (#f 7) (1 => add1)))
  263. (test add1 'cond (let ([=> 9]) (cond (#f 7) (1 => add1))))
  264. (non-z '(test 0 'case (case (* 2 3)
  265. (6 0)
  266. (else 7))))
  267. (test 'composite 'case (case (* 2 3)
  268. ((2 3 5 7) 'prime)
  269. ((1 4 6 8 9) 'composite)))
  270. (test 'consonant 'case (case (car '(c d))
  271. ((a e i o u) 'vowel)
  272. ((w y) 'semivowel)
  273. (else 'consonant)))
  274. (test 'second 'case (case 10
  275. [(10) (cons 1 2) 'second]
  276. [else 5]))
  277. (test 'second-again 'case (case 11
  278. [(10) (cons 1 2) 'second]
  279. [else (cons 1 2) 'second-again]))
  280. (test-values '(10 9) (lambda ()
  281. (cond
  282. [(positive? 0) 'a]
  283. [(positive? 10) (values 10 9)]
  284. [else #f])))
  285. (test-values '(10 9) (lambda ()
  286. (case (string->symbol "hello")
  287. [(bye) 'a]
  288. [(hello) (values 10 9)]
  289. [else #f])))
  290. (error-test #'(cond [(values 1 2) 8]) arity?)
  291. (error-test #'(case (values 1 2) [(a) 8]) arity?)
  292. (syntax-test #'(case 1 []) #rx"ill-formed clause")
  293. (syntax-test #'(case 1 [(y) 5] []) #rx"ill-formed clause")
  294. (syntax-test #'(case 1 [x]) #rx"not a datum sequence")
  295. (syntax-test #'(case 1 [(y) 5] [x]) #rx"not a datum sequence")
  296. (syntax-test #'(case 1 [(y) 5] [x x]) #rx"not a datum sequence")
  297. (syntax-test #'(case 1 [x x]) #rx"not a datum sequence")
  298. (syntax-test #'(case 1 [(x)]) #rx"missing expression after datum sequence")
  299. (syntax-test #'(case 1 [(y) 5] [(x)]) #rx"missing expression after datum sequence")
  300. (syntax-test #'(case 1 [(x) . 8]) #rx"illegal use of `.'")
  301. (syntax-test #'(case 1 [(x) 10] . 9) #rx"illegal use of `.'")
  302. ;; test larger `case' dispatches to trigger for binary-search
  303. ;; and hash-table-based dispatch:
  304. (let ()
  305. (define (f x)
  306. (case x
  307. [(1003) 'even-further]
  308. [(0 -1 -2) 'low]
  309. [(1) 'one]
  310. [(2 3 4 5 6) 'middle]
  311. [(100) 'super]
  312. [(7 8 9 10 11) 'upper]
  313. [(1001) 'youch]
  314. [(12) 'high]
  315. [(1002) 'further]
  316. [(13) 'extreme]
  317. [(14) 'more]))
  318. (test 'low f -2)
  319. (test 'low f -1)
  320. (test 'low f 0)
  321. (test 'one f 1)
  322. (test 'middle f 2)
  323. (test 'middle f 3)
  324. (test 'middle f 4)
  325. (test 'middle f 5)
  326. (test 'middle f 6)
  327. (test 'upper f 7)
  328. (test 'upper f 8)
  329. (test 'upper f 9)
  330. (test 'upper f 10)
  331. (test 'upper f 11)
  332. (test 'high f 12)
  333. (test 'extreme f 13)
  334. (test 'more f 14)
  335. (test 'super f 100)
  336. (test 'youch f 1001)
  337. (test 'further f 1002)
  338. (test 'even-further f 1003)
  339. (test (void) f 1004)
  340. (test (void) f 104)
  341. (test (void) f -104))
  342. (let ()
  343. (define (f x)
  344. (case x
  345. [(#\u1003) 'even-further]
  346. [(#\u0) 'low]
  347. [(#\u1) 'one]
  348. [(#\u2 #\u3 #\u4 #\u5 #\u6) 'middle]
  349. [(#\u100) 'super]
  350. [(#\u7 #\u8 #\u9 #\u10 #\u11) 'upper]
  351. [(#\u1001) 'youch]
  352. [(#\u12) 'high]
  353. [(#\u1002) 'further]
  354. [(#\u13) 'extreme]
  355. [(#\u14) 'more]))
  356. (test 'low f #\u0)
  357. (test 'one f #\u1)
  358. (test 'middle f #\u2)
  359. (test 'middle f #\u3)
  360. (test 'middle f #\u4)
  361. (test 'middle f #\u5)
  362. (test 'middle f #\u6)
  363. (test 'upper f #\u7)
  364. (test 'upper f #\u8)
  365. (test 'upper f #\u9)
  366. (test 'upper f #\u10)
  367. (test 'upper f #\u11)
  368. (test 'high f #\u12)
  369. (test 'extreme f #\u13)
  370. (test 'more f #\u14)
  371. (test 'super f #\u100)
  372. (test 'youch f #\u1001)
  373. (test 'further f #\u1002)
  374. (test 'even-further f #\u1003)
  375. (test (void) f #\u1004)
  376. (test (void) f #\u104))
  377. (let ()
  378. (define (f x)
  379. (case x
  380. [(low) 0]
  381. [(one) 1]
  382. [(middle) 2]
  383. [(upper #t) 3]
  384. [(high big up-there more) 4]
  385. [(extreme massive huge #f gigantic) 5]))
  386. (test 0 f 'low)
  387. (test 1 f 'one)
  388. (test 2 f 'middle)
  389. (test 3 f 'upper)
  390. (test 3 f #t)
  391. (test 4 f 'high)
  392. (test 4 f 'big)
  393. (test 4 f 'up-there)
  394. (test 4 f 'more)
  395. (test 5 f 'extreme)
  396. (test 5 f 'massive)
  397. (test 5 f 'huge)
  398. (test 5 f #f)
  399. (test 5 f 'gigantic)
  400. (test (void) f 'gigante)
  401. (test (void) f 0))
  402. (let ()
  403. ;; This test relies on interning of string literals.
  404. (define (f x)
  405. (case x
  406. [("low") 0]
  407. [("one") 1]
  408. [("middle") 2]
  409. [("upper" #t) 3]
  410. [("high" "big" "up-there" "more") 4]
  411. [("extreme" "massive" "huge" "gigantic" #f) 5]))
  412. (test 0 f "low")
  413. (test 1 f "one")
  414. (test 2 f "middle")
  415. (test 3 f "upper")
  416. (test 3 f #t)
  417. (test 4 f "high")
  418. (test 4 f "big")
  419. (test 4 f "up-there")
  420. (test 4 f "more")
  421. (test 5 f "extreme")
  422. (test 5 f "massive")
  423. (test 5 f "huge")
  424. (test 5 f #f)
  425. (test 5 f "gigantic")
  426. (test (void) f "gigante")
  427. (test (void) f 'gigante)
  428. (test (void) f 0))
  429. (let ()
  430. ;; This test uses string-copy to avoid interning string literals.
  431. (define (f x)
  432. (define y
  433. (if (string? x)
  434. (string-copy x)
  435. x))
  436. (case y
  437. [("low") 0]
  438. [("one") 1]
  439. [("middle") 2]
  440. [("upper" #t) 3]
  441. [("high" "big" "up-there" "more") 4]
  442. [("extreme" "massive" "huge" "gigantic" #f) 5]))
  443. (test 0 f "low")
  444. (test 1 f "one")
  445. (test 2 f "middle")
  446. (test 3 f "upper")
  447. (test 3 f #t)
  448. (test 4 f "high")
  449. (test 4 f "big")
  450. (test 4 f "up-there")
  451. (test 4 f "more")
  452. (test 5 f "extreme")
  453. (test 5 f "massive")
  454. (test 5 f "huge")
  455. (test 5 f #f)
  456. (test 5 f "gigantic")
  457. (test (void) f "gigante")
  458. (test (void) f 'gigante)
  459. (test (void) f 0))
  460. (let ()
  461. (define (f x)
  462. (case x
  463. [("zero" #"zero" (z . 0) (z e r o) #(z e r o) #&zero
  464. #hash((z . "z") (e . "e") (r . "r") (o . "o"))
  465. #s(z e r o))
  466. 0]
  467. [("one" #"one" (o . 1) (o n e) #(o n e) #&one
  468. #hash((o . "o") (n . "n") (e . "e"))
  469. #s(o n e))
  470. 1]
  471. [("two" #"two" (t . 2) (t w o) #(t w o) #&two
  472. #hash((t . "t") (w . "w") (o . "o"))
  473. #s(t w o))
  474. 2]
  475. [("three" #"three" (t . 3) (t h r e e) #(t h r e e) #&three
  476. #hash((t . "t") (h . "h") (r . "e") (e . "e") (e . "e"))
  477. #s(t h r e e))
  478. 3]
  479. [("four" #"four" (f . 4) (f o u r) #(f o u r) #&four
  480. #hash((f . "f") (o . "o") (u . "u") (r . "r"))
  481. #s(f o u r))
  482. 4]
  483. [("five" #"five" (f . 5) (f i v e) #(f i v e) #&five
  484. #hash((f . "f") (i . "i") (v . "v") (e . "e"))
  485. #s(f i v e))
  486. 5]
  487. [("six" #"six" (s . 6) (s i x) #(s i x) #&six
  488. #hash((s . "s") (i . "i") (x . "x"))
  489. #s(s i x))
  490. 6]
  491. [("seven" #"seven" (s . 7) (s e v e n) #(s e v e n) #&seven
  492. #hash((s . "s") (e . "e") (v . "v") (e . "e") (n . "n"))
  493. #s(s e v e n))
  494. 7]
  495. [("eight" #"eight" (e . 8) (e i g h t) #(e i g h t) #&eight
  496. #hash((e . "e") (i . "i") (g . "g") (h . "h") (t . "t"))
  497. #s(e i g h t))
  498. 8]))
  499. (test 8 f "eight")
  500. (test 7 f #"seven")
  501. (test 6 f (cons 's 6))
  502. (test 5 f '(f i v e))
  503. (test 4 f '#(f o u r))
  504. (test 3 f (box 'three))
  505. (test 2 f (hash 't "t" 'w "w" 'o "o"))
  506. (test 1 f #s(o n e))
  507. (test (void) f #f))
  508. (test #t 'and (and (= 2 2) (> 2 1)))
  509. (test #f 'and (and (= 2 2) (< 2 1)))
  510. (test '(f g) 'and (and 1 2 'c '(f g)))
  511. (test #t 'and (and))
  512. (test-values '(1 12) (lambda () (and (cons 1 2) (values 1 12))))
  513. (test #t 'or (or (= 2 2) (> 2 1)))
  514. (test #t 'or (or (= 2 2) (< 2 1)))
  515. (test #f 'or (or #f #f #f))
  516. (test #f 'or (or))
  517. (test '(b c) 'or (or (memq 'b '(a b c)) (+ 3 0)))
  518. (test-values '(1 12) (lambda () (or (not (cons 1 2)) (values 1 12))))
  519. (syntax-test #'(cond #t))
  520. (syntax-test #'(cond ()) )
  521. (syntax-test #'(cond (1 =>)) )
  522. (syntax-test #'(cond (1 => 3 4)) )
  523. (syntax-test #'(cond . #t))
  524. (syntax-test #'(cond (#t . 1)))
  525. (syntax-test #'(cond (#t 1) #f))
  526. (syntax-test #'(cond (#t 1) . #f))
  527. (error-test #'(cond ((values #t #f) 1)) arity?)
  528. (syntax-test #'case)
  529. (syntax-test #'(case))
  530. (syntax-test #'(case 0 #t))
  531. (syntax-test #'(case . 0))
  532. (syntax-test #'(case 0 . #t))
  533. (syntax-test #'(case 0 (0 #t)))
  534. (syntax-test #'(case 0 ()))
  535. (syntax-test #'(case 0 (0)))
  536. (syntax-test #'(case 0 (0 . 8)))
  537. (syntax-test #'(case 0 ((0 . 1) 8)))
  538. (syntax-test #'(case 0 (0 8) #f))
  539. (syntax-test #'(case 0 (0 8) . #f))
  540. (syntax-test #'(case 0 (else 1) (else 2)))
  541. (syntax-test #'(case 0 ((0) =>)))
  542. (syntax-test #'=>)
  543. (syntax-test #'else)
  544. (syntax-test #'(and . 1))
  545. (syntax-test #'(and 1 . 2))
  546. (syntax-test #'(or . 1))
  547. (syntax-test #'(or 1 . 2))
  548. (error-test #'(and #t (values 1 2) 8) arity?)
  549. (error-test #'(or #f (values 1 2) 8) arity?)
  550. (test 6 'let (let ((x 2) (y 3)) (* x y)))
  551. (test 'second 'let (let ((x 2) (y 3)) (* x y) 'second))
  552. (test 6 'let-values (let-values (((x) 2) ((y) 3)) (* x y)))
  553. (test 6 'let-values (let-values (((x y) (values 2 3))) (* x y)))
  554. (test 35 'let (let ((x 2) (y 3)) (let ((x 7) (z (+ x y))) (* z x))))
  555. (test 35 'let-values (let-values (((x y) (values 2 3))) (let-values (((x) 7) ((z) (+ x y))) (* z x))))
  556. (test 70 'let* (let ((x 2) (y 3)) (let* ((x 7) (z (+ x y))) (* z x))))
  557. (test 70 'let*-values (let ((x 2) (y 3)) (let*-values (((x) 7) ((z) (+ x y))) (* z x))))
  558. (test #t 'letrec (letrec ((-even?
  559. (lambda (n) (if (zero? n) #t (-odd? (- n 1)))))
  560. (-odd?
  561. (lambda (n) (if (zero? n) #f (-even? (- n 1))))))
  562. (-even? 88)))
  563. (test #t 'letrec-values (letrec-values (((-even? -odd?)
  564. (values
  565. (lambda (n) (if (zero? n) #t (-odd? (- n 1))))
  566. (lambda (n) (if (zero? n) #f (-even? (- n 1)))))))
  567. (-even? 88)))
  568. (define x 34)
  569. (test 5 'let (let ((x 3)) (define x 5) x))
  570. (test 5 'let (let ((x 3)) (define-values (x w) (values 5 8)) x))
  571. (test 34 'let x)
  572. (test 6 'let (let () (define x 6) x))
  573. (test 34 'let x)
  574. (test 7 'let* (let* ((x 3)) (define x 7) x))
  575. (test 34 'let* x)
  576. (test 8 'let* (let* () (define x 8) x))
  577. (test 34 'let* x)
  578. (test 9 'letrec (letrec () (define x 9) x))
  579. (test 34 'letrec x)
  580. (test 10 'letrec (letrec ((x 3)) (define x 10) x))
  581. (test 34 'letrec x)
  582. (teval '(test 5 'letrec (letrec ((x 5)(y x)) y)))
  583. (test 3 'let (let ((y 'apple) (x 3) (z 'banana)) x))
  584. (test 3 'let* (let* ((y 'apple) (x 3) (z 'banana)) x))
  585. (test 3 'letrec (letrec ((y 'apple) (x 3) (z 'banana)) x))
  586. (test 3 'let* (let* ((x 7) (y 'apple) (z (set! x 3))) x))
  587. (test 3 'let* (let* ((x 7) (y 'apple) (z (if (not #f) (set! x 3) #f))) x))
  588. (test 3 'let* (let* ((x 7) (y 'apple) (z (if (not #t) #t (set! x 3)))) x))
  589. (test 3 'let-values (let-values (((y x z) (values 'apple 3 'banana))) x))
  590. (test 3 'let*-values (let*-values (((y x z) (values 'apple 3 'banana))) x))
  591. (test 3 'letrec-values (letrec-values (((y x z) (values 'apple 3 'banana))) x))
  592. (test 3 'let*-values (let*-values (((x y) (values 7 'apple)) ((z) (set! x 3))) x))
  593. (test 3 'let*-values (let*-values (((x y) (values 7 'apple)) ((z) (if (not #f) (set! x 3) #f))) x))
  594. (test 3 'let*-values (let*-values (((x y) (values 7 'apple)) ((z) (if (not #t) #t (set! x 3)))) x))
  595. (test 1 'named-let-scope (let ([f add1]) (let f ([n (f 0)]) n)))
  596. (test-values '(3 4) (lambda () (let ([x 3][y 4]) (values x y))))
  597. (test-values '(3 -4) (lambda () (let loop ([x 3][y -4]) (values x y))))
  598. (test-values '(3 14) (lambda () (let* ([x 3][y 14]) (values x y))))
  599. (test-values '(3 24) (lambda () (letrec ([x 3][y 24]) (values x y))))
  600. (test-values '(3 54) (lambda () (let-values ([(x y) (values 3 54)]) (values x y))))
  601. (test-values '(3 64) (lambda () (let*-values ([(x y) (values 3 64)]) (values x y))))
  602. (test-values '(3 74) (lambda () (letrec-values ([(x y) (values 3 74)]) (values x y))))
  603. (test 'one 'let-values (let-values ([() (values)]) 'one))
  604. (test 'two 'let*-values (let*-values ([() (values)]) 'two))
  605. (test 'three 'letrec-values (letrec-values ([() (values)]) 'three))
  606. (test 'onex 'let-values (let-values ([() (values)][() (values)]) 'onex))
  607. (test 'twox 'let*-values (let*-values ([() (values)][() (values)]) 'twox))
  608. (test 'threex 'letrec-values (letrec-values ([() (values)][() (values)]) 'threex))
  609. (letrec ([undef undef])
  610. (test (list 1 undef undef) 'no-split-letrec (letrec-values ([(a b c) (values 1 a b)]) (list a b c))))
  611. (test '(10 11) 'letrec-values (letrec-values ([(names kps)
  612. (letrec ([oloop 10])
  613. (values oloop (add1 oloop)))])
  614. (list names kps)))
  615. (define (error-test-let/no-* expr)
  616. (syntax-test (datum->syntax #f (cons 'let expr) #f))
  617. (syntax-test (datum->syntax #f (cons 'let (cons 'name expr)) #f))
  618. (syntax-test (datum->syntax #f (cons 'letrec expr) #f)))
  619. (define (error-test-let expr)
  620. (error-test-let/no-* expr)
  621. (syntax-test (datum->syntax #f (cons 'let* expr) #f)))
  622. (error-test-let #'x)
  623. (error-test-let #'(x))
  624. (error-test-let #'(()))
  625. (error-test-let #'(x ()))
  626. (syntax-test #'(let* x () 1))
  627. (syntax-test #'(letrec x () 1))
  628. (error-test-let #'(x . 1))
  629. (error-test-let #'(() . 1))
  630. (error-test-let #'(((x 1))))
  631. (error-test-let #'(((x 1)) . 1))
  632. (error-test-let #'(((x . 1)) 1))
  633. (error-test-let #'(((1 1)) 1))
  634. (error-test-let #'(((x 1) 1) 1))
  635. (error-test-let #'(((x 1) . 1) 1))
  636. (error-test-let #'(((x 1 1)) 1))
  637. (error-test-let #'(((x 1 1)) 1))
  638. (error-test-let #'(((x 1)) 1 . 2))
  639. (error-test-let/no-* #'(((x 1) (x 2)) 1))
  640. (error-test-let/no-* #'(((x 1) (y 3) (x 2)) 1))
  641. (error-test-let/no-* #'(((y 3) (x 1) (x 2)) 1))
  642. (error-test-let/no-* #'(((x 1) (x 2) (y 3)) 1))
  643. (test 5 'let* (let* ([x 4][x 5]) x))
  644. (error-test-let #'(() (define x 10)))
  645. (error-test-let #'(() (define x 10) (define y 20)))
  646. (define (do-error-test-let-values/no-* expr syntax-test)
  647. (syntax-test (datum->syntax #f (cons 'let-values expr) #f))
  648. (syntax-test (datum->syntax #f (cons 'letrec-values expr) #f)))
  649. (define (do-error-test-let-values expr syntax-test)
  650. (do-error-test-let-values/no-* expr syntax-test)
  651. (syntax-test (datum->syntax #f (cons 'let*-values expr) #f)))
  652. (define (error-test-let-values/no-* expr)
  653. (do-error-test-let-values/no-* expr syntax-test))
  654. (define (error-test-let-values expr)
  655. (do-error-test-let-values expr syntax-test))
  656. (error-test-let-values #'x)
  657. (error-test-let-values #'(x))
  658. (error-test-let-values #'(()))
  659. (error-test-let-values #'(x ()))
  660. (syntax-test #'(let*-values x () 1))
  661. (syntax-test #'(letrec-values x () 1))
  662. (error-test-let-values #'(x . 1))
  663. (error-test-let-values #'(() . 1))
  664. (error-test-let-values #'((((x) 1))))
  665. (error-test-let-values #'((((x) 1)) . 1))
  666. (error-test-let-values #'((((x) . 1)) 1))
  667. (error-test-let-values #'((((1) 1)) 1))
  668. (error-test-let-values #'((((x 1) 1)) 1))
  669. (error-test-let-values #'((((1 x) 1)) 1))
  670. (error-test-let-values #'((((x) 1) . 1) 1))
  671. (error-test-let-values #'((((x) 1 1)) 1))
  672. (error-test-let-values #'((((x . y) 1)) 1))
  673. (error-test-let-values #'((((x . 1) 1)) 1))
  674. (error-test-let-values #'((((x) 1)) 1 . 2))
  675. (error-test-let-values #'((((x x) 1)) 1))
  676. (error-test-let-values #'((((y) 0) ((x x) 1)) 1))
  677. (error-test-let-values #'((((x x) 1) ((y) 0)) 1))
  678. (error-test-let-values/no-* #'((((x) 1) ((x) 2)) 1))
  679. (error-test-let-values/no-* #'((((x) 1) ((y) 3) ((x) 2)) 1))
  680. (error-test-let-values/no-* #'((((y) 3) ((x) 1) ((x) 2)) 1))
  681. (error-test-let-values/no-* #'((((x) 1) ((x) 2) ((y) 3)) 1))
  682. (test 5 'let* (let*-values ([(x) 4][(x) 5]) x))
  683. (do-error-test-let-values #'((((x y) 1)) 1) (lambda (x) (error-test x arity?)))
  684. (do-error-test-let-values #'((((x) (values 1 2))) 1) (lambda (x) (error-test x arity?)))
  685. (do-error-test-let-values #'(((() (values 1))) 1) (lambda (x) (error-test x arity?)))
  686. (do-error-test-let-values #'((((x) (values))) 1) (lambda (x) (error-test x arity?)))
  687. (test 5 'embedded (let () (define y (lambda () x)) (define x 5) (y)))
  688. (let ([wrap (lambda (body)
  689. (syntax-test (datum->syntax #f `(let () ,@body) #f))
  690. (syntax-test (datum->syntax #f `(let () (begin ,@body)) #f)))])
  691. (wrap '((define x 7) (define x 8) x))
  692. (wrap '((define 3 8) x))
  693. (wrap '((define-values x 8) x)))
  694. (let ([wrap
  695. (lambda (val body)
  696. (teval `(test ,val 'let-begin (let () ,@body)))
  697. (teval `(test ,val 'let-begin (let ([xyzw 12]) ,@body)))
  698. (teval `(test ,val (lambda () ,@body)))
  699. (teval `(test ,val 'parameterize-begin
  700. (parameterize () ,@body)))
  701. (teval `(test ,val 'parameterize-begin
  702. (parameterize ([current-directory (current-directory)])
  703. ,@body)))
  704. (teval `(test ,val 'with-handlers-begin
  705. (with-handlers () ,@body)))
  706. (teval `(test ,val 'with-handlers-begin
  707. (with-handlers ([void void]) ,@body)))
  708. (teval `(test ,val 'when-begin (when (positive? 1) ,@body)))
  709. (teval `(test ,val 'unless-begin (unless (positive? -1) ,@body)))
  710. (teval `(test ,val 'cons-begin (cond [(positive? 1) ,@body][else #f])))
  711. (teval `(test ,val 'cons-else-begin (cond [(positive? -1) 0][else ,@body])))
  712. (teval `(test ,val 'case-begin (case (positive? 1) [(#t) ,@body][else -12])))
  713. (teval `(test ,val 'cond-only-begin (cond [#t ,@body])))
  714. (syntax-test (datum->syntax #f `(do ((x 1)) (#t ,@body) ,@body) #f))
  715. (syntax-test (datum->syntax #f `(begin0 12 ,@body) #f)))])
  716. (wrap 5 '((begin (define x 5)) x))
  717. (wrap 5 '((begin (define x 5) x)))
  718. (wrap 15 '((begin (define x 5)) (begin (define y (+ x 10)) y)))
  719. (wrap 13 '((begin) 13))
  720. (wrap 7 '((begin) (begin) (begin (define x 7) (begin) x)))
  721. (wrap 7 '((begin (begin (begin (define x 7) (begin) x))))))
  722. (define x 0)
  723. (define (test-begin bg nested-bg)
  724. (let* ([make-args
  725. (lambda (bg b)
  726. (if (eq? bg 'begin)
  727. b
  728. (let* ([len (length b)]
  729. [last (list-ref b (sub1 len))])
  730. (cons last
  731. (let loop ([l b])
  732. (if (null? (cdr l))
  733. null
  734. (cons (car l) (loop (cdr l)))))))))]
  735. [test-bg
  736. (lambda (v b)
  737. (let* ([args (make-args bg b)]
  738. [expr (cons bg args)])
  739. (printf "~s:\n" expr)
  740. (teval `(test ,v (quote ,bg) ,expr))))]
  741. [make-bg
  742. (lambda (b)
  743. (cons nested-bg (make-args nested-bg b)))]
  744. [make-test-bg-d
  745. (lambda (bg)
  746. (lambda (v1 v2 b)
  747. (test-bg (if (eq? bg 'begin)
  748. v1
  749. v2)
  750. b)))]
  751. [test-bg-d (make-test-bg-d bg)]
  752. [test-bg-d2 (make-test-bg-d nested-bg)])
  753. (teval '(set! x 0))
  754. (test-bg-d 6 1 '((set! x 5) (+ x 1)))
  755. (test-bg 5 '(5))
  756. (test-bg 3 '(2 3))
  757. (test-bg 3 `(2 (,bg 3)))
  758. (test-bg 3 `(,(make-bg '(2)) ,(make-bg '(3))))
  759. (test-bg-d 7 6 '((set! x 6) 'a (+ x 1)))
  760. (test-bg ''w '((set! x 6) 'a (+ x 1) 'w))
  761. (test-bg-d 8 7 '('b (set! x 7) (+ x 1)))
  762. (test-bg-d 9 8 '('b (set! x 8) 'a (+ x 1)))
  763. (test-bg ''z '('b (set! x 8) 'a (+ x 1) 'z))
  764. (test-bg-d 7 9 `(,(make-bg '((set! x 6) 'a)) (+ x 1)))
  765. (test-bg 10 `(,(make-bg '((set! x 60) 'a)) 10))
  766. (teval '(test 60 'x x))
  767. (test-bg 10 `(,(make-bg '((set! x 65) 'a)) (add1 20) 10))
  768. (teval '(test 65 'x x))
  769. (test-bg ''a `(10 ,(make-bg '((set! x 66) 'a))))
  770. (teval '(test 66 'x x))
  771. (test-bg ''a `(10 (add1 32) ,(make-bg '((set! x 67) 'a))))
  772. (teval '(test 67 'x x))
  773. (teval '(set! x 6))
  774. (test-bg-d 8 7 `(,(make-bg '('b (set! x 7) 'a)) (+ x 1)))
  775. (test-bg-d 9 8 `(,(make-bg '('b (set! x 8))) ,(make-bg '('a (+ x 1)))))
  776. (test-bg-d2 10 9 `(,(make-bg `(,(make-bg `('b (set! x 9) ,(make-bg '('a (+ x 1)))))))))
  777. (test-bg ''s `(,(make-bg `(,(make-bg `('b (set! x 9) ,(make-bg '('a (+ x 1) 's))))))))
  778. (test-bg ''t `(,(make-bg `(,(make-bg `('b (set! x 9) ,(make-bg '('a (+ x 1))))))) 't))
  779. (teval `(test 5 call-with-values (lambda () ,(make-bg '((values 1 2) (values 1 3 1)))) +))
  780. (syntax-test (datum->syntax #f `(,bg . 1) #f))
  781. (syntax-test (datum->syntax #f `(,bg 1 . 2) #f))))
  782. (test-begin 'begin 'begin)
  783. (test-begin 'begin0 'begin)
  784. (test-begin 'begin0 'begin0)
  785. (test-begin 'begin 'begin0)
  786. (syntax-test #'(begin0))
  787. (begin) ; must succeed, but we can't wrap it
  788. (test 4 'implicit-begin (let ([x 4][y 7]) 'y x))
  789. (test 4 'implicit-begin (let ([x 4][y 7]) y x))
  790. (test 5 'implicit-begin (let () (begin) 10 5))
  791. (error-test #'(begin (define foo (let/cc k k)) (foo 10)) exn:application:type?) ; not exn:application:continuation?
  792. (define f-check #t)
  793. (define f (delay (begin (set! f-check #f) 5)))
  794. (test #t (lambda () f-check))
  795. (test 5 force f)
  796. (test #f (lambda () f-check))
  797. (test 5 force f)
  798. (define f-check-2 (delay (values 1 5)))
  799. (test-values '(1 5) (lambda () (force f-check-2)))
  800. (values 1 2)
  801. (test-values '(1 5) (lambda () (force f-check-2)))
  802. (syntax-test #'delay)
  803. (syntax-test #'(delay))
  804. (syntax-test #'(delay . 1))
  805. (syntax-test #'(delay 1 . 2))
  806. (let ([p (delay/sync 12)]
  807. [v #f])
  808. (thread (lambda () (set! v (force p))))
  809. (sync (system-idle-evt))
  810. (test 12 force p)
  811. (test 12 values v)
  812. (test (void) sync p)
  813. (test (list (void)) sync (wrap-evt p list)))
  814. (test '(list 3 4) 'quasiquote `(list ,(+ 1 2) 4))
  815. (test '(list a (quote a)) 'quasiquote (let ((name 'a)) `(list ,name ',name)))
  816. (test '(a 3 4 5 6 b) 'quasiquote `(a ,(+ 1 2) ,@(map abs '(4 -5 6)) b))
  817. (test '((foo 7) . cons)
  818. 'quasiquote
  819. `((foo ,(- 10 3)) ,@(cdr '(c)) . ,(car '(cons))))
  820. (test '#(10 5 2 4 3 8) 'quasiquote `#(10 5 ,(sqrt 4) ,@(map sqrt '(16 9)) 8))
  821. (test 5 'quasiquote `,(+ 2 3))
  822. (test '(a `(b ,(+ 1 2) ,(foo 4 d) e) f)
  823. 'quasiquote `(a `(b ,(+ 1 2) ,(foo ,(+ 1 3) d) e) f))
  824. (test '(a `(b ,x ,'y d) e) 'quasiquote
  825. (let ((name1 'x) (name2 'y)) `(a `(b ,,name1 ,',name2 d) e)))
  826. (test '(list 3 4) 'quasiquote (quasiquote (list (unquote (+ 1 2)) 4)))
  827. (test '`(list ,(+ 1 2) 4) 'quasiquote '(quasiquote (list (unquote (+ 1 2)) 4)))
  828. (test '(()) 'qq `((,@'())))
  829. (define x 5)
  830. (test '(quasiquote (unquote x)) 'qq ``,x)
  831. (test '(quasiquote (unquote 5)) 'qq ``,,x)
  832. (test '(quasiquote (unquote-splicing x)) 'qq ``,@x)
  833. (test '(quasiquote (unquote-splicing 5)) 'qq ``,@,x)
  834. (test '(quasiquote (quasiquote (quasiquote (unquote (unquote (unquote x)))))) 'qq ````,,,x)
  835. (test '(quasiquote (quasiquote (quasiquote (unquote (unquote (unquote 5)))))) 'qq ````,,,,x)
  836. (test '#hash() 'qq `#hash())
  837. (test '#hash(("apple" . 1) ("banana" . 2) ("coconut" . 3))
  838. 'qq
  839. `#hash(("apple" . 1) ("banana" . 2) ("coconut" . 3)))
  840. (test '#hash(("apple" . 1) ("banana" . 2) ("coconut" . 3))
  841. 'qq
  842. `#hash(("apple" . ,1) ("banana" . ,(add1 1)) ("coconut" . ,(+ 1 2))))
  843. (test '#hash(("foo" . (1 2 3 4 5)))
  844. 'qq
  845. `#hash(("foo" . (1 2 ,(+ 1 2) 4 5))))
  846. (test '#hash(("foo" . (1 2 (+ 1 2) 4 5)))
  847. 'qq
  848. `#hash(("foo" . (1 2 (+ 1 2) 4 5))))
  849. (test '#hash(("foo" . (1 2 3 4 5)))
  850. 'qq
  851. `#hash(("foo" . (1 2 ,@(list 3 4 5)))))
  852. (test '#hash((,(read) . 1) (,(+ 1 2) . 3))
  853. 'qq
  854. `#hash((,(read) . 1) (,(+ 1 2) . ,(+ 1 2))))
  855. (test '#hash((,(read) . 2))
  856. 'qq
  857. `#hash((,(read) . 1) (,(read) . 2)))
  858. (test '#hash(("moo" . 3) ("foo" . (1 2)))
  859. 'qq
  860. `#hash(("moo" . ,(+ 1 2)) ("foo" . (1 2))))
  861. (test '#hash(("moo" . (+ 1 2)) ("foo" . -1))
  862. 'qq
  863. `#hash(("moo" . (+ 1 2)) ("foo" . ,(- 1 2))))
  864. (syntax-test #'`#hash(("foo" . ,@(list 1 2 3 4 5))))
  865. (error-test #'(read (open-input-string "`#hash((foo ,@(list 1 2 3 4 5)))")) exn:fail:read?)
  866. (test '(quasiquote (unquote result)) 'qq `(quasiquote ,result))
  867. (test (list 'quasiquote car) 'qq `(,'quasiquote ,car))
  868. (syntax-test #'quasiquote)
  869. (syntax-test #'(quasiquote))
  870. (syntax-test #'(quasiquote . 5))
  871. (syntax-test #'(quasiquote 1 . 2))
  872. (syntax-test #'(quasiquote 1 2))
  873. (syntax-test #'(unquote 7))
  874. (syntax-test #'(unquote-splicing 7))
  875. (syntax-test #'`(1 . ,@5))
  876. (test (cons 1 5) 'qq `(1 ,@5))
  877. (error-test #'`(1 ,@5 2))
  878. (define (qq-test e)
  879. (syntax-test (datum->syntax #f e #f))
  880. (syntax-test (datum->syntax #f (list 'quasiquote e) #f))
  881. (syntax-test (datum->syntax #f (list 'quasiquote e) #f))
  882. (syntax-test (datum->syntax #f (list 'quasiquote (list 'quasiquote e)) #f))
  883. (syntax-test (datum->syntax #f (list 'quasiquote (list 'quasiquote (list 'unquote e))) #f))
  884. (syntax-test (datum->syntax #f (list 'quasiquote (list 'quasiquote (list 'unquote-splicing e))) #f)))
  885. (qq-test #'(unquote))
  886. (qq-test #'(unquote 7 8 9))
  887. (qq-test #'(unquote-splicing))
  888. (qq-test #'(unquote-splicing 7 8 9))
  889. (test '(unquote . 5) 'qq (quasiquote (unquote . 5)))
  890. (test '(unquote 1 . 5) 'qq (quasiquote (unquote 1 . 5)))
  891. (test '(unquote 1 2 . 5) 'qq (quasiquote (unquote 1 2 . 5)))
  892. (test '(unquote 1 2 7 . 5) 'qq (quasiquote (unquote 1 2 ,(+ 3 4) . 5)))
  893. (test '(unquote 1 2 (unquote (+ 3 4)) . 5) 'qq (quasiquote (unquote 1 2 ,',(+ 3 4) . 5)))
  894. (test '(1 2 3 4 . 5) 'qq `(1 ,@'(2 3 4) . 5))
  895. (error-test #'`(10 ,(values 1 2)) arity?)
  896. (error-test #'`(10 ,@(values 1 2)) arity?)
  897. (define add3 (lambda (x) (+ x 3)))
  898. (test 6 'define (add3 3))
  899. (define (add3 x) (+ x 3))
  900. (test 6 'define (add3 3))
  901. (define first car)
  902. (test 1 'define (first '(1 2)))
  903. (syntax-test #'define)
  904. (syntax-test #'(define))
  905. (syntax-test #'(define . x))
  906. (syntax-test #'(define x))
  907. (syntax-test #'(define x . 1))
  908. (syntax-test #'(define 1 2))
  909. (syntax-test #'(define (1) 1))
  910. (syntax-test #'(define (x 1) 1))
  911. (syntax-test #'(define (x a a) 1))
  912. (syntax-test #'(define ((x 1) a) 1))
  913. (syntax-test #'(define ((x b b) a) 1))
  914. (syntax-test #'(define x 1 . 2))
  915. (syntax-test #'(define x 1 2))
  916. (let ()
  917. (define ((f x) y z) (list x y z))
  918. (test '(1 2 3) (f 1) 2 3))
  919. (let ()
  920. (define ((g a) a b) (list a b))
  921. (test '(2 3) (g 1) 2 3))
  922. (define-values (add3) (lambda (x) (+ x 3)))
  923. (test 6 'define (add3 3))
  924. (define-values (add3 another) (values (lambda (x) (+ x 3)) 9))
  925. (test 6 'define (add3 3))
  926. (test 9 'define another)
  927. (define-values (first second third) (values car cadr caddr))
  928. (test 1 'define (first '(1 2)))
  929. (test 2 'define (second '(1 2)))
  930. (test 3 'define (third '(1 2 3)))
  931. (define-values () (values))
  932. (syntax-test #'define-values)
  933. (syntax-test #'(define-values))
  934. (syntax-test #'(define-values . x))
  935. (syntax-test #'(define-values x))
  936. (syntax-test #'(define-values (x)))
  937. (syntax-test #'(define-values x . 1))
  938. (syntax-test #'(define-values (x) . 1))
  939. (syntax-test #'(define-values 1 2))
  940. (syntax-test #'(define-values (1) 2))
  941. (syntax-test #'(define-values (x 1) 1))
  942. (syntax-test #'(define-values (x . y) 1))
  943. (syntax-test #'(define-values (x) 1 . 2))
  944. (syntax-test #'(define-values (x) 1 2))
  945. (syntax-test #'(define-values (x x) 10))
  946. (syntax-test #'(define-values (x y x) 10))
  947. (syntax-test #'((define x 2) 0 1))
  948. (syntax-test #'(+ (define x 2) 1))
  949. (syntax-test #'(if (define x 2) 0 1))
  950. (syntax-test #'(begin0 (define x 2)))
  951. (syntax-test #'(begin0 (define x 2) 0))
  952. (syntax-test #'(begin0 0 (define x 2)))
  953. (syntax-test #'(begin0 0 (define x 2) (define x 12)))
  954. (syntax-test #'(let () (define x 2)))
  955. (syntax-test #'(letrec () (define x 2)))
  956. (syntax-test #'(lambda () (define x 2)))
  957. (syntax-test #'(lambda () (void (define x 2)) 1))
  958. (syntax-test #'(cond [(< 2 3) (define x 2)] [else 5]))
  959. (syntax-test #'(cond [else (define x 2)]))
  960. ;; No good way to test in mzc:
  961. (error-test #'(define x (values)) exn:application:arity?)
  962. (error-test #'(define x (values 1 2)) exn:application:arity?)
  963. (error-test #'(define-values () 3) exn:application:arity?)
  964. (error-test #'(define-values () (values 1 3)) exn:application:arity?)
  965. (error-test #'(define-values (x y) (values)) exn:application:arity?)
  966. (error-test #'(define-values (x y) 3) exn:application:arity?)
  967. (error-test #'(define-values (x y) (values 1 2 3)) exn:application:arity?)
  968. (begin (define ed-t1 1) (define ed-t2 2))
  969. (test 1 'begin-define ed-t1)
  970. (test 2 'begin-define ed-t2)
  971. (begin (begin (begin (begin 10 (define ed-t2.5 2.5) 12))))
  972. (test 2.5 'begin-define ed-t2.5)
  973. (syntax-test #'(if (zero? 0) (define ed-t3 3) (define ed-t3 -3)))
  974. (syntax-test #'(if #t (define ed-t3 3) (define ed-t3 -3)))
  975. (syntax-test #'(if #f (define ed-t3 3) (define ed-t3 -3)))
  976. (test 45 'define
  977. (let ((x 5))
  978. (define foo (lambda (y) (bar x y)))
  979. (define bar (lambda (a b) (+ (* a b) a)))
  980. (foo (+ x 3))))
  981. (define x 34)
  982. (define (foo) (define x 5) x)
  983. (test 5 foo)
  984. (test 34 'define x)
  985. (define foo (lambda () (define x 5) x))
  986. (test 5 foo)
  987. (test 34 'define x)
  988. (define (foo x) ((lambda () (define x 5) x)) x)
  989. (test 88 foo 88)
  990. (test 4 foo 4)
  991. (test 34 'define x)
  992. (test 5 'define
  993. (let ()
  994. (define x 5)
  995. (define define (lambda (a b) (+ a b)))
  996. 8
  997. (define x 7)
  998. x))
  999. (test 8 'define ; used to be 6
  1000. (let ([y 8])
  1001. (define (define z w) 5)
  1002. (define y 6)
  1003. y))
  1004. (syntax-test #'(let ()
  1005. (define x 5)))
  1006. (syntax-test #'(let ()
  1007. (if #t
  1008. (define x 5))
  1009. 5))
  1010. ; Can shadow syntax/macros with embedded defines
  1011. (test 5 'intdef (let ()
  1012. (define lambda 5)
  1013. lambda))
  1014. (test 5 'intdef (let ()
  1015. (define define 5)
  1016. 'ok
  1017. define))
  1018. (syntax-test #'(lambda () (define x 10) (begin)))
  1019. (syntax-test #'(lambda () (define x 10) (begin) (begin)))
  1020. (syntax-test #'(lambda () (#%stratified-syntax (define x 10) (begin) (begin x) (begin))))
  1021. (syntax-test #'(lambda () (#%stratified-syntax (define x 10) x (define y 12) y)))
  1022. (syntax-test #'(lambda () (define-values (x) . 10) x))
  1023. (syntax-test #'(lambda () (define-values (x) 10) (begin 1 . 2) x))
  1024. (syntax-test #'(lambda () (begin (define-values (x) 10) . 2) x))
  1025. (syntax-test #'(lambda () (begin)))
  1026. (syntax-test #'(lambda () (define-values . 10) x))
  1027. (syntax-test #'(lambda () (define-values x 10) x))
  1028. (syntax-test #'(lambda () (define-values (1) 10) x))
  1029. (test '(10 12) apply (lambda () (define x 10) (random 3) (define y 12) (list x y)) null)
  1030. (test 10 apply (lambda () (define x 10) (begin) (begin x) (begin)) null)
  1031. (test '(11 18) apply (lambda () (define x 11) (values 1 2 3) (define y 18) (list x y)) null)
  1032. (test 87 (lambda () (define x 87) (begin) (begin x)))
  1033. (test '#(0 1 2 3 4) 'do (do ((vec (make-vector 5))
  1034. (i 0 (+ i 1)))
  1035. ((= i 5) vec)
  1036. (vector-set! vec i i)))
  1037. (test 25 'do (let ((x '(1 3 5 7 9)))
  1038. (do ((x x (cdr x))
  1039. (sum 0 (+ sum (car x))))
  1040. ((null? x) sum))))
  1041. (test 1 'let (let foo () 1))
  1042. (test '((6 1 3) (-5 -2)) 'let
  1043. (let loop ((numbers '(3 -2 1 6 -5))
  1044. (nonneg '())
  1045. (neg '()))
  1046. (cond ((null? numbers) (list nonneg neg))
  1047. ((negative? (car numbers))
  1048. (loop (cdr numbers)
  1049. nonneg
  1050. (cons (car numbers) neg)))
  1051. (else
  1052. (loop (cdr numbers)
  1053. (cons (car numbers) nonneg)
  1054. neg)))))
  1055. (test 5 'do (do ((x 1)) (#t 5)))
  1056. (test-values '(10 5) (lambda () (do ((x 1)) (#t (values 10 5)))))
  1057. (syntax-test #'do)
  1058. (syntax-test #'(do))
  1059. (syntax-test #'(do ()) )
  1060. (syntax-test #'(do () ()) )
  1061. (syntax-test #'(do (1) (#t 5) 5))
  1062. (syntax-test #'(do ((1)) (#t 5) 5))
  1063. (syntax-test #'(do ((1 7)) (#t 5) 5))
  1064. (syntax-test #'(do ((x . 1)) (#t 5) 5))
  1065. (syntax-test #'(do ((x 1) 2) (#t 5) 5))
  1066. (syntax-test #'(do ((x 1) . 2) (#t 5) 5))
  1067. (syntax-test #'(do ((x 1)) (#t . 5) 5))
  1068. (syntax-test #'(do ((x 1)) (#t 5) . 5))
  1069. (test 0 'let/cc (let/cc k (k 0) 1))
  1070. (test 0 'let/cc (let/cc k 0))
  1071. (test 1 'let/cc (let/cc k (cons 1 2) 1))
  1072. (test-values '(2 1) (lambda () (let/cc k (values 2 1))))
  1073. (test-values '(2 1) (lambda () (let/cc k (k 2 1))))
  1074. (syntax-test #'(let/cc))
  1075. (syntax-test #'(let/cc . k))
  1076. (syntax-test #'(let/cc k))
  1077. (syntax-test #'(let/cc k . 1))
  1078. (syntax-test #'(let/cc 1 1))
  1079. (test 0 'let/ec (let/ec k (k 0) 1))
  1080. (test 0 'let/ec (let/ec k 0))
  1081. (test 1 'let/ec (let/ec k (cons 1 2) 1))
  1082. (test-values '(2 1) (lambda () (let/ec k (values 2 1))))
  1083. (test-values '(2 1) (lambda () (let/ec k (k 2 1))))
  1084. (syntax-test #'(let/ec))
  1085. (syntax-test #'(let/ec . k))
  1086. (syntax-test #'(let/ec k))
  1087. (syntax-test #'(let/ec k . 1))
  1088. (syntax-test #'(let/ec 1 1))
  1089. (define x 1)
  1090. (define y -1)
  1091. (define (get-x) x)
  1092. (test 5 'parameterize (parameterize () 5))
  1093. (test 6 'parameterize (parameterize ([error-print-width 10]) 6))
  1094. (test 7 'parameterize (parameterize ([error-print-width 10]
  1095. [uncaught-exception-handler void])
  1096. 7))
  1097. (define oepw (error-print-width))
  1098. (error-test #'(parameterize ([error-print-width 777]) (error 'bad)) exn:fail?)
  1099. (test oepw 'parameterize (error-print-width))
  1100. (error-test #'(parameterize ([error-print-width 777]
  1101. [current-output-port (current-error-port)])
  1102. (error 'bad))
  1103. exn:fail?)
  1104. (error-test #'(parameterize ([error-print-width 'a]) 10))
  1105. (define p (make-parameter 1))
  1106. (define q (make-parameter 2))
  1107. (test '1 'pz-order (parameterize ([p 3][q (p)]) (q)))
  1108. (error-test #'(parameterize) syntaxe?)
  1109. (error-test #'(parameterize ()) syntaxe?)
  1110. (error-test #'(parameterize ((x y))) syntaxe?)
  1111. (error-test #'(parameterize ((x y)) . 8) syntaxe?)
  1112. (error-test #'(parameterize (x) 8) syntaxe?)
  1113. (error-test #'(parameterize (9) 8) syntaxe?)
  1114. (error-test #'(parameterize ((x z) . y) 8) syntaxe?)
  1115. (error-test #'(parameterize ((x . z)) 8) syntaxe?)
  1116. (error-test #'(parameterize ((x . 9)) 8) syntaxe?)
  1117. (error-test #'(parameterize ((x . 9)) 8) syntaxe?)
  1118. (error-test #'(parameterize ([10 10]) 8))
  1119. (error-test #'(parameterize ([10 10]) 8) (lambda (exn) (not (regexp-match #rx"argument" (exn-message exn)))))
  1120. (error-test #'(parameterize ([(lambda () 10) 10]) 8))
  1121. (error-test #'(parameterize ([(lambda (a) 10) 10]) 8))
  1122. (error-test #'(parameterize ([(lambda (a b) 10) 10]) 8))
  1123. (test 1 'time (time 1))
  1124. (test -1 'time (time (cons 1 2) -1))
  1125. (test-values '(-1 1) (lambda () (time (values -1 1))))
  1126. (syntax-test #'time)
  1127. (syntax-test #'(time))
  1128. (syntax-test #'(time . 1))
  1129. (syntax-test #'(time 1 . 2))
  1130. ; Tests specifically aimed at the compiler
  1131. (error-test #'(let ([x (values 1 2)]) x) exn:application:arity?)
  1132. ; Known primitive
  1133. (error-test #'(let ([x (make-pipe)]) x) exn:application:arity?)
  1134. ; Known local
  1135. (error-test #'(let* ([f (lambda () (values 1 2))][x (f)]) x) exn:application:arity?)
  1136. ; Known local with global in its closure
  1137. (test 15 'known (let ([g (lambda ()
  1138. (letrec ([f (lambda (x)
  1139. (+ x 5))])
  1140. (f 10)))])
  1141. (g)))
  1142. ; Known local with a set!
  1143. (test 16 'known (let ([g (lambda ()
  1144. (letrec ([f (lambda (x)
  1145. (let ([y x])
  1146. (set! x 7)
  1147. (+ y 5)))])
  1148. (f 11)))])
  1149. (g)))
  1150. ; Known local non-function
  1151. (error-test #'(apply (lambda () (let ([f 12]) (f))) null) exn:application:type?)
  1152. ; Known local with revsed arguments:
  1153. (test 10 (letrec ([f (lambda (a b) (if (zero? a) b (f b a)))]) f) 10 0)
  1154. (syntax-test #'#%datum)
  1155. (syntax-test #'(let ([#%datum 5])
  1156. 1))
  1157. (test '(1) '#%datum (#%datum 1))
  1158. (test 1 '#%datum (#%datum . 1))
  1159. (test 'a '#%datum (#%datum . a))
  1160. (syntax-test #'#%app)
  1161. (syntax-test #'(#%app . 1))
  1162. (syntax-test #'(#%app 2 . 1))
  1163. (syntax-test #'(#%app lambda 1))
  1164. (syntax-test #'(let ([#%app 5])
  1165. (+ 1 2)))
  1166. (test 3 '#%app (#%app + 1 2))
  1167. (syntax-test #'())
  1168. (syntax-test #'(#%app))
  1169. (syntax-test #'#%top)
  1170. (syntax-test #'(#%top 1))
  1171. (syntax-test #'(let ([#%top 5])
  1172. x))
  1173. (err/rt-test (#%top . lambda) exn:fail:contract:variable?)
  1174. (define x 5)
  1175. (test 5 '#%top (#%top . x))
  1176. ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1177. ;; Tests related to bytecode optimizer.
  1178. ;; The (if (let ([x M]) (if x x N)) ...)
  1179. ;; => (if (if M #t N) ...)
  1180. ;; converter drops the variable `x', which means
  1181. ;; that other mappings must adjust
  1182. (let ([val 0])
  1183. (let ([g (lambda ()
  1184. (letrec ([f (lambda (z x)
  1185. (if (let ([w (even? 81)])
  1186. (if w
  1187. w
  1188. (let ([y x])
  1189. (set! x 7)
  1190. (set! val (+ y 5)))))
  1191. 'yes
  1192. 'no))])
  1193. (f 0 11)))])
  1194. (g))
  1195. (test 16 values val))
  1196. (let ([val 0])
  1197. (let ([g (lambda ()
  1198. (letrec ([f (lambda (z x)
  1199. (if (let ([w (even? 81)])
  1200. (if w
  1201. w
  1202. (let ([y x])
  1203. (set! val (+ y 5)))))
  1204. 'yes
  1205. 'no))])
  1206. (f 0 11)))])
  1207. (g))
  1208. (test 16 values val))
  1209. ;; Function-inline test where (h (g v 10)) involves two inlines:
  1210. (letrec ([f (lambda (x) (h (g v 10)))]
  1211. [h (lambda (x) (list x x))]
  1212. [g (lambda (a b) a)]
  1213. [v (list 'hello)]
  1214. [w (list 'no!)])
  1215. (test '((hello) (hello)) f 10))
  1216. ;; Inlining introduces a let binding that is immediately dropped:
  1217. (test '(1 . 2)
  1218. (let ([x (cons 1 2)]) (let ([f (lambda (x) x)]) (f (lambda (y) x))))
  1219. 10)
  1220. ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1221. ;; Check #%top-interaction
  1222. (module quoting-top-interaction racket/base
  1223. (require (for-syntax racket/base))
  1224. (provide (except-out (all-from-out racket/base) #%top-interaction)
  1225. (rename-out [top-interaction #%top-interaction]))
  1226. (define-syntax top-interaction
  1227. (syntax-rules ()
  1228. [(_ . e) (quote e)])))
  1229. (dynamic-require ''quoting-top-interaction #f)
  1230. (let ([ns (make-empty-namespace)])
  1231. (namespace-attach-module (current-namespace) ''quoting-top-interaction ns)
  1232. (parameterize ([current-namespace ns])
  1233. (namespace-require ''quoting-top-interaction))
  1234. (test 3 'non-top
  1235. (parameterize ([current-namespace ns])
  1236. (eval '(+ 1 2))))
  1237. (test ''(+ 1 2) 'repl-top
  1238. (let ([s (open-output-bytes)])
  1239. (parameterize ([current-input-port (open-input-string "(+ 1 2)")]
  1240. [current-namespace ns]
  1241. [current-output-port s])
  1242. (read-eval-print-loop))
  1243. (let ([p (open-input-bytes (get-output-bytes s))])
  1244. (read p)
  1245. (read p))))
  1246. (let ([tmp-file (make-temporary-file)])
  1247. (let-values ([(base tmp1 mbd?) (split-path tmp-file)])
  1248. (with-output-to-file tmp-file (lambda () (display '(+ 1 2))) #:exists 'truncate/replace)
  1249. (test '(+ 1 2) 'repl-top
  1250. (parameterize ([current-namespace ns])
  1251. (load tmp-file)))
  1252. (with-output-to-file tmp-file (lambda () (display `(module ,tmp1 racket/base (provide x) (define x 12))))
  1253. #:exists 'truncate/replace)
  1254. (test 12 'module
  1255. (parameterize ([current-namespace ns])
  1256. (dynamic-require tmp-file 'x)))
  1257. (delete-file tmp-file))))
  1258. ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1259. ;; Check that locations for lambda arguments are created
  1260. ;; one-by-one --- like `let*', and not like `letrec':
  1261. (test '((1 10) (x1 10) (x2 z1))
  1262. 'lambda-loc
  1263. (let ()
  1264. (define procs null)
  1265. (define again #f)
  1266. (define (f x
  1267. [y (let/cc k
  1268. (unless again
  1269. (set! again k))
  1270. (lambda () 'done))]
  1271. [z 10])
  1272. (set! procs
  1273. (cons (lambda (xv zv)
  1274. (begin0
  1275. (list x z)
  1276. (set! x xv)
  1277. (set! z zv)))
  1278. procs))
  1279. (y))
  1280. (f 1)
  1281. (let/cc esc (again esc))
  1282. (list
  1283. ((cadr procs) 'x1 'z1)
  1284. ((car procs) 'x2 'z2)
  1285. ((cadr procs) 'x10 'z10))))
  1286. ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1287. (require racket/splicing)
  1288. (define abcdefg 10)
  1289. (test 12 'splicing-letrec-syntax (splicing-letrec-syntax ([abcdefg (syntax-rules ()
  1290. [(_) 12])])
  1291. (abcdefg)))
  1292. (test 13 'splicing-letrec-syntax (splicing-letrec-syntax ([abcdefg (syntax-rules ()
  1293. [(_) (abcdefg 10)]
  1294. [(_ x) (+ 3 x)])])
  1295. (abcdefg)))
  1296. (test 13 'splicing-letrec-syntax (let ([abcdefg 9])
  1297. (splicing-letrec-syntax ([abcdefg (syntax-rules ()
  1298. [(_) (abcdefg 10)]
  1299. [(_ x) (+ 3 x)])])
  1300. (abcdefg))))
  1301. (test 12 'splicing-let-syntax (splicing-let-syntax ([abcdefg (syntax-rules ()
  1302. [(_) 12])])
  1303. (abcdefg)))
  1304. (test 12 'splicing-let-syntax (let ([abcdefg (lambda () 9)])
  1305. (splicing-let-syntax ([abcdefg (syntax-rules ()
  1306. [(_) 12])])
  1307. (abcdefg))))
  1308. (test 11 'splicing-let-syntax (let ([abcdefg (lambda (x) x)])
  1309. (splicing-let-syntax ([abcdefg (syntax-rules ()
  1310. [(_) (+ 2 (abcdefg 9))]
  1311. [(_ ?) 77])])
  1312. (abcdefg))))
  1313. (define expand-test-use-toplevel? #t)
  1314. (splicing-let-syntax ([abcdefg (syntax-rules ()
  1315. [(_) 8])])
  1316. (define hijklmn (abcdefg)))
  1317. (define expand-test-use-toplevel? #f)
  1318. (test 8 'hijklmn hijklmn)
  1319. (test 30 'local-hijklmn (let ()
  1320. (splicing-let-syntax ([abcdefg (syntax-rules ()
  1321. [(_) 8])])
  1322. (define hijklmn (abcdefg)))
  1323. (define other 22)
  1324. (+ other hijklmn)))
  1325. (test 8 'local-hijklmn (let ()
  1326. (splicing-let-syntax ([abcdefg (syntax-rules ()
  1327. [(_) 8])])
  1328. (begin
  1329. (define hijklmn (abcdefg))
  1330. hijklmn))))
  1331. (test 9 'splicing-letrec-syntax (let ([abcdefg (lambda () 9)])
  1332. (splicing-letrec-syntax ([abcdefg (syntax-rules ()
  1333. [(_) 0])])
  1334. (define x 10))
  1335. (abcdefg)))
  1336. ;; ----------------------------------------
  1337. (test 79 'splicing-let (let ()
  1338. (splicing-let ([x 79])
  1339. (define (y) x))
  1340. (y)))
  1341. (test 77 'splicing-let (let ()
  1342. (define q 77)
  1343. (splicing-let ([q 8]
  1344. [x q])
  1345. (define (z) x))
  1346. (z)))
  1347. (test 81 'splicing-letrec (let ()
  1348. (define q 77)
  1349. (splicing-letrec ([q 81]
  1350. [x q])
  1351. (define (z) x))
  1352. (z)))
  1353. (test 82 'splicing-letrec (let ()
  1354. (define q 77)
  1355. (splicing-letrec ([x (lambda () (q))]
  1356. [q (lambda () 82)])
  1357. (define (z) x))
  1358. ((z))))
  1359. (test 81 'splicing-letrec (eval
  1360. '(begin
  1361. (define q 77)
  1362. (splicing-letrec ([q 81]
  1363. [x q])
  1364. (define (z) x))
  1365. (z))))
  1366. (test 82 'splicing-letrec (eval
  1367. '(begin
  1368. (define q 77)
  1369. (splicing-letrec ([x (lambda () (q))]
  1370. [q (lambda () 82)])
  1371. (define (z) x))
  1372. ((z)))))
  1373. (err/rt-test (eval
  1374. '(begin
  1375. (splicing-letrec ([x q]
  1376. [q 81])
  1377. x)))
  1378. exn:fail:contract:variable?)
  1379. (test 82 'splicing-letrec-syntaxes+values
  1380. (let ()
  1381. (define q 77)
  1382. (splicing-letrec-syntaxes+values
  1383. ([(mx) (lambda (stx) (quote-syntax (x)))]
  1384. [(m) (lambda (stx) (quote-syntax (mx)))])
  1385. ([(x) (lambda () (q))]
  1386. [(q) (lambda () 82)])
  1387. (define (a) (m)))
  1388. (a)))
  1389. (test 82 'splicing-letrec-syntaxes+values
  1390. (eval
  1391. '(begin
  1392. (define q 77)
  1393. (splicing-letrec-syntaxes+values
  1394. ([(mx) (lambda (stx) (quote-syntax (x)))]
  1395. [(m) (lambda (stx) (quote-syntax (mx)))])
  1396. ([(x) (lambda () (q))]
  1397. [(q) (lambda () 82)])
  1398. (define (a) (m)))
  1399. (a))))
  1400. (test 82 'splicing-local
  1401. (let ()
  1402. (define (x) q)
  1403. (define q 77)
  1404. (define-syntax (m stx) (quote-syntax (x)))
  1405. (splicing-local
  1406. [(define-syntax (m stx) (quote-syntax (mx)))
  1407. (define (x) (q))
  1408. (define-syntax (mx stx) (quote-syntax (x)))
  1409. (define (q) 82)]
  1410. (define (a) (m)))
  1411. (a)))
  1412. (test 82 'splicing-local
  1413. (eval
  1414. '(begin
  1415. (define (x) q)
  1416. (define q 77)
  1417. (define-syntax (m stx) (quote-syntax (x)))
  1418. (splicing-local
  1419. [(define-syntax (m stx) (quote-syntax (mx)))
  1420. (define (x) (q))
  1421. (define-syntax (mx stx) (quote-syntax (x)))
  1422. (define (q) 82)]
  1423. (define (a) (m)))
  1424. (a))))
  1425. ;; local names are not visible outside
  1426. (test 77 'splicing-local
  1427. (let ()
  1428. (define q 77)
  1429. (define-syntax (m stx) (quote-syntax (x)))
  1430. (splicing-local
  1431. [(define-syntax (m stx) (quote-syntax (q)))
  1432. (define (q) 82)]
  1433. (define (a) (m)))
  1434. (m)))
  1435. (test 77 'splicing-local
  1436. (eval
  1437. '(begin
  1438. (define q 77)
  1439. (define-syntax (m stx) (quote-syntax (x)))
  1440. (splicing-local
  1441. [(define-syntax (m stx) (quote-syntax (q)))
  1442. (define (q) 82)]
  1443. (define (a) (m)))
  1444. (m))))
  1445. ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1446. ;; Check keyword & optionals for define-syntax
  1447. ;; and define-syntax-for-values:
  1448. (test (list 7 #f)
  1449. 'dfs/kw
  1450. (eval
  1451. '(begin
  1452. (define-for-syntax (kw/f #:x a b)
  1453. `(list ,a ,b))
  1454. (define-syntax (kw/g stx #:opt [opt #f])
  1455. (syntax-case stx ()
  1456. [(_ v) (datum->syntax stx (kw/f #:x #'v opt))]))
  1457. (kw/g 7))))
  1458. ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1459. ;; Check mutation of local define-for-syntax in let-syntax:
  1460. (module set-local-dfs racket/base
  1461. (require (for-syntax racket/base))
  1462. (provide ten)
  1463. (define-for-syntax tl-var 9)
  1464. (define ten
  1465. (let-syntax ([x1 (lambda (stx)
  1466. (set! tl-var (add1 tl-var))
  1467. (datum->syntax stx tl-var))])
  1468. (x1))))
  1469. (test 10 dynamic-require ''set-local-dfs 'ten)
  1470. ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1471. ;; Test single-result checking in `begin0':
  1472. (let ()
  1473. (define (twice x) (printf "ouch\n") (values x x))
  1474. (define (pipeline2 . rfuns)
  1475. (let ([x (begin0 ((car rfuns) 1) 123)])
  1476. x))
  1477. (define (try f)
  1478. (call-with-values
  1479. (lambda () (with-handlers ([void values]) (f twice)))
  1480. (lambda xs xs)))
  1481. (test #t exn? (caar (map try (list pipeline2)))))
  1482. ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1483. ;; Semantics of internal definitions != R5RS
  1484. (test 0 'racket-int-def (call-with-continuation-prompt
  1485. (lambda ()
  1486. (let ([v 0]
  1487. [k #f]
  1488. [q void])
  1489. (define f (let/cc _k (set! k _k)))
  1490. (define g v) ; fresh location each evaluation
  1491. (if f
  1492. (begin
  1493. (set! q (lambda () g))
  1494. (set! v 1)
  1495. (k #f))
  1496. (q))))))
  1497. (test 1 'racket-int-def (call-with-continuation-prompt
  1498. (lambda ()
  1499. (let ([v 0]
  1500. [k #f]
  1501. [q void])
  1502. (#%stratified-body
  1503. (define f (let/cc _k (set! k _k)))
  1504. (define g v) ; same location both evaluations
  1505. (if f
  1506. (begin
  1507. (set! q (lambda () g))
  1508. (set! v 1)
  1509. (k #f))
  1510. (q)))))))
  1511. ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1512. ;; check that the compiler is not too agressive with `letrec' -> `let*'
  1513. (test "#<undefined>\nready\n"
  1514. get-output-string
  1515. (let ([p (open-output-string)])
  1516. (parameterize ([current-output-port p])
  1517. (let ([restart void])
  1518. (letrec ([dummy1 (let/cc k (set! restart k))]
  1519. [dummy2 (displayln maybe-ready)]
  1520. [maybe-ready 'ready])
  1521. (let ([rs restart])
  1522. (set! restart void)
  1523. (rs #f)))))
  1524. p))
  1525. ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1526. ;; Check that `syntax/loc' preserves the 'parent-shape property
  1527. (test #\[ syntax-property (syntax/loc #'a [b c]) 'paren-shape)
  1528. ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1529. ;; Check that inlining expansion of keyword-argument calls
  1530. ;; attaches 'alias-of and 'converted-arguments-variant-of
  1531. ;; syntax properties:
  1532. (parameterize ([current-namespace (make-base-namespace)])
  1533. (eval '(require (for-syntax racket/base
  1534. racket/keyword-transform)))
  1535. (eval '(module m racket/base (provide f) (define (f #:x [x 2]) x)))
  1536. (eval '(require 'm))
  1537. (eval '(define-syntax (extract stx)
  1538. (syntax-case stx ()
  1539. [(_ form pattern var alias?)
  1540. (with-syntax ([e (local-expand #'form 'top-level '())])
  1541. #'(let-syntax ([m (lambda (stx)
  1542. (syntax-case (quote-syntax e) ()
  1543. [pattern
  1544. #`(quote-syntax (var
  1545. .
  1546. #,((if alias?
  1547. syntax-procedure-alias-property
  1548. syntax-procedure-converted-arguments-property)
  1549. #'var)))]))])
  1550. (define p (m))
  1551. (and (free-identifier=? (car (syntax-e p))
  1552. (cdr (syntax-e (cdr (syntax-e p)))))
  1553. (car (syntax-e (cdr (syntax-e p)))))))])))
  1554. (define f-id (eval '(quote-syntax f)))
  1555. (test
  1556. #t
  1557. free-identifier=?
  1558. f-id
  1559. (eval '(extract (f #:x 8)
  1560. (lv ([(proc) f2] . _) (if const? (app f3 . _) . _))
  1561. f3
  1562. #f)))
  1563. (test
  1564. #t
  1565. free-identifier=?
  1566. f-id
  1567. (eval '(extract (f #:x 8)
  1568. (lv ([(proc) f2] . _) (if const? (app f3 . _) . _))
  1569. f2
  1570. #t)))
  1571. (test
  1572. #t
  1573. free-identifier=?
  1574. f-id
  1575. (eval '(extract (f #:y 9)
  1576. (lv ([(proc) f2] . _) . _)
  1577. f2
  1578. #t)))
  1579. (test
  1580. #t
  1581. free-identifier=?
  1582. f-id
  1583. (eval '(extract f f2 f2 #t))))
  1584. ;; Check that alias & converted-argument information is
  1585. ;; cross-phase:
  1586. (require racket/keyword-transform)
  1587. (let ([e (parameterize ([current-namespace (make-base-namespace)])
  1588. (expand '(module m racket/base
  1589. (define (f #:x [x 10]) x)
  1590. (f #:x 8))))])
  1591. (define (find get)
  1592. (let loop ([e e])
  1593. (or (and (syntax? e)
  1594. (or (get e)
  1595. (loop (syntax-e e))))
  1596. (and (pair? e)
  1597. (or (loop (car e))
  1598. (loop (cdr e)))))))
  1599. (test #t 'cross-phase-alias
  1600. (and (find syntax-procedure-converted-arguments-property)
  1601. (find syntax-procedure-alias-property)
  1602. #t)))
  1603. ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1604. ;; Check interaction of marks, `rename-out', and `free-identifier=?'
  1605. (module check-free-eq-with-rename racket/base
  1606. (require (for-syntax racket/base))
  1607. (provide (rename-out [prefix:quote quote])
  1608. check)
  1609. (define-syntax (check stx)
  1610. (syntax-case stx ()
  1611. [(_ id) #`#,(free-identifier=? #'id #'prefix:quote)]))
  1612. (define-syntax-rule (prefix:quote x) (quote x)))
  1613. (module use-rename-checker racket/base
  1614. (define-syntax-rule (body)
  1615. (begin
  1616. (provide v)
  1617. (require 'check-free-eq-with-rename)
  1618. (define v (check quote))))
  1619. (body))
  1620. (test #t dynamic-require ''use-rename-checker 'v)
  1621. ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1622. ;; Check `let` error messages
  1623. (syntax-test #'(let*) #rx"missing binding")
  1624. (syntax-test #'(let* ([x 10])) #rx"missing body")
  1625. (syntax-test #'(let) #rx"missing name or")
  1626. (syntax-test #'(let x) #rx"missing binding pairs or")
  1627. (syntax-test #'(let ([10 10])) #rx"missing binding pairs or")
  1628. (syntax-test #'(let x ([10 10])) #rx"missing body")
  1629. (syntax-test #'(letrec) #rx"missing binding")
  1630. (syntax-test #'(letrec ([x 3])) #rx"missing body")
  1631. ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1632. ;; Check that expansion generated for internal definitions
  1633. ;; introduces `values' and `begin' as if by macros:
  1634. (let ()
  1635. (define (int-def-check)
  1636. (define (values) (error 'hygiene "is broken"))
  1637. 1 ; expansion uses `values' and `begin'
  1638. (define x 2)
  1639. 3)
  1640. (test 3 int-def-check)
  1641. (define (int-def-check2)
  1642. (define (begin) (error 'hygiene "is broken"))
  1643. 1
  1644. (define x 2)
  1645. 30)
  1646. (test 30 int-def-check2))
  1647. ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1648. ;; Make sure `#%variable-reference' can be compiled and expanded
  1649. (compile '(#%variable-reference))
  1650. (expand '(#%variable-reference))
  1651. ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1652. ;; Check marshal & unmarshal of a syntax object
  1653. ;; containing a list with a hash table
  1654. (let ([v #'(quote-syntax (#hash((1 . 2))))])
  1655. (define-values (i o) (make-pipe))
  1656. (write (compile v) o)
  1657. (close-output-port o)
  1658. (define e
  1659. (parameterize ([read-accept-compiled #t])
  1660. (read i)))
  1661. (test (syntax->datum (eval v)) syntax->datum (eval e)))
  1662. ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1663. (report-errs)