After
(define a (list 10 20 30))
(set-cdr! (cddr a) (cdr a))
what happens if I do (length a) and (map - a) ?
We have specifically built a circular sublist, so as to make it harder to detect circularity (it doesn't suffice to check for links to the head).
| sysyem | (length a) | (map - a) |
|---|---|---|
| Bigloo | loop | loop |
| Biwa | error | error |
| Chez | error | error |
| Chibi | error | loop |
| Chicken | error | loop |
| Cyclone | loop | loop |
| Foment | error | error, exit system |
| Gambit | loop | loop |
| Gauche | error | loop |
| Guile | error | error |
| Kawa | 2147483647 | loop |
| LIPS | 2 | error |
| Loko | stack overflow | stack overflow |
| MIT | error | out of memory |
| Sagittarius | -2 | loop |
| Scheme48 | loop | heap overflow |
| Scheme9 | loop | loop |
| SCM | error | loop |
| STklos | loop | loop |
| Unsyntax | error | loop |
| Ypsilon | error | error |
| ABCL | ... | ... |
| Clisp | loop | loop |
| CMUCL | loop | loop |
| CCL | error | loop |
| ECL | loop | loop |
| GCL | loop | loop |
| SBCL | loop | loop |
| elisp | error | error |
All Common Lisp implementations will loop while setting the cdddr of the list. However, all of them get back to the REPL after a ^C -- except ABCL, which exits the program.
Emacs Lisp quite properly informs that the "list contains a loop".
The equivalent code used for Common Lisp and Emacs Lisp is below.
(setq a (list 10 20 30))
(setf (cdddr a) (cdr a))
(listp a)
(length a)
(mapcar #'- a)