diff options
Diffstat (limited to 'runtime/printrec.lsp')
-rw-r--r-- | runtime/printrec.lsp | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/runtime/printrec.lsp b/runtime/printrec.lsp new file mode 100644 index 0000000..4ca17bb --- /dev/null +++ b/runtime/printrec.lsp @@ -0,0 +1,30 @@ +; prints recursive list structure + +;(let (seen-list) +(setf seenlist nil) + (defun seenp (l) (member l seenlist :test 'eq)) + (defun make-seen (l) (setf seenlist (cons l seenlist))) + (defun printrec (l) (printrec-any l) (setf seenlist nil)) + (defun printrec-any (l) + (cond ((atom l) (prin1 l) (princ " ")) + ((seenp l) (princ "<...> ")) + (t + (make-seen l) + (princ "(") + (printrec-list l) + (princ ") "))) + nil) + (defun printrec-list (l) + (printrec-any (car l)) + (cond ((cdr l) + (cond ((seenp (cdr l)) + (princ "<...> ")) + ((atom (cdr l)) + (princ ". ") + (prin1 (cdr l)) + (princ " ")) + (t + (make-seen (cdr l)) + (printrec-list (cdr l)))))) + nil) +; ) |