chickadee » chicken » memory » representation

Module (chicken memory representation)

The procedures from this module operate on the in-memory representation of Scheme objects. These procedures are safe, so, for example, unlike the procedures from (chicken memory) these procedures will type-check and range-check their arguments, but you still need to know what you're doing because the effects may be surprising for the uninitiated.

Extending procedures with data

extend-procedure

extend-procedure PROCEDURE Xprocedure

Returns a copy of the procedure PROCEDURE which contains an additional data slot initialized to X. If PROCEDURE is already an extended procedure, then its data slot is changed to contain X and the same procedure is returned. Signals an error when PROCEDURE is not a procedure.

extended-procedure?

extended-procedure? PROCEDUREprocedure

Returns #t if PROCEDURE is an extended procedure, or #f otherwise.

procedure-data

procedure-data PROCEDUREprocedure

Returns the data object contained in the extended procedure PROCEDURE, or #f if it is not an extended procedure.

set-procedure-data!

set-procedure-data! PROCEDURE Xprocedure

Changes the data object contained in the extended procedure PROCEDURE to X. Signals an error when PROCEDURE is not an extended procedure.

(define foo
  (letrec ((f (lambda () (procedure-data x)))
           (x #f) )
    (set! x (extend-procedure f 123))
    x) )
(foo)                                         ==> 123
(set-procedure-data! foo 'hello)
(foo)                                         ==> hello

Low-level data access

These procedures operate with what are known as vector-like objects. A vector-like object is a vector, record structure, pair, symbol or keyword: it is an aggregation of other Scheme objects.

Note that strings and blobs are not considered vector-like (they are considered to be byte vectors, which are objects of mostly unstructured binary data).

vector-like?

vector-like? Xprocedure

Returns #t when X is a vector-like object, returns #f otherwise.

block-ref

block-ref VECTOR* INDEXprocedure

Returns the contents of the INDEXth slot of the vector-like object VECTOR*.

block-set!

block-set! VECTOR* INDEX Xprocedure
(set! (block-ref VECTOR* INDEX) X)procedure

Sets the contents of the INDEXth slot of the vector-like object VECTOR* to the value of X.

number-of-slots

number-of-slots VECTOR*procedure

Returns the number of slots that the vector-like object VECTOR* contains.

number-of-bytes

number-of-bytes BLOCKprocedure

Returns the number of bytes that the object BLOCK contains. BLOCK may be any non-immediate value.

object-copy

object-copy Xprocedure

Copies X recursively and returns the fresh copy. Objects allocated in static memory are copied back into garbage collected storage.

Record instance

make-record-instance

make-record-instance SYMBOL ARG1 ...procedure

Returns a new instance of the record type SYMBOL, with its slots initialized to ARG1 .... To illustrate:

(define-record-type point (make-point x y) point?
  (x point-x point-x-set!)
  (y point-y point-y-set!))

expands into something quite similar to:

(begin
  (define (make-point x y)
    (make-record-instance 'point x y) )
  (define (point? x)
    (and (record-instance? x)
         (eq? 'point (block-ref x 0)) ) )
  (define (point-x p) (block-ref p 1))
  (define (point-x-set! p x) (block-set! p 1 x))
  (define (point-y p) (block-ref p 2))
  (define (point-y-set! p y) (block-set! p 1 y)) )

record-instance?

record-instance? X #!optional SYMBOLprocedure

Returns #t if X is a record structure, or #f otherwise.

Further, returns #t if X is of type SYMBOL, or #f otherwise.

record-instance-type

record-instance-type RECORDprocedure

Returns type symbol of the record structure RECORD. Signals an error if RECORD is not a record structure.

record-instance-length

record-instance-length RECORDprocedure

Returns number of slots for the record structure RECORD. The record-instance type is not counted. Signals an error if RECORD is not a record structure.

record-instance-slot

record-instance-slot RECORD INDEXprocedure

Returns the contents of the INDEXth slot of the record structure RECORD. The slot index range is the open interval [0 record-instance-length). Signals an error if RECORD is not a record structure.

record-instance-slot-set!

record-instance-slot-set! RECORD INDEX Xprocedure
(set! (record-instance-slot RECORD INDEX) X)procedure

Sets the INDEXth slot of the record structure RECORD to X. The slot index range is the open interval [0 record-instance-length). Signals an error if RECORD is not a record structure.

record->vector

record->vector RECORDprocedure

Returns a new vector with the type and the elements of the record structure RECORD. Signals an error if RECORD is not a record structure.

Magic

object-become!

object-become! ALISTprocedure

Changes the identity of the value of the car of each pair in ALIST to the value of the cdr. Neither value may be immediate (i.e. exact integers, characters, booleans or the empty list).

(define x "i used to be a string")
(define y '#(and now i am a vector))
(object-become! (list (cons x y)))
x                                    ==> #(and now i am a vector)
y                                    ==> #(and now i am a vector)
(eq? x y)                            ==> #t

Note: this operation invokes a major garbage collection.

The effect of using object-become! on evicted data (see object-evict) is undefined.

mutate-procedure!

mutate-procedure! OLD PROCprocedure

Replaces the procedure OLD with the result of calling the one-argument procedure PROC. PROC will receive a copy of OLD that will be identical in behaviour to the result of OLD:

 ;;; Replace arbitrary procedure with tracing one:

 (mutate-procedure! my-proc
   (lambda (new)
     (lambda args
       (printf "~s called with arguments: ~s~%" new args)
       (apply new args) ) ) )

Previous: Module (chicken memory)

Next: Module (chicken module)

Contents »