[LISPWORKS][Common Lisp HyperSpec (TM)] [Previous][Up][Next]



References: MAKE-ARRAY


Category: ADDITION

Edit history: v1, 13 Feb 1991, Sandra Loosemore

v2, 11 Mar 1991, Sandra Loosemore

v3, 26 Mar 1991, Sandra Loosemore (amendment from meeting)

Status: v3 (proposal ADD) accepted by X3J13, Mar 91

Problem description:

There is no way to determine whether an array is displaced to another

array. Having this information available would be helpful to some

applications that want to dump and restore array contents, either to

allow them to detect when sharing of displaced arrays is lost or to

reconstruct the arrays in such a way that sharing is preserved.


Add a function:

ARRAY-DISPLACEMENT <array> [Function]

The <array> argument must be an array. If the array is a displaced

array, two values are returned: the array to which it is displaced

corresponding to the :DISPLACED-TO argument to MAKE-ARRAY, and an

integer corresponding to the :DISPLACED-INDEX-OFFSET argument to

MAKE-ARRAY. If the array is not a displaced array, this function

returns two values NIL and 0.

If ARRAY-DISPLACEMENT is called on an array for which a non-NIL

object was provided as the :DISPLACED-TO argument to MAKE-ARRAY

or ADJUST-ARRAY, it must return that object as its first value.

It is implementation-dependent whether ARRAY-DISPLACEMENT returns

a non-NIL first value for any other array.


(array-displacement '#(1 2 3))

=> the values are not specified, but are probably NIL and 0 in many


(array-displacement (make-array 2 :displaced-to '#1=#(1 2 3)))

=> (values #1# 0)


Providing the function solves the problem.

Some implementations implicitly displace some arrays. (For example,

adjustable arrays might be represented as displaced arrays.) Permitting

ARRAY-DISPLACEMENT to return non-NIL for those arrays allows those

implementations not to have to record some additional information

in the array about whether an explicit :DISPLACED-TO was provided.

Current Practice:

Lucid version 4.0 and Apple's Macintosh Common Lisp implement such

a function, but call it DISPLACED-ARRAY-P.

Symbolics has an ARRAY-DISPLACED-P predicate but it returns neither

the array nor an index, just a boolean.

Cost to Implementors:

It's probably easy to add.

Cost to Users:

None, this is a new feature.

Cost of non-adoption:

Users can't do some kind of manipulations on displaced arrays in a

portable way.

Performance impact:

Probably none.


The cost of non-adoption is avoided.


Looks OK to me.


The addition of such a function was mentioned in the writeup for

proposal ADJUST-ARRAY-DISPLACEMENT as something that had been

considered at that time. I don't recall what the arguments were

against it.

A more extreme proposal would also define ARRAY-DISPLACEMENT as

a SETF place, to allow these parameters of displaced arrays to

be changed.

The original name suggested for this function was DISPLACED-ARRAY-P.

JonL notes:

The reason Lucid has DISPLACED-ARRAY-P is that is the name Guy Steele

gave it back it 6-Dec-85 -- the "Clarifications" and

"non-controversial ..." lists. Quite possibly, it had been suggested

already in the common-lisp@su-ai forum.

[Starting Points][Contents][Index][Symbols][Glossary][Issues]
Copyright 1996-2005, LispWorks Ltd. All rights reserved.