Skip to content

Other Primitives

Miscellaneous procedures that do not fit into the main categories.


Lazy Evaluation

promise?

Syntax: (promise? obj)

Returns #t if obj is a promise (created by delay, delay-force, or make-promise), #f otherwise.

kaappi> (promise? (delay 42))
;=> #t
kaappi> (promise? (make-promise 42))
;=> #t
kaappi> (promise? 42)
;=> #f
kaappi> (promise? (lambda () 42))
;=> #f

See also: make-promise, force, delay


make-promise

Syntax: (make-promise value)

Wraps an already-computed value as a forced promise. When force is called on the result, it returns value immediately without any further evaluation. This is useful when an API expects a promise but you already have the value on hand.

kaappi> (define p (make-promise 42))
kaappi> (promise? p)
;=> #t
kaappi> (force p)
;=> 42
kaappi> (force (make-promise '(a b c)))
;=> (a b c)

Note

make-promise is idempotent: if value is already a promise, it is returned unchanged. (make-promise (delay 42)) is the same as (delay 42).

See also: force, delay


force

Syntax: (force promise)

Evaluates a promise and memoizes the result. On the first call, the thunk stored in the promise is invoked and its result is cached. Subsequent calls to force on the same promise return the cached value without re-evaluating the thunk. If the promise was created with make-promise, the value is returned immediately.

kaappi> (define p (delay (begin (display "computing\n") (* 6 7))))
kaappi> (force p)
computing
;=> 42
kaappi> (force p)
;=> 42
kaappi> (define count 0)
kaappi> (define lazy-count (delay (begin (set! count (+ count 1)) count)))
kaappi> (force lazy-count)
;=> 1
kaappi> (force lazy-count)
;=> 1

See also: make-promise, delay, delay-force


Records (Internal Primitives)

%make-record-type

Syntax: (%make-record-type name field-count)

Creates a record type descriptor with the given name (a symbol) and field-count (a non-negative integer). This is the internal primitive used by the define-record-type macro; users rarely call it directly.

kaappi> (define point-type (%make-record-type 'point 2))
kaappi> point-type
;=> #<record-type point>

Note

Prefer define-record-type for defining records. These %-prefixed primitives are implementation internals exposed for advanced use cases such as meta-programming.

See also: %make-record, %record?, define-record-type


%make-record

Syntax: (%make-record type field-value ...)

Constructs a new record instance of the given type (a record type descriptor from %make-record-type). The number of field-value arguments must match the field count of the type.

kaappi> (define point-type (%make-record-type 'point 2))
kaappi> (define p (%make-record point-type 3 4))
kaappi> p
;=> #<record point>
kaappi> (%record-ref p 0)
;=> 3
kaappi> (%record-ref p 1)
;=> 4

See also: %make-record-type, %record-ref, %record-set!


%record?

Syntax: (%record? obj type)

Returns #t if obj is a record instance of the given type, #f otherwise. The type must be a record type descriptor.

kaappi> (define point-type (%make-record-type 'point 2))
kaappi> (define p (%make-record point-type 3 4))
kaappi> (%record? p point-type)
;=> #t
kaappi> (%record? 42 point-type)
;=> #f
kaappi> (define vec-type (%make-record-type 'vec 2))
kaappi> (%record? p vec-type)
;=> #f

See also: %make-record, %make-record-type


%record-ref

Syntax: (%record-ref record index)

Returns the value of the field at index (zero-based) in record. It is an error if index is out of range.

kaappi> (define point-type (%make-record-type 'point 2))
kaappi> (define p (%make-record point-type 10 20))
kaappi> (%record-ref p 0)
;=> 10
kaappi> (%record-ref p 1)
;=> 20

See also: %record-set!, %make-record


%record-set!

Syntax: (%record-set! record index value)

Sets the field at index (zero-based) in record to value. It is an error if index is out of range.

kaappi> (define point-type (%make-record-type 'point 2))
kaappi> (define p (%make-record point-type 0 0))
kaappi> (%record-set! p 0 42)
kaappi> (%record-set! p 1 99)
kaappi> (%record-ref p 0)
;=> 42
kaappi> (%record-ref p 1)
;=> 99

See also: %record-ref, %make-record


Random Numbers (SRFI-27)

random-integer

Syntax: (random-integer n)

Returns a uniformly distributed random exact integer in the range [0, n), where n must be a positive exact integer. The distribution is uniform over the range.

kaappi> (random-integer 6)
;=> 3
kaappi> (random-integer 100)
;=> 57
kaappi> (map (lambda (_) (random-integer 2)) '(1 2 3 4 5))
;=> (0 1 1 0 1)

See also: random-real


random-real

Syntax: (random-real)

Returns a uniformly distributed random inexact real number in the range [0.0, 1.0). The result is always non-negative and strictly less than 1.0.

kaappi> (random-real)
;=> 0.7312456789
kaappi> (random-real)
;=> 0.1284930156
kaappi> (< (random-real) 1.0)
;=> #t

See also: random-integer