标签: adjustable-array

如何在Common Lisp中使用填充指针初始化字符串?

我想在循环中使用格式化输出来生成字符串.手册说它可以通过给format函数一个带填充指针作为目标的字符串来轻松完成.不幸的是,手册中如何初始化此字符串并不透明.

我试着(string "")(format nil "")没有运气.

(make-array 0 :element-type 'character :fill-pointer 0) 对我有用,但感觉不对劲.

使用填充指针初始化字符串的正确方法是什么?

string format common-lisp fill-pointer adjustable-array

5
推荐指数
3
解决办法
863
查看次数

可扩展的矢量类型

如何正确指定可扩展向量的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中生成一个类型错误.一个正确的序列类型规范可以使这个工作吗?

vector common-lisp adjustable-array

3
推荐指数
1
解决办法
327
查看次数

如何正确指定可调向量的元素类型

以下是旨在用作(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)

types common-lisp adjustable-array

2
推荐指数
1
解决办法
82
查看次数