lisp中的函数,以特定方式显示列表

时间:2016-04-11 20:30:42

标签: list lisp

我需要在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}
   }

2 个答案:

答案 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)