syntax.test 43 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564
  1. ;;;; syntax.test --- test suite for Guile's syntactic forms -*- scheme -*-
  2. ;;;;
  3. ;;;; Copyright (C) 2001, 2003, 2004, 2005, 2006, 2009, 2010,
  4. ;;;; 2011, 2012, 2013, 2014 Free Software Foundation, Inc.
  5. ;;;;
  6. ;;;; This library is free software; you can redistribute it and/or
  7. ;;;; modify it under the terms of the GNU Lesser General Public
  8. ;;;; License as published by the Free Software Foundation; either
  9. ;;;; version 3 of the License, or (at your option) any later version.
  10. ;;;;
  11. ;;;; This library is distributed in the hope that it will be useful,
  12. ;;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. ;;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  14. ;;;; Lesser General Public License for more details.
  15. ;;;;
  16. ;;;; You should have received a copy of the GNU Lesser General Public
  17. ;;;; License along with this library; if not, write to the Free Software
  18. ;;;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  19. (define-module (test-suite test-syntax)
  20. #:use-module (ice-9 regex)
  21. #:use-module (ice-9 local-eval)
  22. #:use-module (test-suite lib))
  23. (define exception:generic-syncase-error
  24. "source expression failed to match")
  25. (define exception:unexpected-syntax
  26. "unexpected syntax")
  27. (define exception:bad-expression
  28. "Bad expression")
  29. (define exception:missing/extra-expr
  30. "Missing or extra expression")
  31. (define exception:missing-expr
  32. "Missing expression")
  33. (define exception:missing-body-expr
  34. "no expressions in body")
  35. (define exception:extra-expr
  36. "Extra expression")
  37. (define exception:illegal-empty-combination
  38. "Illegal empty combination")
  39. (define exception:bad-lambda
  40. "bad lambda")
  41. (define exception:bad-let
  42. "bad let$")
  43. (define exception:bad-letrec
  44. "bad letrec$")
  45. (define exception:bad-letrec*
  46. "bad letrec\\*$")
  47. (define exception:bad-set!
  48. "bad set!")
  49. (define exception:bad-quote
  50. '(quote . "bad syntax"))
  51. (define exception:bad-bindings
  52. "Bad bindings")
  53. (define exception:bad-binding
  54. "Bad binding")
  55. (define exception:duplicate-binding
  56. "duplicate bound variable")
  57. (define exception:bad-body
  58. "^bad body")
  59. (define exception:bad-formals
  60. "invalid argument list")
  61. (define exception:bad-formal
  62. "Bad formal")
  63. (define exception:duplicate-formals
  64. "duplicate identifier in argument list")
  65. (define exception:missing-clauses
  66. "Missing clauses")
  67. (define exception:misplaced-else-clause
  68. "Misplaced else clause")
  69. (define exception:bad-case-clause
  70. "Bad case clause")
  71. (define exception:bad-case-labels
  72. "Bad case labels")
  73. (define exception:bad-cond-clause
  74. "Bad cond clause")
  75. (define exception:too-many-args
  76. "too many arguments")
  77. (define exception:zero-expression-sequence
  78. "sequence of zero expressions")
  79. (define exception:define-values-wrong-number-of-return-values
  80. (cons 'wrong-number-of-args "^define-values: wrong number of return values returned by expression"))
  81. ;; (put 'pass-if-syntax-error 'scheme-indent-function 1)
  82. (define-syntax pass-if-syntax-error
  83. (syntax-rules ()
  84. ((_ name pat exp)
  85. (pass-if name
  86. (catch 'syntax-error
  87. (lambda () exp (error "expected syntax-error exception"))
  88. (lambda (k who what where form . maybe-subform)
  89. (if (if (pair? pat)
  90. (and (eq? who (car pat))
  91. (string-match (cdr pat) what))
  92. (string-match pat what))
  93. #t
  94. (error "unexpected syntax-error exception" what pat))))))))
  95. (with-test-prefix "expressions"
  96. (with-test-prefix "Bad argument list"
  97. (pass-if-syntax-error "improper argument list of length 1"
  98. exception:generic-syncase-error
  99. (eval '(let ((foo (lambda (x y) #t)))
  100. (foo . 1))
  101. (interaction-environment)))
  102. (pass-if-syntax-error "improper argument list of length 2"
  103. exception:generic-syncase-error
  104. (eval '(let ((foo (lambda (x y) #t)))
  105. (foo 1 . 2))
  106. (interaction-environment))))
  107. (with-test-prefix "missing or extra expression"
  108. ;; R5RS says:
  109. ;; *Note:* In many dialects of Lisp, the empty combination, (),
  110. ;; is a legitimate expression. In Scheme, combinations must
  111. ;; have at least one subexpression, so () is not a syntactically
  112. ;; valid expression.
  113. ;; Fixed on 2001-3-3
  114. (pass-if-syntax-error "empty parentheses \"()\""
  115. exception:unexpected-syntax
  116. (eval '()
  117. (interaction-environment)))))
  118. (with-test-prefix "quote"
  119. #t)
  120. (with-test-prefix "quasiquote"
  121. (with-test-prefix "unquote"
  122. (pass-if "repeated execution"
  123. (let ((foo (let ((i 0)) (lambda () (set! i (+ i 1)) `(,i)))))
  124. (and (equal? (foo) '(1)) (equal? (foo) '(2))))))
  125. (with-test-prefix "unquote-splicing"
  126. (pass-if "extra arguments"
  127. (equal? (eval '(quasiquote ((unquote-splicing (list 1 2) (list 3 4))))
  128. (interaction-environment))
  129. '(1 2 3 4)))))
  130. (with-test-prefix "begin"
  131. (pass-if "valid (begin)"
  132. (eval '(begin (begin) #t) (interaction-environment)))
  133. (if (not (include-deprecated-features))
  134. (pass-if-syntax-error "invalid (begin)"
  135. exception:zero-expression-sequence
  136. (eval '(begin (if #t (begin)) #t) (interaction-environment)))))
  137. (define-syntax matches?
  138. (syntax-rules (<>)
  139. ((_ (op arg ...) pat) (let ((x (op arg ...)))
  140. (matches? x pat)))
  141. ((_ x ()) (null? x))
  142. ((_ x (a . b)) (and (pair? x)
  143. (matches? (car x) a)
  144. (matches? (cdr x) b)))
  145. ((_ x <>) #t)
  146. ((_ x pat) (equal? x 'pat))))
  147. (with-test-prefix "lambda"
  148. (with-test-prefix "bad formals"
  149. (pass-if-syntax-error "(lambda)"
  150. exception:bad-lambda
  151. (eval '(lambda)
  152. (interaction-environment)))
  153. (pass-if-syntax-error "(lambda . \"foo\")"
  154. exception:bad-lambda
  155. (eval '(lambda . "foo")
  156. (interaction-environment)))
  157. (pass-if-syntax-error "(lambda \"foo\")"
  158. exception:bad-lambda
  159. (eval '(lambda "foo")
  160. (interaction-environment)))
  161. (pass-if-syntax-error "(lambda \"foo\" #f)"
  162. exception:bad-formals
  163. (eval '(lambda "foo" #f)
  164. (interaction-environment)))
  165. (pass-if-syntax-error "(lambda (x 1) 2)"
  166. exception:bad-formals
  167. (eval '(lambda (x 1) 2)
  168. (interaction-environment)))
  169. (pass-if-syntax-error "(lambda (1 x) 2)"
  170. exception:bad-formals
  171. (eval '(lambda (1 x) 2)
  172. (interaction-environment)))
  173. (pass-if-syntax-error "(lambda (x \"a\") 2)"
  174. exception:bad-formals
  175. (eval '(lambda (x "a") 2)
  176. (interaction-environment)))
  177. (pass-if-syntax-error "(lambda (\"a\" x) 2)"
  178. exception:bad-formals
  179. (eval '(lambda ("a" x) 2)
  180. (interaction-environment))))
  181. (with-test-prefix "duplicate formals"
  182. ;; Fixed on 2001-3-3
  183. (pass-if-syntax-error "(lambda (x x) 1)"
  184. exception:duplicate-formals
  185. (eval '(lambda (x x) 1)
  186. (interaction-environment)))
  187. ;; Fixed on 2001-3-3
  188. (pass-if-syntax-error "(lambda (x x x) 1)"
  189. exception:duplicate-formals
  190. (eval '(lambda (x x x) 1)
  191. (interaction-environment))))
  192. (with-test-prefix "bad body"
  193. (pass-if-syntax-error "(lambda ())"
  194. exception:bad-lambda
  195. (eval '(lambda ())
  196. (interaction-environment)))))
  197. (with-test-prefix "let"
  198. (with-test-prefix "bindings"
  199. (pass-if-exception "late binding"
  200. exception:unbound-var
  201. (let ((x 1) (y x)) y)))
  202. (with-test-prefix "bad bindings"
  203. (pass-if-syntax-error "(let)"
  204. exception:bad-let
  205. (eval '(let)
  206. (interaction-environment)))
  207. (pass-if-syntax-error "(let 1)"
  208. exception:bad-let
  209. (eval '(let 1)
  210. (interaction-environment)))
  211. (pass-if-syntax-error "(let (x))"
  212. exception:bad-let
  213. (eval '(let (x))
  214. (interaction-environment)))
  215. (pass-if-syntax-error "(let ((x)))"
  216. exception:bad-let
  217. (eval '(let ((x)))
  218. (interaction-environment)))
  219. (pass-if-syntax-error "(let (x) 1)"
  220. exception:bad-let
  221. (eval '(let (x) 1)
  222. (interaction-environment)))
  223. (pass-if-syntax-error "(let ((x)) 3)"
  224. exception:bad-let
  225. (eval '(let ((x)) 3)
  226. (interaction-environment)))
  227. (pass-if-syntax-error "(let ((x 1) y) x)"
  228. exception:bad-let
  229. (eval '(let ((x 1) y) x)
  230. (interaction-environment)))
  231. (pass-if-syntax-error "(let ((1 2)) 3)"
  232. exception:bad-let
  233. (eval '(let ((1 2)) 3)
  234. (interaction-environment))))
  235. (with-test-prefix "duplicate bindings"
  236. (pass-if-syntax-error "(let ((x 1) (x 2)) x)"
  237. exception:duplicate-binding
  238. (eval '(let ((x 1) (x 2)) x)
  239. (interaction-environment))))
  240. (with-test-prefix "bad body"
  241. (pass-if-syntax-error "(let ())"
  242. exception:bad-let
  243. (eval '(let ())
  244. (interaction-environment)))
  245. (pass-if-syntax-error "(let ((x 1)))"
  246. exception:bad-let
  247. (eval '(let ((x 1)))
  248. (interaction-environment)))))
  249. (with-test-prefix "named let"
  250. (with-test-prefix "initializers"
  251. (pass-if "evaluated in outer environment"
  252. (let ((f -))
  253. (eqv? (let f ((n (f 1))) n) -1))))
  254. (with-test-prefix "bad bindings"
  255. (pass-if-syntax-error "(let x (y))"
  256. exception:bad-let
  257. (eval '(let x (y))
  258. (interaction-environment))))
  259. (with-test-prefix "bad body"
  260. (pass-if-syntax-error "(let x ())"
  261. exception:bad-let
  262. (eval '(let x ())
  263. (interaction-environment)))
  264. (pass-if-syntax-error "(let x ((y 1)))"
  265. exception:bad-let
  266. (eval '(let x ((y 1)))
  267. (interaction-environment)))))
  268. (with-test-prefix "let*"
  269. (with-test-prefix "bindings"
  270. (pass-if "(let* ((x 1) (x 2)) ...)"
  271. (let* ((x 1) (x 2))
  272. (= x 2)))
  273. (pass-if "(let* ((x 1) (x x)) ...)"
  274. (let* ((x 1) (x x))
  275. (= x 1)))
  276. (pass-if "(let ((x 1) (y 2)) (let* () ...))"
  277. (let ((x 1) (y 2))
  278. (let* ()
  279. (and (= x 1) (= y 2))))))
  280. (with-test-prefix "bad bindings"
  281. (pass-if-syntax-error "(let*)"
  282. exception:generic-syncase-error
  283. (eval '(let*)
  284. (interaction-environment)))
  285. (pass-if-syntax-error "(let* 1)"
  286. exception:generic-syncase-error
  287. (eval '(let* 1)
  288. (interaction-environment)))
  289. (pass-if-syntax-error "(let* (x))"
  290. exception:generic-syncase-error
  291. (eval '(let* (x))
  292. (interaction-environment)))
  293. (pass-if-syntax-error "(let* (x) 1)"
  294. exception:generic-syncase-error
  295. (eval '(let* (x) 1)
  296. (interaction-environment)))
  297. (pass-if-syntax-error "(let* ((x)) 3)"
  298. exception:generic-syncase-error
  299. (eval '(let* ((x)) 3)
  300. (interaction-environment)))
  301. (pass-if-syntax-error "(let* ((x 1) y) x)"
  302. exception:generic-syncase-error
  303. (eval '(let* ((x 1) y) x)
  304. (interaction-environment)))
  305. (pass-if-syntax-error "(let* x ())"
  306. exception:generic-syncase-error
  307. (eval '(let* x ())
  308. (interaction-environment)))
  309. (pass-if-syntax-error "(let* x (y))"
  310. exception:generic-syncase-error
  311. (eval '(let* x (y))
  312. (interaction-environment)))
  313. (pass-if-syntax-error "(let* ((1 2)) 3)"
  314. exception:generic-syncase-error
  315. (eval '(let* ((1 2)) 3)
  316. (interaction-environment))))
  317. (with-test-prefix "bad body"
  318. (pass-if-syntax-error "(let* ())"
  319. exception:generic-syncase-error
  320. (eval '(let* ())
  321. (interaction-environment)))
  322. (pass-if-syntax-error "(let* ((x 1)))"
  323. exception:generic-syncase-error
  324. (eval '(let* ((x 1)))
  325. (interaction-environment)))))
  326. (with-test-prefix "letrec"
  327. (with-test-prefix "bindings"
  328. (pass-if-syntax-error "initial bindings are undefined"
  329. exception:used-before-defined
  330. (let ((x 1))
  331. ;; FIXME: the memoizer does initialize the var to undefined, but
  332. ;; the Scheme evaluator has no way of checking what's an
  333. ;; undefined value. Not sure how to do this.
  334. (throw 'unresolved)
  335. (letrec ((x 1) (y x)) y))))
  336. (with-test-prefix "bad bindings"
  337. (pass-if-syntax-error "(letrec)"
  338. exception:bad-letrec
  339. (eval '(letrec)
  340. (interaction-environment)))
  341. (pass-if-syntax-error "(letrec 1)"
  342. exception:bad-letrec
  343. (eval '(letrec 1)
  344. (interaction-environment)))
  345. (pass-if-syntax-error "(letrec (x))"
  346. exception:bad-letrec
  347. (eval '(letrec (x))
  348. (interaction-environment)))
  349. (pass-if-syntax-error "(letrec (x) 1)"
  350. exception:bad-letrec
  351. (eval '(letrec (x) 1)
  352. (interaction-environment)))
  353. (pass-if-syntax-error "(letrec ((x)) 3)"
  354. exception:bad-letrec
  355. (eval '(letrec ((x)) 3)
  356. (interaction-environment)))
  357. (pass-if-syntax-error "(letrec ((x 1) y) x)"
  358. exception:bad-letrec
  359. (eval '(letrec ((x 1) y) x)
  360. (interaction-environment)))
  361. (pass-if-syntax-error "(letrec x ())"
  362. exception:bad-letrec
  363. (eval '(letrec x ())
  364. (interaction-environment)))
  365. (pass-if-syntax-error "(letrec x (y))"
  366. exception:bad-letrec
  367. (eval '(letrec x (y))
  368. (interaction-environment)))
  369. (pass-if-syntax-error "(letrec ((1 2)) 3)"
  370. exception:bad-letrec
  371. (eval '(letrec ((1 2)) 3)
  372. (interaction-environment))))
  373. (with-test-prefix "duplicate bindings"
  374. (pass-if-syntax-error "(letrec ((x 1) (x 2)) x)"
  375. exception:duplicate-binding
  376. (eval '(letrec ((x 1) (x 2)) x)
  377. (interaction-environment))))
  378. (with-test-prefix "bad body"
  379. (pass-if-syntax-error "(letrec ())"
  380. exception:bad-letrec
  381. (eval '(letrec ())
  382. (interaction-environment)))
  383. (pass-if-syntax-error "(letrec ((x 1)))"
  384. exception:bad-letrec
  385. (eval '(letrec ((x 1)))
  386. (interaction-environment)))))
  387. (with-test-prefix "letrec*"
  388. (with-test-prefix "bindings"
  389. (pass-if-syntax-error "initial bindings are undefined"
  390. exception:used-before-defined
  391. (begin
  392. ;; FIXME: the memoizer does initialize the var to undefined, but
  393. ;; the Scheme evaluator has no way of checking what's an
  394. ;; undefined value. Not sure how to do this.
  395. (throw 'unresolved)
  396. (letrec* ((x y) (y 1)) y))))
  397. (with-test-prefix "bad bindings"
  398. (pass-if-syntax-error "(letrec*)"
  399. exception:bad-letrec*
  400. (eval '(letrec*)
  401. (interaction-environment)))
  402. (pass-if-syntax-error "(letrec* 1)"
  403. exception:bad-letrec*
  404. (eval '(letrec* 1)
  405. (interaction-environment)))
  406. (pass-if-syntax-error "(letrec* (x))"
  407. exception:bad-letrec*
  408. (eval '(letrec* (x))
  409. (interaction-environment)))
  410. (pass-if-syntax-error "(letrec* (x) 1)"
  411. exception:bad-letrec*
  412. (eval '(letrec* (x) 1)
  413. (interaction-environment)))
  414. (pass-if-syntax-error "(letrec* ((x)) 3)"
  415. exception:bad-letrec*
  416. (eval '(letrec* ((x)) 3)
  417. (interaction-environment)))
  418. (pass-if-syntax-error "(letrec* ((x 1) y) x)"
  419. exception:bad-letrec*
  420. (eval '(letrec* ((x 1) y) x)
  421. (interaction-environment)))
  422. (pass-if-syntax-error "(letrec* x ())"
  423. exception:bad-letrec*
  424. (eval '(letrec* x ())
  425. (interaction-environment)))
  426. (pass-if-syntax-error "(letrec* x (y))"
  427. exception:bad-letrec*
  428. (eval '(letrec* x (y))
  429. (interaction-environment)))
  430. (pass-if-syntax-error "(letrec* ((1 2)) 3)"
  431. exception:bad-letrec*
  432. (eval '(letrec* ((1 2)) 3)
  433. (interaction-environment))))
  434. (with-test-prefix "duplicate bindings"
  435. (pass-if-syntax-error "(letrec* ((x 1) (x 2)) x)"
  436. exception:duplicate-binding
  437. (eval '(letrec* ((x 1) (x 2)) x)
  438. (interaction-environment))))
  439. (with-test-prefix "bad body"
  440. (pass-if-syntax-error "(letrec* ())"
  441. exception:bad-letrec*
  442. (eval '(letrec* ())
  443. (interaction-environment)))
  444. (pass-if-syntax-error "(letrec* ((x 1)))"
  445. exception:bad-letrec*
  446. (eval '(letrec* ((x 1)))
  447. (interaction-environment))))
  448. (with-test-prefix "referencing previous values"
  449. (pass-if (equal? (letrec ((a (cons 'foo 'bar))
  450. (b a))
  451. b)
  452. '(foo . bar)))
  453. (pass-if (equal? (let ()
  454. (define a (cons 'foo 'bar))
  455. (define b a)
  456. b)
  457. '(foo . bar)))))
  458. (with-test-prefix "if"
  459. (with-test-prefix "missing or extra expressions"
  460. (pass-if-syntax-error "(if)"
  461. exception:generic-syncase-error
  462. (eval '(if)
  463. (interaction-environment)))
  464. (pass-if-syntax-error "(if 1 2 3 4)"
  465. exception:generic-syncase-error
  466. (eval '(if 1 2 3 4)
  467. (interaction-environment)))))
  468. (with-test-prefix "cond"
  469. (with-test-prefix "cond is hygienic"
  470. (pass-if "bound 'else is handled correctly"
  471. (eq? (let ((else 'ok)) (cond (else))) 'ok))
  472. (with-test-prefix "bound '=> is handled correctly"
  473. (pass-if "#t => 'ok"
  474. (let ((=> 'foo))
  475. (eq? (cond (#t => 'ok)) 'ok)))
  476. (pass-if "else =>"
  477. (let ((=> 'foo))
  478. (eq? (cond (else =>)) 'foo)))
  479. (pass-if "else => identity"
  480. (let ((=> 'foo))
  481. (eq? (cond (else => identity)) identity)))))
  482. (with-test-prefix "SRFI-61"
  483. (pass-if "always available"
  484. (cond-expand (srfi-61 #t) (else #f)))
  485. (pass-if "single value consequent"
  486. (eq? 'ok (cond (#t identity => (lambda (x) 'ok)) (else #f))))
  487. (pass-if "single value alternate"
  488. (eq? 'ok (cond (#t not => (lambda (x) #f)) (else 'ok))))
  489. (pass-if-exception "doesn't affect standard =>"
  490. exception:wrong-num-args
  491. (cond ((values 1 2) => (lambda (x y) #t))))
  492. (pass-if "multiple values consequent"
  493. (equal? '(2 1) (cond ((values 1 2)
  494. (lambda (one two)
  495. (and (= 1 one) (= 2 two))) =>
  496. (lambda (one two) (list two one)))
  497. (else #f))))
  498. (pass-if "multiple values alternate"
  499. (eq? 'ok (cond ((values 2 3 4)
  500. (lambda args (equal? '(1 2 3) args)) =>
  501. (lambda (x y z) #f))
  502. (else 'ok))))
  503. (pass-if "zero values"
  504. (eq? 'ok (cond ((values) (lambda () #t) => (lambda () 'ok))
  505. (else #f))))
  506. (pass-if "bound => is handled correctly"
  507. (let ((=> 'ok))
  508. (eq? 'ok (cond (#t identity =>) (else #f)))))
  509. (pass-if-syntax-error "missing recipient"
  510. '(cond . "wrong number of receiver expressions")
  511. (eval '(cond (#t identity =>))
  512. (interaction-environment)))
  513. (pass-if-syntax-error "extra recipient"
  514. '(cond . "wrong number of receiver expressions")
  515. (eval '(cond (#t identity => identity identity))
  516. (interaction-environment))))
  517. (with-test-prefix "bad or missing clauses"
  518. (pass-if-syntax-error "(cond)"
  519. exception:generic-syncase-error
  520. (eval '(cond)
  521. (interaction-environment)))
  522. (pass-if-syntax-error "(cond #t)"
  523. '(cond . "invalid clause")
  524. (eval '(cond #t)
  525. (interaction-environment)))
  526. (pass-if-syntax-error "(cond 1)"
  527. '(cond . "invalid clause")
  528. (eval '(cond 1)
  529. (interaction-environment)))
  530. (pass-if-syntax-error "(cond 1 2)"
  531. '(cond . "invalid clause")
  532. (eval '(cond 1 2)
  533. (interaction-environment)))
  534. (pass-if-syntax-error "(cond 1 2 3)"
  535. '(cond . "invalid clause")
  536. (eval '(cond 1 2 3)
  537. (interaction-environment)))
  538. (pass-if-syntax-error "(cond 1 2 3 4)"
  539. '(cond . "invalid clause")
  540. (eval '(cond 1 2 3 4)
  541. (interaction-environment)))
  542. (pass-if-syntax-error "(cond ())"
  543. '(cond . "invalid clause")
  544. (eval '(cond ())
  545. (interaction-environment)))
  546. (pass-if-syntax-error "(cond () 1)"
  547. '(cond . "invalid clause")
  548. (eval '(cond () 1)
  549. (interaction-environment)))
  550. (pass-if-syntax-error "(cond (1) 1)"
  551. '(cond . "invalid clause")
  552. (eval '(cond (1) 1)
  553. (interaction-environment)))
  554. (pass-if-syntax-error "(cond (else #f) (#t #t))"
  555. '(cond . "else must be the last clause")
  556. (eval '(cond (else #f) (#t #t))
  557. (interaction-environment))))
  558. (with-test-prefix "wrong number of arguments"
  559. (pass-if-exception "=> (lambda (x y) #t)"
  560. exception:wrong-num-args
  561. (cond (1 => (lambda (x y) #t))))))
  562. (with-test-prefix "case"
  563. (pass-if "clause with empty labels list"
  564. (case 1 (() #f) (else #t)))
  565. (with-test-prefix "case handles '=> correctly"
  566. (pass-if "(1 2 3) => list"
  567. (equal? (case 1 ((1 2 3) => list))
  568. '(1)))
  569. (pass-if "else => list"
  570. (equal? (case 6
  571. ((1 2 3) 'wrong)
  572. (else => list))
  573. '(6)))
  574. (with-test-prefix "bound '=> is handled correctly"
  575. (pass-if "(1) => 'ok"
  576. (let ((=> 'foo))
  577. (eq? (case 1 ((1) => 'ok)) 'ok)))
  578. (pass-if "else =>"
  579. (let ((=> 'foo))
  580. (eq? (case 1 (else =>)) 'foo)))
  581. (pass-if "else => list"
  582. (let ((=> 'foo))
  583. (eq? (case 1 (else => identity)) identity))))
  584. (pass-if-syntax-error "missing recipient"
  585. '(case . "wrong number of receiver expressions")
  586. (eval '(case 1 ((1) =>))
  587. (interaction-environment)))
  588. (pass-if-syntax-error "extra recipient"
  589. '(case . "wrong number of receiver expressions")
  590. (eval '(case 1 ((1) => identity identity))
  591. (interaction-environment))))
  592. (with-test-prefix "case is hygienic"
  593. (pass-if-syntax-error "bound 'else is handled correctly"
  594. '(case . "invalid clause")
  595. (eval '(let ((else #f)) (case 1 (else #f)))
  596. (interaction-environment))))
  597. (with-test-prefix "bad or missing clauses"
  598. (pass-if-syntax-error "(case)"
  599. exception:generic-syncase-error
  600. (eval '(case)
  601. (interaction-environment)))
  602. (pass-if-syntax-error "(case . \"foo\")"
  603. exception:generic-syncase-error
  604. (eval '(case . "foo")
  605. (interaction-environment)))
  606. (pass-if-syntax-error "(case 1)"
  607. exception:generic-syncase-error
  608. (eval '(case 1)
  609. (interaction-environment)))
  610. (pass-if-syntax-error "(case 1 . \"foo\")"
  611. exception:generic-syncase-error
  612. (eval '(case 1 . "foo")
  613. (interaction-environment)))
  614. (pass-if-syntax-error "(case 1 \"foo\")"
  615. '(case . "invalid clause")
  616. (eval '(case 1 "foo")
  617. (interaction-environment)))
  618. (pass-if-syntax-error "(case 1 ())"
  619. '(case . "invalid clause")
  620. (eval '(case 1 ())
  621. (interaction-environment)))
  622. (pass-if-syntax-error "(case 1 (\"foo\"))"
  623. '(case . "invalid clause")
  624. (eval '(case 1 ("foo"))
  625. (interaction-environment)))
  626. (pass-if-syntax-error "(case 1 (\"foo\" \"bar\"))"
  627. '(case . "invalid clause")
  628. (eval '(case 1 ("foo" "bar"))
  629. (interaction-environment)))
  630. (pass-if-syntax-error "(case 1 ((2) \"bar\") . \"foo\")"
  631. exception:generic-syncase-error
  632. (eval '(case 1 ((2) "bar") . "foo")
  633. (interaction-environment)))
  634. (pass-if-syntax-error "(case 1 ((2) \"bar\") (else))"
  635. '(case . "invalid clause")
  636. (eval '(case 1 ((2) "bar") (else))
  637. (interaction-environment)))
  638. (pass-if-syntax-error "(case 1 (else #f) . \"foo\")"
  639. exception:generic-syncase-error
  640. (eval '(case 1 (else #f) . "foo")
  641. (interaction-environment)))
  642. (pass-if-syntax-error "(case 1 (else #f) ((1) #t))"
  643. '(case . "else must be the last clause")
  644. (eval '(case 1 (else #f) ((1) #t))
  645. (interaction-environment)))))
  646. (with-test-prefix "top-level define"
  647. (pass-if "redefinition"
  648. (let ((m (make-module)))
  649. (beautify-user-module! m)
  650. ;; The previous value of `round' must still be visible at the time the
  651. ;; new `round' is defined. According to R5RS (Section 5.2.1), `define'
  652. ;; should behave like `set!' in this case (except that in the case of
  653. ;; Guile, we respect module boundaries).
  654. (eval '(define round round) m)
  655. (eq? (module-ref m 'round) round)))
  656. (with-test-prefix "missing or extra expressions"
  657. (pass-if-syntax-error "(define)"
  658. exception:generic-syncase-error
  659. (eval '(define)
  660. (interaction-environment)))))
  661. (with-test-prefix "internal define"
  662. (pass-if "internal defines become letrec"
  663. (eval '(let ((a identity) (b identity) (c identity))
  664. (define (a x) (if (= x 0) 'a (b (- x 1))))
  665. (define (b x) (if (= x 0) 'b (c (- x 1))))
  666. (define (c x) (if (= x 0) 'c (a (- x 1))))
  667. (and (eq? 'a (a 0) (a 3))
  668. (eq? 'b (a 1) (a 4))
  669. (eq? 'c (a 2) (a 5))))
  670. (interaction-environment)))
  671. (pass-if "binding is created before expression is evaluated"
  672. ;; Internal defines are equivalent to `letrec' (R5RS, Section 5.2.2).
  673. (= (eval '(let ()
  674. (define foo
  675. (begin
  676. (set! foo 1)
  677. (+ foo 1)))
  678. foo)
  679. (interaction-environment))
  680. 2))
  681. (pass-if "internal defines with begin"
  682. (false-if-exception
  683. (eval '(let ((a identity) (b identity) (c identity))
  684. (define (a x) (if (= x 0) 'a (b (- x 1))))
  685. (begin
  686. (define (b x) (if (= x 0) 'b (c (- x 1)))))
  687. (define (c x) (if (= x 0) 'c (a (- x 1))))
  688. (and (eq? 'a (a 0) (a 3))
  689. (eq? 'b (a 1) (a 4))
  690. (eq? 'c (a 2) (a 5))))
  691. (interaction-environment))))
  692. (pass-if "internal defines with empty begin"
  693. (false-if-exception
  694. (eval '(let ((a identity) (b identity) (c identity))
  695. (define (a x) (if (= x 0) 'a (b (- x 1))))
  696. (begin)
  697. (define (b x) (if (= x 0) 'b (c (- x 1))))
  698. (define (c x) (if (= x 0) 'c (a (- x 1))))
  699. (and (eq? 'a (a 0) (a 3))
  700. (eq? 'b (a 1) (a 4))
  701. (eq? 'c (a 2) (a 5))))
  702. (interaction-environment))))
  703. (pass-if "internal defines with macro application"
  704. (false-if-exception
  705. (eval '(begin
  706. (defmacro my-define forms
  707. (cons 'define forms))
  708. (let ((a identity) (b identity) (c identity))
  709. (define (a x) (if (= x 0) 'a (b (- x 1))))
  710. (my-define (b x) (if (= x 0) 'b (c (- x 1))))
  711. (define (c x) (if (= x 0) 'c (a (- x 1))))
  712. (and (eq? 'a (a 0) (a 3))
  713. (eq? 'b (a 1) (a 4))
  714. (eq? 'c (a 2) (a 5)))))
  715. (interaction-environment))))
  716. (pass-if-syntax-error "missing body expression"
  717. exception:missing-body-expr
  718. (eval '(let () (define x #t))
  719. (interaction-environment))))
  720. (with-test-prefix "top-level define-values"
  721. (pass-if "zero values"
  722. (eval '(begin (define-values () (values))
  723. #t)
  724. (interaction-environment)))
  725. (pass-if-equal "one value"
  726. 1
  727. (eval '(begin (define-values (x) 1)
  728. x)
  729. (interaction-environment)))
  730. (pass-if-equal "two values"
  731. '(2 3)
  732. (eval '(begin (define-values (x y) (values 2 3))
  733. (list x y))
  734. (interaction-environment)))
  735. (pass-if-equal "three values"
  736. '(4 5 6)
  737. (eval '(begin (define-values (x y z) (values 4 5 6))
  738. (list x y z))
  739. (interaction-environment)))
  740. (pass-if-equal "one value with tail"
  741. '(a (b c d))
  742. (eval '(begin (define-values (x . y) (values 'a 'b 'c 'd))
  743. (list x y))
  744. (interaction-environment)))
  745. (pass-if-equal "two values with tail"
  746. '(x y (z w))
  747. (eval '(begin (define-values (x y . z) (values 'x 'y 'z 'w))
  748. (list x y z))
  749. (interaction-environment)))
  750. (pass-if-equal "just tail"
  751. '(1 2 3)
  752. (eval '(begin (define-values x (values 1 2 3))
  753. x)
  754. (interaction-environment)))
  755. (pass-if-exception "expected 0 values, got 1"
  756. exception:define-values-wrong-number-of-return-values
  757. (eval '(define-values () 1)
  758. (interaction-environment)))
  759. (pass-if-exception "expected 1 value, got 0"
  760. exception:define-values-wrong-number-of-return-values
  761. (eval '(define-values (x) (values))
  762. (interaction-environment)))
  763. (pass-if-exception "expected 1 value, got 2"
  764. exception:define-values-wrong-number-of-return-values
  765. (eval '(define-values (x) (values 1 2))
  766. (interaction-environment)))
  767. (pass-if-exception "expected 1 value with tail, got 0"
  768. exception:define-values-wrong-number-of-return-values
  769. (eval '(define-values (x . y) (values))
  770. (interaction-environment)))
  771. (pass-if-exception "expected 2 value with tail, got 1"
  772. exception:define-values-wrong-number-of-return-values
  773. (eval '(define-values (x y . z) 1)
  774. (interaction-environment)))
  775. (pass-if "redefinition"
  776. (let ((m (make-module)))
  777. (beautify-user-module! m)
  778. ;; The previous values of `floor' and `round' must still be
  779. ;; visible at the time the new `floor' and `round' are defined.
  780. (eval '(define-values (floor round) (values floor round)) m)
  781. (and (eq? (module-ref m 'floor) floor)
  782. (eq? (module-ref m 'round) round))))
  783. (with-test-prefix "missing expression"
  784. (pass-if-syntax-error "(define-values)"
  785. exception:generic-syncase-error
  786. (eval '(define-values)
  787. (interaction-environment)))))
  788. (with-test-prefix "internal define-values"
  789. (pass-if "zero values"
  790. (let ()
  791. (define-values () (values))
  792. #t))
  793. (pass-if-equal "one value"
  794. 1
  795. (let ()
  796. (define-values (x) 1)
  797. x))
  798. (pass-if-equal "two values"
  799. '(2 3)
  800. (let ()
  801. (define-values (x y) (values 2 3))
  802. (list x y)))
  803. (pass-if-equal "three values"
  804. '(4 5 6)
  805. (let ()
  806. (define-values (x y z) (values 4 5 6))
  807. (list x y z)))
  808. (pass-if-equal "one value with tail"
  809. '(a (b c d))
  810. (let ()
  811. (define-values (x . y) (values 'a 'b 'c 'd))
  812. (list x y)))
  813. (pass-if-equal "two values with tail"
  814. '(x y (z w))
  815. (let ()
  816. (define-values (x y . z) (values 'x 'y 'z 'w))
  817. (list x y z)))
  818. (pass-if-equal "just tail"
  819. '(1 2 3)
  820. (let ()
  821. (define-values x (values 1 2 3))
  822. x))
  823. (pass-if-exception "expected 0 values, got 1"
  824. exception:define-values-wrong-number-of-return-values
  825. (eval '(let ()
  826. (define-values () 1)
  827. #f)
  828. (interaction-environment)))
  829. (pass-if-exception "expected 1 value, got 0"
  830. exception:define-values-wrong-number-of-return-values
  831. (eval '(let ()
  832. (define-values (x) (values))
  833. #f)
  834. (interaction-environment)))
  835. (pass-if-exception "expected 1 value, got 2"
  836. exception:define-values-wrong-number-of-return-values
  837. (eval '(let ()
  838. (define-values (x) (values 1 2))
  839. #f)
  840. (interaction-environment)))
  841. (pass-if-exception "expected 1 value with tail, got 0"
  842. exception:define-values-wrong-number-of-return-values
  843. (eval '(let ()
  844. (define-values (x . y) (values))
  845. #f)
  846. (interaction-environment)))
  847. (pass-if-exception "expected 2 value with tail, got 1"
  848. exception:define-values-wrong-number-of-return-values
  849. (eval '(let ()
  850. (define-values (x y . z) 1)
  851. #f)
  852. (interaction-environment)))
  853. (with-test-prefix "missing expression"
  854. (pass-if-syntax-error "(define-values)"
  855. exception:generic-syncase-error
  856. (eval '(let ()
  857. (define-values)
  858. #f)
  859. (interaction-environment)))))
  860. (with-test-prefix "set!"
  861. (with-test-prefix "missing or extra expressions"
  862. (pass-if-syntax-error "(set!)"
  863. exception:bad-set!
  864. (eval '(set!)
  865. (interaction-environment)))
  866. (pass-if-syntax-error "(set! 1)"
  867. exception:bad-set!
  868. (eval '(set! 1)
  869. (interaction-environment)))
  870. (pass-if-syntax-error "(set! 1 2 3)"
  871. exception:bad-set!
  872. (eval '(set! 1 2 3)
  873. (interaction-environment))))
  874. (with-test-prefix "bad variable"
  875. (pass-if-syntax-error "(set! \"\" #t)"
  876. exception:bad-set!
  877. (eval '(set! "" #t)
  878. (interaction-environment)))
  879. (pass-if-syntax-error "(set! 1 #t)"
  880. exception:bad-set!
  881. (eval '(set! 1 #t)
  882. (interaction-environment)))
  883. (pass-if-syntax-error "(set! #t #f)"
  884. exception:bad-set!
  885. (eval '(set! #t #f)
  886. (interaction-environment)))
  887. (pass-if-syntax-error "(set! #f #t)"
  888. exception:bad-set!
  889. (eval '(set! #f #t)
  890. (interaction-environment)))
  891. (pass-if-syntax-error "(set! #\\space #f)"
  892. exception:bad-set!
  893. (eval '(set! #\space #f)
  894. (interaction-environment)))))
  895. (with-test-prefix "quote"
  896. (with-test-prefix "missing or extra expression"
  897. (pass-if-syntax-error "(quote)"
  898. exception:bad-quote
  899. (eval '(quote)
  900. (interaction-environment)))
  901. (pass-if-syntax-error "(quote a b)"
  902. exception:bad-quote
  903. (eval '(quote a b)
  904. (interaction-environment)))))
  905. (with-test-prefix "while"
  906. (define (unreachable)
  907. (error "unreachable code has been reached!"))
  908. ;; Return a new procedure COND which when called (COND) will return #t the
  909. ;; first N times, then #f, then any further call is an error. N=0 is
  910. ;; allowed, in which case #f is returned by the first call.
  911. (define (make-iterations-cond n)
  912. (lambda ()
  913. (cond ((not n)
  914. (error "oops, condition re-tested after giving false"))
  915. ((= 0 n)
  916. (set! n #f)
  917. #f)
  918. (else
  919. (set! n (1- n))
  920. #t))))
  921. (pass-if-syntax-error "too few args" exception:generic-syncase-error
  922. (eval '(while) (interaction-environment)))
  923. (with-test-prefix "empty body"
  924. (do ((n 0 (1+ n)))
  925. ((> n 5))
  926. (pass-if n
  927. (eval `(letrec ((make-iterations-cond
  928. (lambda (n)
  929. (lambda ()
  930. (cond ((not n)
  931. (error "oops, condition re-tested after giving false"))
  932. ((= 0 n)
  933. (set! n #f)
  934. #f)
  935. (else
  936. (set! n (1- n))
  937. #t))))))
  938. (let ((cond (make-iterations-cond ,n)))
  939. (while (cond))
  940. #t))
  941. (interaction-environment)))))
  942. (pass-if "initially false"
  943. (while #f
  944. (unreachable))
  945. #t)
  946. (with-test-prefix "iterations"
  947. (do ((n 0 (1+ n)))
  948. ((> n 5))
  949. (pass-if n
  950. (let ((cond (make-iterations-cond n))
  951. (i 0))
  952. (while (cond)
  953. (set! i (1+ i)))
  954. (= i n)))))
  955. (with-test-prefix "break"
  956. (pass-if "normal return"
  957. (not (while #f (error "not reached"))))
  958. (pass-if "no args"
  959. (while #t (break)))
  960. (pass-if "multiple values"
  961. (equal? '(1 2 3)
  962. (call-with-values
  963. (lambda () (while #t (break 1 2 3)))
  964. list)))
  965. (with-test-prefix "from cond"
  966. (pass-if "first"
  967. (while (begin
  968. (break)
  969. (unreachable))
  970. (unreachable))
  971. #t)
  972. (do ((n 0 (1+ n)))
  973. ((> n 5))
  974. (pass-if n
  975. (let ((cond (make-iterations-cond n))
  976. (i 0))
  977. (while (if (cond)
  978. #t
  979. (begin
  980. (break)
  981. (unreachable)))
  982. (set! i (1+ i)))
  983. (= i n)))))
  984. (with-test-prefix "from body"
  985. (pass-if "first"
  986. (while #t
  987. (break)
  988. (unreachable))
  989. #t)
  990. (do ((n 0 (1+ n)))
  991. ((> n 5))
  992. (pass-if n
  993. (let ((cond (make-iterations-cond n))
  994. (i 0))
  995. (while #t
  996. (if (not (cond))
  997. (begin
  998. (break)
  999. (unreachable)))
  1000. (set! i (1+ i)))
  1001. (= i n)))))
  1002. (pass-if "from nested"
  1003. (while #t
  1004. (let ((outer-break break))
  1005. (while #t
  1006. (outer-break)
  1007. (unreachable)))
  1008. (unreachable))
  1009. #t)
  1010. (pass-if "from recursive"
  1011. (let ((outer-break #f))
  1012. (define (r n)
  1013. (while #t
  1014. (if (eq? n 'outer)
  1015. (begin
  1016. (set! outer-break break)
  1017. (r 'inner))
  1018. (begin
  1019. (outer-break)
  1020. (unreachable))))
  1021. (if (eq? n 'inner)
  1022. (error "broke only from inner loop")))
  1023. (r 'outer))
  1024. #t))
  1025. (with-test-prefix "continue"
  1026. (pass-if-syntax-error "too many args" exception:too-many-args
  1027. (eval '(while #t
  1028. (continue 1))
  1029. (interaction-environment)))
  1030. (with-test-prefix "from cond"
  1031. (do ((n 0 (1+ n)))
  1032. ((> n 5))
  1033. (pass-if n
  1034. (let ((cond (make-iterations-cond n))
  1035. (i 0))
  1036. (while (if (cond)
  1037. (begin
  1038. (set! i (1+ i))
  1039. (continue)
  1040. (unreachable))
  1041. #f)
  1042. (unreachable))
  1043. (= i n)))))
  1044. (with-test-prefix "from body"
  1045. (do ((n 0 (1+ n)))
  1046. ((> n 5))
  1047. (pass-if n
  1048. (let ((cond (make-iterations-cond n))
  1049. (i 0))
  1050. (while (cond)
  1051. (set! i (1+ i))
  1052. (continue)
  1053. (unreachable))
  1054. (= i n)))))
  1055. (pass-if "from nested"
  1056. (let ((cond (make-iterations-cond 3)))
  1057. (while (cond)
  1058. (let ((outer-continue continue))
  1059. (while #t
  1060. (outer-continue)
  1061. (unreachable)))))
  1062. #t)
  1063. (pass-if "from recursive"
  1064. (let ((outer-continue #f))
  1065. (define (r n)
  1066. (let ((cond (make-iterations-cond 3))
  1067. (first #t))
  1068. (while (begin
  1069. (if (and (not first)
  1070. (eq? n 'inner))
  1071. (error "continued only to inner loop"))
  1072. (cond))
  1073. (set! first #f)
  1074. (if (eq? n 'outer)
  1075. (begin
  1076. (set! outer-continue continue)
  1077. (r 'inner))
  1078. (begin
  1079. (outer-continue)
  1080. (unreachable))))))
  1081. (r 'outer))
  1082. #t)))
  1083. (with-test-prefix "syntax-rules"
  1084. (pass-if-equal "custom ellipsis within normal ellipsis"
  1085. '((((a x) (a y) (a …))
  1086. ((b x) (b y) (b …))
  1087. ((c x) (c y) (c …)))
  1088. (((a x) (b x) (c x))
  1089. ((a y) (b y) (c y))
  1090. ((a …) (b …) (c …))))
  1091. (let ()
  1092. (define-syntax foo
  1093. (syntax-rules ()
  1094. ((_ y ...)
  1095. (syntax-rules … ()
  1096. ((_ x …)
  1097. '((((x y) ...) …)
  1098. (((x y) …) ...)))))))
  1099. (define-syntax bar (foo x y …))
  1100. (bar a b c)))
  1101. (pass-if-equal "normal ellipsis within custom ellipsis"
  1102. '((((a x) (a y) (a z))
  1103. ((b x) (b y) (b z))
  1104. ((c x) (c y) (c z)))
  1105. (((a x) (b x) (c x))
  1106. ((a y) (b y) (c y))
  1107. ((a z) (b z) (c z))))
  1108. (let ()
  1109. (define-syntax foo
  1110. (syntax-rules … ()
  1111. ((_ y …)
  1112. (syntax-rules ()
  1113. ((_ x ...)
  1114. '((((x y) …) ...)
  1115. (((x y) ...) …)))))))
  1116. (define-syntax bar (foo x y z))
  1117. (bar a b c)))
  1118. ;; This test is given in SRFI-46.
  1119. (pass-if-equal "custom ellipsis is handled hygienically"
  1120. '((1) 2 (3) (4))
  1121. (let-syntax
  1122. ((f (syntax-rules ()
  1123. ((f ?e)
  1124. (let-syntax
  1125. ((g (syntax-rules --- ()
  1126. ((g (??x ?e) (??y ---))
  1127. '((??x) ?e (??y) ---)))))
  1128. (g (1 2) (3 4)))))))
  1129. (f ---))))
  1130. (with-test-prefix "syntax-error"
  1131. (pass-if-syntax-error "outside of macro without args"
  1132. "test error"
  1133. (eval '(syntax-error "test error")
  1134. (interaction-environment)))
  1135. (pass-if-syntax-error "outside of macro with args"
  1136. "test error x \\(y z\\)"
  1137. (eval '(syntax-error "test error" x (y z))
  1138. (interaction-environment)))
  1139. (pass-if-equal "within macro"
  1140. '(simple-let
  1141. "expected an identifier but got (z1 z2)"
  1142. (simple-let ((y (* x x))
  1143. ((z1 z2) (values x x)))
  1144. (+ y 1)))
  1145. (catch 'syntax-error
  1146. (lambda ()
  1147. (eval '(let ()
  1148. (define-syntax simple-let
  1149. (syntax-rules ()
  1150. ((_ (head ... ((x . y) val) . tail)
  1151. body1 body2 ...)
  1152. (syntax-error
  1153. "expected an identifier but got"
  1154. (x . y)))
  1155. ((_ ((name val) ...) body1 body2 ...)
  1156. ((lambda (name ...) body1 body2 ...)
  1157. val ...))))
  1158. (define (foo x)
  1159. (simple-let ((y (* x x))
  1160. ((z1 z2) (values x x)))
  1161. (+ y 1)))
  1162. foo)
  1163. (interaction-environment))
  1164. (error "expected syntax-error exception"))
  1165. (lambda (k who what where form . maybe-subform)
  1166. (list who what form)))))
  1167. (with-test-prefix "syntax-case"
  1168. (pass-if-syntax-error "duplicate pattern variable"
  1169. '(syntax-case . "duplicate pattern variable")
  1170. (eval '(lambda (e)
  1171. (syntax-case e ()
  1172. ((a b c d e d f) #f)))
  1173. (interaction-environment)))
  1174. (with-test-prefix "misplaced ellipses"
  1175. (pass-if-syntax-error "bare ellipsis"
  1176. '(syntax-case . "misplaced ellipsis")
  1177. (eval '(lambda (e)
  1178. (syntax-case e ()
  1179. (... #f)))
  1180. (interaction-environment)))
  1181. (pass-if-syntax-error "ellipsis singleton"
  1182. '(syntax-case . "misplaced ellipsis")
  1183. (eval '(lambda (e)
  1184. (syntax-case e ()
  1185. ((...) #f)))
  1186. (interaction-environment)))
  1187. (pass-if-syntax-error "ellipsis in car"
  1188. '(syntax-case . "misplaced ellipsis")
  1189. (eval '(lambda (e)
  1190. (syntax-case e ()
  1191. ((... . _) #f)))
  1192. (interaction-environment)))
  1193. (pass-if-syntax-error "ellipsis in cdr"
  1194. '(syntax-case . "misplaced ellipsis")
  1195. (eval '(lambda (e)
  1196. (syntax-case e ()
  1197. ((_ . ...) #f)))
  1198. (interaction-environment)))
  1199. (pass-if-syntax-error "two ellipses in the same list"
  1200. '(syntax-case . "misplaced ellipsis")
  1201. (eval '(lambda (e)
  1202. (syntax-case e ()
  1203. ((x ... y ...) #f)))
  1204. (interaction-environment)))
  1205. (pass-if-syntax-error "three ellipses in the same list"
  1206. '(syntax-case . "misplaced ellipsis")
  1207. (eval '(lambda (e)
  1208. (syntax-case e ()
  1209. ((x ... y ... z ...) #f)))
  1210. (interaction-environment)))))
  1211. (with-test-prefix "with-ellipsis"
  1212. (pass-if-equal "simple"
  1213. '(a 1 2 3)
  1214. (let ()
  1215. (define-syntax define-quotation-macros
  1216. (lambda (x)
  1217. (syntax-case x ()
  1218. ((_ (macro-name head-symbol) ...)
  1219. #'(begin (define-syntax macro-name
  1220. (lambda (x)
  1221. (with-ellipsis …
  1222. (syntax-case x ()
  1223. ((_ x …)
  1224. #'(quote (head-symbol x …)))))))
  1225. ...)))))
  1226. (define-quotation-macros (quote-a a) (quote-b b))
  1227. (quote-a 1 2 3)))
  1228. (pass-if-equal "disables normal ellipsis"
  1229. '(a ...)
  1230. (let ()
  1231. (define-syntax foo
  1232. (lambda (x)
  1233. (with-ellipsis …
  1234. (syntax-case x ()
  1235. ((_)
  1236. #'(quote (a ...)))))))
  1237. (foo)))
  1238. (pass-if-equal "doesn't affect ellipsis for generated code"
  1239. '(a b c)
  1240. (let ()
  1241. (define-syntax quotation-macro
  1242. (lambda (x)
  1243. (with-ellipsis …
  1244. (syntax-case x ()
  1245. ((_)
  1246. #'(lambda (x)
  1247. (syntax-case x ()
  1248. ((_ x ...)
  1249. #'(quote (x ...))))))))))
  1250. (define-syntax kwote (quotation-macro))
  1251. (kwote a b c)))
  1252. (pass-if-equal "propagates into syntax binders"
  1253. '(a b c)
  1254. (let ()
  1255. (with-ellipsis …
  1256. (define-syntax kwote
  1257. (lambda (x)
  1258. (syntax-case x ()
  1259. ((_ x …)
  1260. #'(quote (x …))))))
  1261. (kwote a b c))))
  1262. (pass-if-equal "works with local-eval"
  1263. 5
  1264. (let ((env (with-ellipsis … (the-environment))))
  1265. (local-eval '(syntax-case #'(a b c d e) ()
  1266. ((x …)
  1267. (length #'(x …))))
  1268. env))))
  1269. ;;; Local Variables:
  1270. ;;; eval: (put 'pass-if-syntax-error 'scheme-indent-function 1)
  1271. ;;; eval: (put 'with-ellipsis 'scheme-indent-function 1)
  1272. ;;; End: