5 |
|
|
6 |
(in-package :cl-test) |
(in-package :cl-test) |
7 |
|
|
|
(defmacro def-syntax-test (name form &rest expected-results) |
|
|
`(deftest ,name |
|
|
(with-standard-io-syntax ,form) |
|
|
,@expected-results)) |
|
|
|
|
8 |
;;; Test that |
;;; Test that |
9 |
(def-syntax-test syntax.whitespace.1 |
(def-syntax-test syntax.whitespace.1 |
10 |
;; Check that various standard or semistandard characters are whitespace[2] |
;; Check that various standard or semistandard characters are whitespace[2] |
160 |
(list (list name c s val))))))) |
(list (list name c s val))))))) |
161 |
nil) |
nil) |
162 |
|
|
163 |
#| |
;;; |
164 |
|
;;; CLtS appears to be inconsistent on the next test. |
165 |
|
;;; Compare the definition of 'invalid' with the specification |
166 |
|
;;; of the token reading algorithm. |
167 |
|
;;; |
168 |
(def-syntax-test syntax.escape.whitespace.2 |
(def-syntax-test syntax.escape.whitespace.2 |
169 |
(let ((names '("Tab" "Newline" "Linefeed" "Space" "Return" "Page"))) |
(let ((names '("Tab" "Newline" "Linefeed" "Space" "Return" "Page"))) |
170 |
(loop for name in names |
(loop for name in names |
176 |
(unless (eql val (intern (string c))) |
(unless (eql val (intern (string c))) |
177 |
(list (list name c s val))))))) |
(list (list name c s val))))))) |
178 |
nil) |
nil) |
|
|# |
|
179 |
|
|
180 |
|
#| |
181 |
(def-syntax-test syntax.multiple-escape.invalid.backspace |
(def-syntax-test syntax.multiple-escape.invalid.backspace |
182 |
(let ((c (name-char "Backspace"))) |
(let ((c (name-char "Backspace"))) |
183 |
(or (not c) |
(or (not c) |
191 |
(let ((s (concatenate 'string "|" (string c) "|"))) |
(let ((s (concatenate 'string "|" (string c) "|"))) |
192 |
(eval `(signals-error (read-from-string ',s) reader-error))))) |
(eval `(signals-error (read-from-string ',s) reader-error))))) |
193 |
t) |
t) |
194 |
|
|# |
195 |
|
|
196 |
|
|
197 |
|
;;; Tests of #\ |
198 |
|
|
199 |
|
(def-syntax-test syntax.sharp-backslash.1 |
200 |
|
(loop for c across +standard-chars+ |
201 |
|
for s = (concatenate 'string "#\\" (string c)) |
202 |
|
for c2 = (read-from-string s) |
203 |
|
unless (eql c c2) |
204 |
|
collect (list c s c2)) |
205 |
|
nil) |
206 |
|
|
207 |
|
(def-syntax-test syntax.sharp-backslash.2 |
208 |
|
(let ((count 0)) |
209 |
|
(loop for i below (min 65536 char-code-limit) |
210 |
|
for c = (code-char i) |
211 |
|
for s = (and c (concatenate 'string "#\\" (string c))) |
212 |
|
for c2 = (and c (read-from-string s)) |
213 |
|
unless (eql c c2) |
214 |
|
collect (progn (when (> (incf count) 100) (loop-finish)) |
215 |
|
(list c s c2)))) |
216 |
|
nil) |
217 |
|
|
218 |
|
(def-syntax-test syntax.sharp-backslash.3 |
219 |
|
(loop for i = (random (min (ash 1 24) char-code-limit)) |
220 |
|
for c = (code-char i) |
221 |
|
for s = (and c (concatenate 'string "#\\" (string c))) |
222 |
|
for c2 = (and c (read-from-string s)) |
223 |
|
repeat 1000 |
224 |
|
unless (eql c c2) |
225 |
|
collect (list i c s c2)) |
226 |
|
nil) |
227 |
|
|
228 |
|
(def-syntax-test syntax.sharp-backslash.4 |
229 |
|
(flet ((%f (s) (read-from-string (concatenate 'string "#\\" s)))) |
230 |
|
(loop for s in '("SPACE" "NEWLINE" "TAB" "RUBOUT" "BACKSPACE" "PAGE" "LINEFEED" "RETURN") |
231 |
|
for c = (name-char s) |
232 |
|
unless (or (null c) |
233 |
|
(and (eql (%f s) c) |
234 |
|
(eql (%f (string-downcase s)) c) |
235 |
|
(eql (%f (string-capitalize s)) c))) |
236 |
|
collect (list s c))) |
237 |
|
nil) |
238 |
|
|
239 |
|
(def-syntax-test syntax.sharp-backslash.5 |
240 |
|
(flet ((%f (s) (read-from-string (concatenate 'string "#\\" s)))) |
241 |
|
(loop for c across +standard-chars+ |
242 |
|
for name = (char-name c) |
243 |
|
unless (or (null name) |
244 |
|
(and (eql (%f name) c) |
245 |
|
(eql (%f (string-downcase name)) c) |
246 |
|
(eql (%f (string-upcase name)) c) |
247 |
|
(eql (%f (string-capitalize name)) c))) |
248 |
|
collect (list c name))) |
249 |
|
nil) |
250 |
|
|
251 |
|
(def-syntax-test syntax.sharp-backslash.6 |
252 |
|
(flet ((%f (s) (read-from-string (concatenate 'string "#\\" s)))) |
253 |
|
(loop for i below (min 65536 char-code-limit) |
254 |
|
for c = (code-char i) |
255 |
|
for name = (and c (char-name c)) |
256 |
|
unless (or (null name) |
257 |
|
(and (eql (%f name) c) |
258 |
|
(eql (%f (string-downcase name)) c) |
259 |
|
(eql (%f (string-upcase name)) c) |
260 |
|
(eql (%f (string-capitalize name)) c))) |
261 |
|
collect (list i c name))) |
262 |
|
nil) |
263 |
|
|
264 |
|
(def-syntax-test syntax.sharp-backslash.7 |
265 |
|
(flet ((%f (s) (read-from-string (concatenate 'string "#\\" s)))) |
266 |
|
(loop for i = (random (min (ash 1 24) char-code-limit)) |
267 |
|
for c = (code-char i) |
268 |
|
for name = (and c (char-name c)) |
269 |
|
repeat 1000 |
270 |
|
unless (or (null name) |
271 |
|
(and (eql (%f name) c) |
272 |
|
(eql (%f (string-downcase name)) c) |
273 |
|
(eql (%f (string-upcase name)) c) |
274 |
|
(eql (%f (string-capitalize name)) c))) |
275 |
|
collect (list i c name))) |
276 |
|
nil) |
277 |
|
|
278 |
|
|
279 |
|
;;; Tests of #' |
280 |
|
|
281 |
|
(def-syntax-test syntax.sharp-quote.1 |
282 |
|
(read-from-string "#'X") |
283 |
|
(function |X|) 3) |
284 |
|
|
285 |
|
(def-syntax-test syntax.sharp-quote.2 |
286 |
|
(read-from-string "#':X") |
287 |
|
(function :|X|) 4) |
288 |
|
|
289 |
|
(def-syntax-test syntax.sharp-quote.3 |
290 |
|
(read-from-string "#'17") |
291 |
|
(function 17) 4) |
292 |
|
|
293 |
|
(def-syntax-test syntax.sharp-quote.error.1 |
294 |
|
(signals-error (read-from-string "#'") end-of-file) |
295 |
|
t) |
296 |
|
|
297 |
|
(def-syntax-test syntax.sharp-quote.error.2 |
298 |
|
(signals-error (read-from-string "(#'" nil nil) end-of-file) |
299 |
|
t) |
300 |
|
|
301 |
|
;;; Tess of #(...) |
302 |
|
|
303 |
|
(defmacro def-syntax-vector-test (name form &body expected-elements) |
304 |
|
`(def-syntax-test ,name |
305 |
|
(let ((v (read-from-string ,form))) |
306 |
|
(assert (simple-vector-p v)) |
307 |
|
v) |
308 |
|
,(apply #'vector expected-elements))) |
309 |
|
|
310 |
|
(def-syntax-vector-test syntax.sharp-left-paren.1 |
311 |
|
"#()") |
312 |
|
|
313 |
|
(def-syntax-vector-test syntax.sharp-left-paren.2 |
314 |
|
"#0()") |
315 |
|
|
316 |
|
(def-syntax-vector-test syntax.sharp-left-paren.3 |
317 |
|
"#(a)" a) |
318 |
|
|
319 |
|
(def-syntax-vector-test syntax.sharp-left-paren.4 |
320 |
|
"#(a b c)" a b c) |
321 |
|
|
322 |
|
(def-syntax-vector-test syntax.sharp-left-paren.5 |
323 |
|
"#2(a)" a a) |
324 |
|
|
325 |
|
(def-syntax-vector-test syntax.sharp-left-paren.6 |
326 |
|
"#5(a b)" a b b b b) |
327 |
|
|
328 |
|
(def-syntax-vector-test syntax.sharp-left-paren.7 |
329 |
|
"#5(a b c d e)" a b c d e) |
330 |
|
|
331 |
|
(def-syntax-vector-test syntax.sharp-left-paren.8 |
332 |
|
"#9(a b c d e)" a b c d e e e e e) |
333 |
|
|
334 |
|
(def-syntax-test syntax.sharp-left-paren.9 |
335 |
|
(let ((*read-base* 2)) |
336 |
|
(read-from-string "#10(a)")) |
337 |
|
#(a a a a a a a a a a) |
338 |
|
6) |
339 |
|
|
340 |
|
(def-syntax-test syntax.sharp-left-paren.error.1 |
341 |
|
(signals-error (read-from-string "#(") end-of-file) |
342 |
|
t) |
343 |
|
|
344 |
|
(def-syntax-test syntax.sharp-left-paren.error.2 |
345 |
|
(signals-error (read-from-string "(#(" nil nil) end-of-file) |
346 |
|
t) |
347 |
|
|
348 |
|
;;; Tests of #* |
349 |
|
|
350 |
|
(defmacro def-syntax-bit-vector-test (name form &body expected-elements) |
351 |
|
`(def-syntax-test ,name |
352 |
|
(let ((v (read-from-string ,form))) |
353 |
|
(assert (simple-bit-vector-p v)) |
354 |
|
v) |
355 |
|
,(make-array (length expected-elements) :element-type 'bit :initial-contents expected-elements))) |
356 |
|
|
357 |
|
(def-syntax-bit-vector-test syntax.sharp-asterisk.1 |
358 |
|
"#*") |
359 |
|
|
360 |
|
(def-syntax-bit-vector-test syntax.sharp-asterisk.2 |
361 |
|
"#0*") |
362 |
|
|
363 |
|
(def-syntax-bit-vector-test syntax.sharp-asterisk.3 |
364 |
|
"#1*0" 0) |
365 |
|
|
366 |
|
(def-syntax-bit-vector-test syntax.sharp-asterisk.4 |
367 |
|
"#1*1" 1) |
368 |
|
|
369 |
|
(def-syntax-bit-vector-test syntax.sharp-asterisk.5 |
370 |
|
"#2*1" 1 1) |
371 |
|
|
372 |
|
(def-syntax-bit-vector-test syntax.sharp-asterisk.5 |
373 |
|
"#2*0" 0 0) |
374 |
|
|
375 |
|
(def-syntax-bit-vector-test syntax.sharp-asterisk.6 |
376 |
|
"#5*010" 0 1 0 0 0) |
377 |
|
|
378 |
|
(def-syntax-bit-vector-test syntax.sharp-asterisk.7 |
379 |
|
"#7*0101" 0 1 0 1 1 1 1) |
380 |
|
|
381 |
|
(def-syntax-bit-vector-test syntax.sharp-asterisk.8 |
382 |
|
"#10*01010" 0 1 0 1 0 0 0 0 0 0) |
383 |
|
|
384 |
|
(def-syntax-test syntax.sharp-asterisk.9 |
385 |
|
(let ((*read-base* 3)) |
386 |
|
(read-from-string "#10*01")) |
387 |
|
#*0111111111 |
388 |
|
6) |
389 |
|
|
390 |
|
(def-syntax-test syntax.sharp-asterisk.10 |
391 |
|
(let ((*read-suppress* t)) |
392 |
|
(values (read-from-string "#1* "))) |
393 |
|
nil) |
394 |
|
|
395 |
|
(def-syntax-test syntax.sharp-asterisk.11 |
396 |
|
(let ((*read-suppress* t)) |
397 |
|
(values (read-from-string "#1*00"))) |
398 |
|
nil) |
399 |
|
|
400 |
|
(def-syntax-test syntax.sharp-asterisk.12 |
401 |
|
(let ((*read-suppress* t)) |
402 |
|
(values (read-from-string "#*012"))) |
403 |
|
nil) |
404 |
|
|
405 |
|
(def-syntax-test syntax.sharp-asterisk.error.1 |
406 |
|
(signals-error (read-from-string "#1* X") reader-error) |
407 |
|
t) |
408 |
|
|
409 |
|
(def-syntax-test syntax.sharp-asterisk.error.2 |
410 |
|
(signals-error (read-from-string "#2*011") reader-error) |
411 |
|
t) |
412 |
|
|
413 |
|
(def-syntax-test syntax.sharp-asterisk.error.3 |
414 |
|
(signals-error (read-from-string "#*012") reader-error) |
415 |
|
t) |
416 |
|
|
417 |
|
;;; Tests of #: ... |
418 |
|
|
419 |
|
(defmacro def-syntax-unintern-test (name string) |
420 |
|
`(deftest ,name |
421 |
|
(let ((s (read-from-string ,(concatenate 'string "#:" string)))) |
422 |
|
(values |
423 |
|
(symbol-package s) |
424 |
|
(symbol-name s))) |
425 |
|
nil ,(string-upcase string))) |
426 |
|
|
427 |
|
(def-syntax-unintern-test syntax.sharp-colon.1 "") |
428 |
|
(def-syntax-unintern-test syntax.sharp-colon.2 "#") |
429 |
|
(def-syntax-unintern-test syntax.sharp-colon.3 "a") |
430 |
|
(def-syntax-unintern-test syntax.sharp-colon.4 "A") |
431 |
|
(def-syntax-unintern-test syntax.sharp-colon.5 "NIL") |
432 |
|
(def-syntax-unintern-test syntax.sharp-colon.6 "T") |
433 |
|
(def-syntax-unintern-test syntax.sharp-colon.7 ".") |
434 |
|
|
435 |
|
|
436 |
|
;;; Tests of #. |
437 |
|
|
438 |
|
(def-syntax-test syntax.sharp-dot.1 |
439 |
|
(read-from-string "#.(+ 1 2)") |
440 |
|
3 9) |
441 |
|
|
442 |
|
(def-syntax-test syntax.sharp-dot.2 |
443 |
|
(read-from-string "#.'X") |
444 |
|
X 4) |
445 |
|
|
446 |
|
(def-syntax-test syntax.sharp-dot.error.1 |
447 |
|
(signals-error (read-from-string "#.") end-of-file) |
448 |
|
t) |
449 |
|
|
450 |
|
(def-syntax-test syntax.sharp-dot.error.2 |
451 |
|
(signals-error (read-from-string "(#." nil nil) end-of-file) |
452 |
|
t) |
453 |
|
|
454 |
|
(def-syntax-test syntax.sharp-dot.error.3 |
455 |
|
(signals-error (let ((*read-eval* nil)) (read-from-string "#.1")) reader-error) |
456 |
|
t) |
457 |
|
|
458 |
|
;;; Tests of #B |
459 |
|
|
460 |
|
(def-syntax-test syntax.sharp-b.1 |
461 |
|
(read-from-string "#b0") |
462 |
|
0 3) |
463 |
|
|
464 |
|
(def-syntax-test syntax.sharp-b.2 |
465 |
|
(read-from-string "#B1") |
466 |
|
1 3) |
467 |
|
|
468 |
|
(def-syntax-test syntax.sharp-b.3 |
469 |
|
(read-from-string "#b101101") |
470 |
|
45 8) |
471 |
|
|
472 |
|
(def-syntax-test syntax.sharp-b.4 |
473 |
|
(read-from-string "#B101101") |
474 |
|
45 8) |
475 |
|
|
476 |
|
(def-syntax-test syntax.sharp-b.5 |
477 |
|
(read-from-string "#b010001/100") |
478 |
|
17/4 12) |
479 |
|
|
480 |
|
(def-syntax-test syntax.sharp-b.6 |
481 |
|
(read-from-string "#b-10011") |
482 |
|
-19 8) |
483 |
|
|
484 |
|
(def-syntax-test syntax.sharp-b.7 |
485 |
|
(read-from-string "#B-1/10") |
486 |
|
-1/2 7) |
487 |
|
|
488 |
|
(def-syntax-test syntax.sharp-b.8 |
489 |
|
(read-from-string "#B-0/10") |
490 |
|
0 7) |
491 |
|
|
492 |
|
(def-syntax-test syntax.sharp-b.8 |
493 |
|
(read-from-string "#b0/111") |
494 |
|
0 7) |
495 |
|
|
496 |
|
(def-syntax-test syntax.sharp-b.9 |
497 |
|
(let ((*read-eval* nil)) |
498 |
|
(read-from-string "#b-10/11")) |
499 |
|
-2/3 8) |
500 |
|
|
501 |
|
;;; Tests of #O |
502 |
|
|
503 |
|
(def-syntax-test syntax.sharp-o.1 |
504 |
|
(read-from-string "#o0") |
505 |
|
0 3) |
506 |
|
|
507 |
|
(def-syntax-test syntax.sharp-o.2 |
508 |
|
(read-from-string "#O7") |
509 |
|
7 3) |
510 |
|
|
511 |
|
(def-syntax-test syntax.sharp-o.3 |
512 |
|
(read-from-string "#o10") |
513 |
|
8 4) |
514 |
|
|
515 |
|
(def-syntax-test syntax.sharp-o.4 |
516 |
|
(read-from-string "#O011") |
517 |
|
9 5) |
518 |
|
|
519 |
|
(def-syntax-test syntax.sharp-o.5 |
520 |
|
(read-from-string "#o-0") |
521 |
|
0 4) |
522 |
|
|
523 |
|
(def-syntax-test syntax.sharp-o.6 |
524 |
|
(read-from-string "#O-1") |
525 |
|
-1 4) |
526 |
|
|
527 |
|
(def-syntax-test syntax.sharp-o.7 |
528 |
|
(read-from-string "#O11/10") |
529 |
|
9/8 7) |
530 |
|
|
531 |
|
(def-syntax-test syntax.sharp-o.8 |
532 |
|
(read-from-string "#o-1/10") |
533 |
|
-1/8 7) |
534 |
|
|
535 |
|
(def-syntax-test syntax.sharp-o.9 |
536 |
|
(read-from-string "#O0/10") |
537 |
|
0 6) |
538 |
|
|
539 |
|
(def-syntax-test syntax.sharp-o.10 |
540 |
|
(let ((*read-eval* nil)) |
541 |
|
(read-from-string "#o-10/11")) |
542 |
|
-8/9 8) |
543 |
|
|
544 |
|
;;; Tests of #X |
545 |
|
|
546 |
|
(def-syntax-test syntax.sharp-x.1 |
547 |
|
(read-from-string "#x0") |
548 |
|
0 3) |
549 |
|
|
550 |
|
(def-syntax-test syntax.sharp-x.2 |
551 |
|
(read-from-string "#X1") |
552 |
|
1 3) |
553 |
|
|
554 |
|
(def-syntax-test syntax.sharp-x.3 |
555 |
|
(read-from-string "#xa") |
556 |
|
10 3) |
557 |
|
|
558 |
|
(def-syntax-test syntax.sharp-x.4 |
559 |
|
(read-from-string "#Xb") |
560 |
|
11 3) |
561 |
|
|
562 |
|
(def-syntax-test syntax.sharp-x.5 |
563 |
|
(read-from-string "#XC") |
564 |
|
12 3) |
565 |
|
|
566 |
|
(def-syntax-test syntax.sharp-x.6 |
567 |
|
(read-from-string "#xD") |
568 |
|
13 3) |
569 |
|
|
570 |
|
(def-syntax-test syntax.sharp-x.7 |
571 |
|
(read-from-string "#xe") |
572 |
|
14 3) |
573 |
|
|
574 |
|
(def-syntax-test syntax.sharp-x.8 |
575 |
|
(read-from-string "#Xf") |
576 |
|
15 3) |
577 |
|
|
578 |
|
(def-syntax-test syntax.sharp-x.9 |
579 |
|
(read-from-string "#x10") |
580 |
|
16 4) |
581 |
|
|
582 |
|
(def-syntax-test syntax.sharp-x.10 |
583 |
|
(read-from-string "#X1ab") |
584 |
|
427 5) |
585 |
|
|
586 |
|
(def-syntax-test syntax.sharp-x.11 |
587 |
|
(read-from-string "#x-1") |
588 |
|
-1 4) |
589 |
|
|
590 |
|
(def-syntax-test syntax.sharp-x.12 |
591 |
|
(read-from-string "#X-0") |
592 |
|
0 4) |
593 |
|
|
594 |
|
(def-syntax-test syntax.sharp-x.13 |
595 |
|
(read-from-string "#xa/B") |
596 |
|
10/11 5) |
597 |
|
|
598 |
|
(def-syntax-test syntax.sharp-x.14 |
599 |
|
(read-from-string "#X-1/1c") |
600 |
|
-1/28 7) |
601 |
|
|
602 |
|
(def-syntax-test syntax.sharp-x.15 |
603 |
|
(let ((*read-eval* nil)) |
604 |
|
(read-from-string "#x-10/11")) |
605 |
|
-16/17 8) |
606 |
|
|
607 |
|
;;; Tests of #nR |
608 |
|
|
609 |
|
(def-syntax-test syntax.sharp-r.1 |
610 |
|
(loop for i = (random (ash 1 (+ 2 (random 32)))) |
611 |
|
for base = (+ 2 (random 35)) |
612 |
|
for s = (let ((*print-base* base)) (write-to-string i)) |
613 |
|
for c = (random-from-seq "rR") |
614 |
|
for s2 = (format nil "#~d~c~a" base c s) |
615 |
|
for s3 = (rcase (1 (string-upcase s2)) |
616 |
|
(1 (string-downcase s2)) |
617 |
|
(1 (string-capitalize s2)) |
618 |
|
(1 s2)) |
619 |
|
for base2 = (+ 2 (random 35)) |
620 |
|
for vals = (let ((*read-base* base2)) |
621 |
|
(multiple-value-list |
622 |
|
(read-from-string s3))) |
623 |
|
repeat 1000 |
624 |
|
unless (equal vals (list i (length s3) )) |
625 |
|
collect (list i base s c s2 s3 base2 vals)) |
626 |
|
nil) |
627 |
|
|
628 |
|
(def-syntax-test syntax.sharp-r.2 |
629 |
|
(read-from-string "#2r0") |
630 |
|
0 4) |
631 |
|
|
632 |
|
(def-syntax-test syntax.sharp-r.3 |
633 |
|
(read-from-string "#36r0") |
634 |
|
0 5) |
635 |
|
|
636 |
|
(def-syntax-test syntax.sharp-r.4 |
637 |
|
(read-from-string "#29R-0") |
638 |
|
0 6) |
639 |
|
|
640 |
|
(def-syntax-test syntax.sharp-r.5 |
641 |
|
(read-from-string "#23r-1") |
642 |
|
-1 6) |
643 |
|
|
644 |
|
(def-syntax-test syntax.sharp-r.6 |
645 |
|
(read-from-string "#17r11") |
646 |
|
18 6) |
647 |
|
|
648 |
|
(def-syntax-test syntax.sharp-t.7 |
649 |
|
(read-from-string "#3r10/11") |
650 |
|
3/4 8) |
651 |
|
|
652 |
|
(def-syntax-test syntax.sharp-t.8 |
653 |
|
(read-from-string "#5R-10/11") |
654 |
|
-5/6 9) |
655 |
|
|
656 |
|
;;; Tests of #c |
657 |
|
|
658 |
|
(def-syntax-test syntax.sharp-c.1 |
659 |
|
(read-from-string "#c(1 1)") |
660 |
|
#.(complex 1 1) 7) |
661 |
|
|
662 |
|
(def-syntax-test syntax.sharp-c.2 |
663 |
|
(read-from-string "#C(1 0)") |
664 |
|
1 7) |
665 |
|
|
666 |
|
(def-syntax-test syntax.sharp-c.3 |
667 |
|
(read-from-string "#c(0 1)") |
668 |
|
#.(complex 0 1) 7) |
669 |
|
|
670 |
|
(def-syntax-test syntax.sharp-c.4 |
671 |
|
(read-from-string "#c(-1/2 1)") |
672 |
|
#.(complex -1/2 1) 10) |
673 |
|
|
674 |
|
(def-syntax-test syntax.sharp-c.5 |
675 |
|
(read-from-string "#c (1 1)") |
676 |
|
#.(complex 1 1) 8) |