Lisp - Specialized Vectors



A specialized vector refers to a vector which holds only a specific type of an element. In Lisp, an array or vector can hold any kind of object. A specialized array is way to restrict this functionality where only a specific type of element can be added. Following are key advantage of creating a specialized vector.

  • Type Restriction− We can store specific type elements like integers, chars and single-float numbers which allows LISP to optimize storage of vectors of these primary types.

  • Increased Efficiency− LISP can use more efficient storage mechanism and avoid overhead of type checks during every element access.

  • Optimized Memory Allocation− Specialized vectors are generally for primitive types thus requiring less storage than general type vectors.

  • Compiler Optimization− Compiler can generate more efficient machine code when type of element is known in advance.

Commonly Specialized Array Types

We can use element-type construct with make-array function to define the required type of elements as shown below:

Vector of Bits

We can create a vector of bits to efficiently store boolean data.

; Create a vector of bits
(defvar bit-vector (make-array 10 :element-type 'bit))
; print vector
(print bit-vector)
; print 0
(print (aref bit-vector 2))        
; set a value
(setf (aref bit-vector 2) 1)
(terpri)
; print 1
(print (aref bit-vector 2))

Output

When you execute the code, it returns the following result −

#*0000000000
0
1

Vector of Bits and characters

We can create specialized vectors as literal as shown below:

; Create a vector of bits
(defvar bit-vector #*010101)
; print vector
(print bit-vector)
(terpri)
; print 1
(print (aref bit-vector 3))        

; Create a vector of characters using string literal
(defvar char-vector "Hello")
(terpri)
; print vector
(print char-vector)
(terpri)
; print l
(print (aref char-vector 3)) 

Output

When you execute the code, it returns the following result −

#*010101 
1 
"Hello" 
#\l

Vector of Integers

We can create a vector of integers to store numerical data.

; Create a vector of integers
(make-array 10 :element-type 'integer)        

Vector of Strings

We can create a vector of strings to store character sequences.

; Create a vector of strings
(make-array 10 :element-type 'character)        

Vector of Single-Float

We can create a vector of single precision floating point numbers for numerical computations.

; Create a vector of single-float
(make-array 10 :element-type 'single-float)        

Advantages of Specialized Vectors

  • Type Safety− Due to element type restriction, type safety is ensured by LISP system automatically.

  • Increased Performance− Specialized array access/modification is significantly faster than general arrays.

  • Efficient Memory Usage− Lesser memory requirement as no storage requirement for type of each element.

Example

Following code check and predicates on different values.

main.lisp

; define a vector of integers
(defvar my-vector (make-array 10 :element-type 'integer))

; assign integer values
(setf (aref my-vector 0) 10)
(setf (aref my-vector 1) 20)
(setf (aref my-vector 2) 30)

; Output: #(10 20 30 NIL NIL NIL NIL NIL NIL NIL)
(print my-vector)  

Output

When you execute the code, it returns the following result −

#(10 20 30 NIL NIL NIL NIL NIL NIL NIL) 
Advertisements