我需要在lisp中创建一个显示如下列表的函数:
(a b (c d) (e f g) h) ->
(a
b
(c
d)
(e
f
g)
h)
到目前为止,我设法创建了一个显示这样一个列表的函数。
(defun print1-lista(l)
(princ pard)
(do ((lst l (cdr lst)))
((null (cdr lst)) (princ (car lst)) (princ par))
(princ (car lst))
(terpri)))
PRINT1-LISTA
> (print1-lista '(1 (1 2) 3 4))
{1
(1 2)
3
4}
}
答案 0 :(得分:3)
在Common Lisp中,您可以通过多种方式自定义打印机。例如,变量 * print-case * 和 * print-margin-right * 将控制打印符号的情况,以及使用的右边距。漂亮的打印机因此,您可以这样做:
(let ((*print-case* :downcase)
(*print-right-margin* 2))
(pprint '(a b (c d) (e f g) h)))
得到这样的输出:
(a
b
(c
d)
(e
f
g)
h)
答案 1 :(得分:1)
以下是PLT-Scheme
中漂亮打印方案的快速简洁草图(define (deep-ppr lst depth)
(let ((elt (car lst)))
(if (list? elt)
(begin
(printf "~a(~a\n" (make-string depth #\ ) (car elt))
(deep-ppr (cdr elt) (+ 1 depth)))
;; not a list
(begin
(printf "~a~a" (make-string depth #\ ) elt)))
(if (empty? (cdr lst)) (printf ")")
(begin
(printf "\n")
(deep-ppr (cdr lst) depth)))))
这会产生这个。您可以更改引入换行符的方案,但不管您喜欢。
sicp.rkt> (deep-pp '(1 (1 2 4) 3 4 5 6 (1 2 3 5) 7) 0)
(1
(1
2
4)
3
4
5
6
(1
2
3
5)
7)