summaryrefslogtreecommitdiff
path: root/runtime/printrec.lsp
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/printrec.lsp')
-rw-r--r--runtime/printrec.lsp30
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)
+; )