File: data.texi

package info (click to toggle)
s48-refman 1-2
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k
  • size: 712 kB
  • sloc: makefile: 37
file content (211 lines) | stat: -rw-r--r-- 9,013 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
@c Cells, queues, hash tables, & weak references subsections.

@node Cells
@subsection Cells

@stindex cells
Scheme48 also provides a simple mutable cell data type from the
@code{cells} structure.  It uses them internally for local, lexical
variables that are assigned, but cells are available still to the rest
of the system for general use.

@deffn procedure make-cell contents @returns{} cell
@deffnx procedure cell? object @returns{} boolean
@deffnx procedure cell-ref cell @returns{} value
@deffnx procedure cell-set! cell value @returns{} unspecified
@code{Make-cell} creates a new cell with the given contents.
@code{Cell?} is the disjoint type predicate for cells.  @code{Cell-ref}
returns the current contents of @var{cell}.  @code{Cell-set!} assigns
the contents of @var{cell} to @var{value}.
@end deffn

Examples:

@lisp
(define cell (make-cell 42))
(cell-ref cell)                         @result{} 42
(cell? cell)                            @result{} #t
(cell-set! cell 'frobozz)
(cell-ref cell)                         @result{} frobozz@end lisp

@node Queues
@subsection Queues

@cindex FIFOs
@stindex queues
The @code{queues} structure exports names for procedures that operate
on simple first-in, first-out queues.

@deffn procedure make-queue @returns{} queue
@deffnx procedure queue? object @returns{} boolean
@code{Make-queue} constructs an empty queue.  @code{Queue?} is the
disjoint type predicate for queues.
@end deffn

@deffn procedure queue-empty? queue @returns{} boolean
@deffnx procedure empty-queue! queue @returns{} unspecified
@code{Queue-empty?} returns @code{#t} if @var{queue} contains zero
elements or @code{#f} if it contains some.  @code{Empty-queue!} removes
all elements from @var{queue}.
@end deffn

@deffn procedure enqueue! queue object @returns{} unspecified
@deffnx procedure dequeue! queue @returns{} value
@deffnx procedure maybe-dequeue! queue @returns{} value or @code{#f}
@deffnx procedure queue-head queue @returns{} value
@code{Enqueue!} adds @var{object} to @var{queue}.  @code{Dequeue!}
removes & returns the next object available from @var{queue}; if
@var{queue} is empty, @code{dequeue!} signals an error.
@code{Maybe-dequeue!} is like @code{dequeue!}, but it returns @code{#f}
in the case of an absence of any element, rather than signalling an
error.  @code{Queue-head} returns the next element available from
@var{queue} without removing it, or it signals an error if @var{queue}
is empty.
@end deffn

@deffn procedure queue-length queue @returns{} integer
Returns the number of objects in @var{queue}.
@end deffn

@deffn procedure on-queue? queue object @returns{} boolean
@deffnx procedure delete-from-queue! queue object @returns{} unspecified
@code{On-queue?} returns true if @var{queue} contains @var{object} or
@code{#f} if not.  @code{Delete-from-queue!} removes the first
occurrence of @var{object} from @var{queue} that would be dequeued.
@end deffn

@deffn procedure queue->list queue @returns{} list
@deffnx procedure list->queue list @returns{} queue
These convert queues to and from lists of their elements.
@code{Queue->list} returns a list in the order in which its elements
were added to the queue.  @code{List->queue} returns a queue that will
produce elements starting at the head of the list.
@end deffn

Examples:

@lisp
(define q (make-queue))
(enqueue! q 'foo)
(enqueue! q 'bar)
(queue->list q)                         @result{} (foo bar)
(on-queue? q 'bar)                      @result{} #t
(dequeue! q)                            @result{} 'foo
(queue-empty? q)                        @result{} #f
(delete-from-queue! queue 'bar)
(queue-empty? q)                        @result{} #t
(enqueue! q 'frobozz)
(empty-queue! q)
(queue-empty? q)                        @result{} #t
(dequeue! q)                            @error{} empty queue@end lisp

Queues are integrated with Scheme48's @embedref{Optimistic concurrency,
optimistic concurrency} facilities, in that every procedure exported
except for @code{queue->list} ensures fusible atomicity in operation
--- that is, every operation except for @code{queue->list} ensures that
the transaction it performs is atomic, and that it may be fused within
larger atomic transactions, as transactions wrapped within
@code{call-ensuring-atomicity} @etc{} may be.

@node Hash tables
@subsection Hash tables

@stindex tables
Scheme48 provides a simple hash table facility in the structure
@code{tables}.

@deffn procedure make-table [hasher] @returns{} table
@deffnx procedure make-string-table @returns{} string-table
@deffnx procedure make-symbol-table @returns{} symbol-table
@deffnx procedure make-integer-table @returns{} integer-table
Hash table constructors.  @code{Make-table} creates a table that hashes
keys either with @var{hasher}, if it is passed to @code{make-table}, or
@code{default-hash-function}, and it compares keys for equality with
@code{eq?}, unless they are numbers, in which case it compares with
@code{eqv?}.  @code{Make-string-table} makes a table whose hash function
is @code{string-hash} and that compares the equality of keys with
@code{string=?}.  @code{Make-symbol-table} constructs a table that
hashes symbol keys by converting them to strings and hashing them with
@code{string-hash}; it compares keys' equality by @code{eq?}.  Tables
made by @code{make-integer-table} hash keys by taking their absolute
value, and test for key equality with the @code{=} procedure.
@end deffn

@deffn procedure make-table-maker comparator hasher @returns{} table-maker
Customized table constructor constructor: this returns a nullary
procedure that creates a new table that uses @var{comparator} to compare
keys for equality and @var{hasher} to hash keys.
@end deffn

@deffn procedure table? object @returns{} boolean
Hash table disjoint type predicate.
@end deffn

@deffn procedure table-ref table key @returns{} value or @code{#f}
@deffnx procedure table-set! table key value @returns{} unspecified
@code{Table-ref} returns the value associated with @var{key} in
@var{table}, or @code{#f} if there is no such association.
If @var{value} is @code{#f}, @code{table-set!} ensures that there is no
longer an association with @var{key} in @var{table}; if @var{value} is
any other value, @code{table-set!} creates a new association or assigns
an existing one in @var{table} whose key is @var{key} and whose
associated value is @var{value}.
@end deffn

@deffn procedure table-walk proc table @returns{} unspecified
@code{Table-walk} applies @var{proc} to the key & value, in that order
of arguments, of every association in @var{table}.
@end deffn

@deffn procedure make-table-immutable! table @returns{} table
This makes the structure of @var{table} immutable, though not its
contents.  @code{Table-set!} may not be used with tables that have been
made immutable.
@end deffn

@deffn procedure default-hash-function value @returns{} integer-hash-code
@deffnx procedure string-hash string @returns{} integer-hash-code
Two built-in hashing functions.  @code{Default-hash-function} can hash
any Scheme value that could usefully be used in a @code{case} clause.
@code{String-hash} is likely to be fast, as it is implemented as a VM
primitive.  @code{String-hash} is the same as what the @code{features}
structure exports under the same name.
@end deffn

@node Weak references
@subsection Weak references

@stindex weak
Scheme48 provides an interface to weakly held references in basic weak
pointers and @dfn{populations}, or sets whose elements are weakly held.
The facility is in the structure @code{weak}.

@subsubsection Weak pointers

@deffn procedure make-weak-pointer contents @returns{} weak-pointer
@deffnx procedure weak-pointer? object @returns{} boolean
@deffnx procedure weak-pointer-ref weak-pointer @returns{} value or @code{#f}
@code{Make-weak-pointer} creates a weak pointer that points to
@var{contents}.  @code{Weak-pointer?} is the weak pointer disjoint type
predicate.  @code{Weak-pointer-ref} accesses the value contained within
@code{weak-pointer}, or returns @code{#f} if there were no strong
references to the contents and a garbage collection occurred.  Weak
pointers resemble @embedref{Cells, cells}, except that they are
immutable and hold their contents weakly, not strongly.
@end deffn

@subsubsection Populations (weak sets)

@deffn procedure make-population @returns{} population
@deffnx procedure add-to-population! object population @returns{} unspecified
@deffnx procedure population->list population @returns{} list
@deffnx procedure walk-population proc population @returns{} unspecified
@code{Make-population} constructs an empty population.
@code{Add-to-population!} adds @var{object} to the population
@var{population}.  @code{Population->list} returns a list of the
elements of @var{population}.  Note, though, that this can be
dangerous in that it can create strong references to the population's
contents and potentially leak space because of this.
@code{Walk-population} applies @var{proc} to every element in
@var{population}.
@end deffn