我想在循环中使用格式化输出来生成字符串.手册说它可以通过给format函数一个带填充指针作为目标的字符串来轻松完成.不幸的是,手册中如何初始化此字符串并不透明.
我试着(string "")和(format nil "")没有运气.
(make-array 0 :element-type 'character :fill-pointer 0) 对我有用,但感觉不对劲.
使用填充指针初始化字符串的正确方法是什么?
如何正确指定可扩展向量的common-lisp类型(即,vector-push-extend可接受),因此可以复制它.例如,如果向量定义为:
(defparameter v (make-array 2
:initial-contents '((a (b)) (c (d) e))
:adjustable t
:fill-pointer t))
Run Code Online (Sandbox Code Playgroud)
我复制它的简单(不正确)方法是:
(map 'array #'copy-tree v)
Run Code Online (Sandbox Code Playgroud)
但这会在sbcl中生成一个类型错误.一个正确的序列类型规范可以使这个工作吗?
以下是旨在用作(lifo)堆栈或(fifo)队列的结构
(defstruct jvector
(vector (make-array 0 :adjustable t :fill-pointer 0) :type (array * (*)))
(start 0 :type (integer 0 *)))
Run Code Online (Sandbox Code Playgroud)
内容的范围从jvector-start到jvector-vector填充指针。我希望能够用类似的东西指定内容的元素类型
(defun create-jvector (&key (element-type t))
(make-jvector :vector (make-array 0 :element-type element-type :adjustable t :fill-pointer 0)
:start 0))
Run Code Online (Sandbox Code Playgroud)
并用
(defun push-jvector (elt jvec)
(vector-push-extend elt (jvector-vector jvec)))
Run Code Online (Sandbox Code Playgroud)
但是,create-jvector中的元素类型将被忽略。例如,
* (defparameter v (create-jvector :element-type 'integer))
V
* v
#S(JVECTOR :VECTOR #() :START 0)
* (push-jvector 1 v)
0 ;OK result
* v
#S(JVECTOR :VECTOR #(1) :START 0)
* (push-jvector 'a v) …Run Code Online (Sandbox Code Playgroud)