我用lisp弄湿了脚,遇到了一个(我认为)不寻常的问题。我想创建很长的列表;即,像(setf *mat* (make-list 1000000))
这样的东西,但没有Nil
在屏幕上打印出一百万次。
我想出的最好的是......
(let () (setf *mat* (make-list 1000000)) (length *mat*))
(或在闭包结束时使用其他一些简短但无用的功能)
...但我怀疑有一个更好的解决方案可以避免这些sesquipedalian打印输出。任何输入都表示赞赏。顺便说一句,我在Windows 7下使用Clozure v1.10。
答案 0 :(得分:7)
通常会在最后调用(values)
。
Common Lisp有一种方法可以在打印机级别处理长输出:
Welcome to Clozure Common Lisp Version 1.9-dev-r15612M-trunk (DarwinX8664)!
? *print-length*
NIL
? (setf *print-length* 100)
100
? (make-list 1000000)
(NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL
NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL
NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL
NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL
NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL
NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL
NIL NIL NIL NIL ...)
*print-length*
这是控制它的变量。
答案 1 :(得分:7)
设置*print-length*
的替代方法是在repl上使用defparameter
而不是setf
。 defparameter
返回符号而不是值:
(defparameter *mat* (make-list 10000))
-> *mat*