File: foreigntypes.html

package info (click to toggle)
swi-prolog 7.2.3%2Bdfsg-6
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 84,180 kB
  • ctags: 45,684
  • sloc: ansic: 330,358; perl: 268,104; sh: 6,795; java: 4,904; makefile: 4,561; cpp: 4,153; ruby: 1,594; yacc: 843; xml: 82; sed: 12; sql: 6
file content (461 lines) | stat: -rw-r--r-- 14,408 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
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">

<html>
<head>
<title>SWI-Prolog 7.3.6 Reference Manual: Section 10.3</title><link rel="home" href="index.html">
<link rel="contents" href="Contents.html">
<link rel="index" href="DocIndex.html">
<link rel="summary" href="summary.html">
<link rel="previous" href="foreignlink.html">
<link rel="next" href="foreigninclude.html">

<style type="text/css">

/* Style sheet for SWI-Prolog latex2html
*/

dd.defbody
{ margin-bottom: 1em;
}

dt.pubdef, dt.multidef
{ color: #fff;
padding: 2px 10px 0px 10px;
margin-bottom: 5px;
font-size: 18px;
vertical-align: middle;
overflow: hidden;
}

dt.pubdef { background-color: #0c3d6e; }
dt.multidef { background-color: #ef9439; }

.bib dd
{ margin-bottom: 1em;
}

.bib dt
{ float: left;
margin-right: 1.3ex;
}

pre.code
{ margin-left: 1.5em;
margin-right: 1.5em;
border: 1px dotted;
padding-top: 5px;
padding-left: 5px;
padding-bottom: 5px;
background-color: #f8f8f8;
}

div.navigate
{ text-align: center;
background-color: #f0f0f0;
border: 1px dotted;
padding: 5px;
}

div.title
{ text-align: center;
padding-bottom: 1em;
font-size: 200%;
font-weight: bold;
}

div.author
{ text-align: center;
font-style: italic;
}

div.abstract
{ margin-top: 2em;
background-color: #f0f0f0;
border: 1px dotted;
padding: 5px;
margin-left: 10%; margin-right:10%;
}

div.abstract-title
{ text-align: center;
padding: 5px;
font-size: 120%;
font-weight: bold;
}

div.toc-h1
{ font-size: 200%;
font-weight: bold;
}

div.toc-h2
{ font-size: 120%;
font-weight: bold;
margin-left: 2em;
}

div.toc-h3
{ font-size: 100%;
font-weight: bold;
margin-left: 4em;
}

div.toc-h4
{ font-size: 100%;
margin-left: 6em;
}

span.sec-nr
{
}

span.sec-title
{
}

span.pred-ext
{ font-weight: bold;
}

span.pred-tag
{ float: right;
padding-top: 0.2em;
font-size: 80%;
font-style: italic;
color: #fff;
}

div.caption
{ width: 80%;
margin: auto;
text-align:center;
}

/* Footnotes */
.fn {
color: red;
font-size: 70%;
}

.fn-text, .fnp {
position: absolute;
top: auto;
left: 10%;
border: 1px solid #000;
box-shadow: 5px 5px 5px #888;
display: none;
background: #fff;
color: #000;
margin-top: 25px;
padding: 8px 12px;
font-size: larger;
}

sup:hover span.fn-text
{ display: block;
}

/* Lists */

dl.latex
{ margin-top: 1ex;
margin-bottom: 0.5ex;
}

dl.latex dl.latex dd.defbody
{ margin-bottom: 0.5ex;
}

/* PlDoc Tags */

dl.tags
{ font-size: 90%;
margin-left: 5ex;
margin-top: 1ex;
margin-bottom: 0.5ex;
}

dl.tags dt
{ margin-left: 0pt;
font-weight: bold;
}

dl.tags dd
{ margin-left: 3ex;
}

td.param
{ font-style: italic;
font-weight: bold;
}

/* Index */

dt.index-sep
{ font-weight: bold;
font-size: +1;
margin-top: 1ex;
}

/* Tables */

table.center
{ margin: auto;
}

table.latex
{ border-collapse:collapse;
}

table.latex tr
{ vertical-align: text-top;
}

table.latex td,th
{ padding: 2px 1em;
}

table.latex tr.hline td,th
{ border-top: 1px solid black;
}

table.frame-box
{ border: 2px solid black;
}

</style>
</head>
<body style="background:white">
<div class="navigate"><a class="nav" href="index.html"><img src="home.gif" alt="Home"></a>
<a class="nav" href="Contents.html"><img src="index.gif" alt="Contents"></a>
<a class="nav" href="DocIndex.html"><img src="yellow_pages.gif" alt="Index"></a>
<a class="nav" href="summary.html"><img src="info.gif" alt="Summary"></a>
<a class="nav" href="foreignlink.html"><img src="prev.gif" alt="Previous"></a>
<a class="nav" href="foreigninclude.html"><img src="next.gif" alt="Next"></a>
</div>
<h2 id="sec:foreigntypes"><a id="sec:10.3"><span class="sec-nr">10.3</span> <span class="sec-title">Interface 
Data Types</span></a></h2>

<a id="sec:foreigntypes"></a>

<p><h3 id="sec:type-term-t"><a id="sec:10.3.1"><span class="sec-nr">10.3.1</span> <span class="sec-title">Type <code>term_t</code>: 
a reference to a Prolog term</span></a></h3>

<a id="sec:type-term-t"></a>

<p>The principal data type is <code>term_t</code>. Type <code>term_t</code> 
is what Quintus calls <code>QP_term_ref</code>. This name indicates 
better what the type represents: it is a <em>handle</em> for a term 
rather than the term itself. Terms can only be represented and 
manipulated using this type, as this is the only safe way to ensure the 
Prolog kernel is aware of all terms referenced by foreign code and thus 
allows the kernel to perform garbage collection and/or stack-shifts 
while foreign code is active, for example during a callback from C.

<p>A term reference is a C unsigned long, representing the offset of a 
variable on the Prolog environment stack. A foreign function is passed 
term references for the predicate arguments, one for each argument. If 
references for intermediate results are needed, such references may be 
created using <a class="func" href="foreigntypes.html#PL_new_term_ref()">PL_new_term_ref()</a> 
or <a class="func" href="foreigntypes.html#PL_new_term_refs()">PL_new_term_refs()</a>. 
These references normally live till the foreign function returns control 
back to Prolog. Their scope can be explicitly limited using <a class="func" href="foreigninclude.html#PL_open_foreign_frame()">PL_open_foreign_frame()</a> 
and <a class="func" href="foreigninclude.html#PL_close_foreign_frame()">PL_close_foreign_frame()</a>/<a class="func" href="foreigninclude.html#PL_discard_foreign_frame()">PL_discard_foreign_frame()</a>.

<p>A <code>term_t</code> always refers to a valid Prolog term (variable, 
atom, integer, float or compound term). A term lives either until 
backtracking takes us back to a point before the term was created, the 
garbage collector has collected the term, or the term was created after 
a
<a class="func" href="foreigninclude.html#PL_open_foreign_frame()">PL_open_foreign_frame()</a> 
and <a class="func" href="foreigninclude.html#PL_discard_foreign_frame()">PL_discard_foreign_frame()</a> 
has been called.

<p>The foreign interface functions can either <em>read</em>, <em>unify</em> 
or
<em>write</em> to term references. In this document we use the following 
notation for arguments of type <code>term_t</code>:
<blockquote>
<table class="latex frame-void">
<tr><td><code>term_t +t</code></td><td>Accessed in read-mode. The `+' 
indicates the argument is `input'. </td></tr>
<tr><td><code>term_t -t</code></td><td>Accessed in write-mode. </td></tr>
<tr><td><code>term_t ?t</code></td><td>Accessed in unify-mode. </td></tr>
</table>
</blockquote>

<p>Term references are obtained in any of the following ways:

<p>
<ul class="latex">
<li><i>Passed as argument</i><br>
The C functions implementing foreign predicates are passed their 
arguments as term references. These references may be read or unified. 
Writing to these variables causes undefined behaviour.
<li><i>Created by <a class="func" href="foreigntypes.html#PL_new_term_ref()">PL_new_term_ref()</a></i><br>
A term created by <a class="func" href="foreigntypes.html#PL_new_term_ref()">PL_new_term_ref()</a> 
is normally used to build temporary terms or to be written by one of the 
interface functions. For example, <a class="func" href="foreigninclude.html#PL_get_arg()">PL_get_arg()</a> 
writes a reference to the term argument in its last argument.
<li><i>Created by <a class="func" href="foreigntypes.html#PL_new_term_refs()">PL_new_term_refs(int 
n)</a></i><br>
This function returns a set of term references with the same 
characteristics as <a class="func" href="foreigntypes.html#PL_new_term_ref()">PL_new_term_ref()</a>. 
See <a class="func" href="foreigninclude.html#PL_open_query()">PL_open_query()</a>.
<li><i>Created by <a class="func" href="foreigntypes.html#PL_copy_term_ref()">PL_copy_term_ref(term_t 
t)</a></i><br>
Creates a new term reference to the same term as the argument. The term 
may be written to. See <a class="fig" href="foreigninclude.html#fig:pl-display">figure 
7</a>.
</ul>

<p>Term references can safely be copied to other C variables of type
<code>term_t</code>, but all copies will always refer to the same term.

<dl class="latex">
<dt class="pubdef"><a id="PL_new_term_ref()"><var>term_t</var> <strong>PL_new_term_ref</strong>(<var></var>)</a></dt>
<dd class="defbody">
Return a fresh reference to a term. The reference is allocated on the
<em>local</em> stack. Allocating a term reference may trigger a 
stack-shift on machines that cannot use sparse memory management for 
allocation of the Prolog stacks. The returned reference describes a 
variable.
</dd>
<dt class="pubdef"><a id="PL_new_term_refs()"><var>term_t</var> <strong>PL_new_term_refs</strong>(<var>int 
n</var>)</a></dt>
<dd class="defbody">
Return <var>n</var> new term references. The first term reference is 
returned. The others are <var><var>t</var>+1</var>, <var><var>t</var>+2</var>, 
etc. There are two reasons for using this function. <a class="func" href="foreigninclude.html#PL_open_query()">PL_open_query()</a> 
expects the arguments as a set of consecutive term references, and <em>very</em> 
time-critical code requiring a number of term references can be written 
as:

<pre class="code">
pl_mypredicate(term_t a0, term_t a1)
{ term_t t0 = PL_new_term_refs(2);
  term_t t1 = t0+1;

  ...
}
</pre>

</dd>
<dt class="pubdef"><a id="PL_copy_term_ref()"><var>term_t</var> <strong>PL_copy_term_ref</strong>(<var>term_t 
from</var>)</a></dt>
<dd class="defbody">
Create a new term reference and make it point initially to the same term 
as <var>from</var>. This function is commonly used to copy a predicate 
argument to a term reference that may be written.
</dd>
<dt class="pubdef"><a id="PL_reset_term_refs()"><var>void</var> <strong>PL_reset_term_refs</strong>(<var>term_t 
after</var>)</a></dt>
<dd class="defbody">
Destroy all term references that have been created after <var>after</var>, 
including <var>after</var> itself. Any reference to the invalidated term 
references after this call results in undefined behaviour.

<p>Note that returning from the foreign context to Prolog will reclaim 
all references used in the foreign context. This call is only necessary 
if references are created inside a loop that never exits back to Prolog. 
See also <a class="func" href="foreigninclude.html#PL_open_foreign_frame()">PL_open_foreign_frame()</a>, <a class="func" href="foreigninclude.html#PL_close_foreign_frame()">PL_close_foreign_frame()</a> 
and
<a class="func" href="foreigninclude.html#PL_discard_foreign_frame()">PL_discard_foreign_frame()</a>.
</dd>
</dl>

<p><h4 id="sec:foreign-gc"><a id="sec:10.3.1.1"><span class="sec-nr">10.3.1.1</span> <span class="sec-title">Interaction 
with the garbage collector and stack-shifter</span></a></h4>

<a id="sec:foreign-gc"></a>

<p>Prolog implements two mechanisms for avoiding stack overflow: garbage 
collection and stack expansion. On machines that allow for it, Prolog 
will use virtual memory management to detect stack overflow and expand 
the runtime stacks. On other machines Prolog will reallocate the stacks 
and update all pointers to them. To do so, Prolog needs to know which 
data is referenced by C code. As all Prolog data known by C is 
referenced through term references (<code>term_t</code>), Prolog has all 
the information necessary to perform its memory management without 
special precautions from the C programmer.

<p><h3 id="sec:foreign-types"><a id="sec:10.3.2"><span class="sec-nr">10.3.2</span> <span class="sec-title">Other 
foreign interface types</span></a></h3>

<a id="sec:foreign-types"></a>

<dl class="latex">
<dt><b>atom_t</b></dt>
<dd>
An atom in Prolog's internal representation. Atoms are pointers to an 
opaque structure. They are a unique representation for represented text, 
which implies that atom <var>A</var> represents the same text as atom <var>B</var> 
if and only if <var>A</var> and <var>B</var> are the same pointer.

<p>Atoms are the central representation for textual constants in Prolog. 
The transformation of a character string <var>C</var> to an atom implies 
a hash-table lookup. If the same atom is needed often, it is advised to 
store its reference in a global variable to avoid repeated lookup.
</dd>
<dt><b>functor_t</b></dt>
<dd>
A functor is the internal representation of a name/arity pair. They are 
used to find the name and arity of a compound term as well as to 
construct new compound terms. Like atoms they live for the whole Prolog 
session and are unique.
</dd>
<dt><b>predicate_t</b></dt>
<dd>
Handle to a Prolog predicate. Predicate handles live forever (although 
they can lose their definition).
</dd>
<dt><b>qid_t</b></dt>
<dd>
Query identifier. Used by
<a class="func" href="foreigninclude.html#PL_open_query()">PL_open_query()</a>, <a class="func" href="foreigninclude.html#PL_next_solution()">PL_next_solution()</a> 
and <a class="func" href="foreigninclude.html#PL_close_query()">PL_close_query()</a> 
to handle backtracking from C.
</dd>
<dt><b>fid_t</b></dt>
<dd>
Frame identifier. Used by
<a class="func" href="foreigninclude.html#PL_open_foreign_frame()">PL_open_foreign_frame()</a> 
and <a class="func" href="foreigninclude.html#PL_close_foreign_frame()">PL_close_foreign_frame()</a>.
</dd>
<dt><b>module_t</b></dt>
<dd>
A module is a unique handle to a Prolog module. Modules are used only to 
call predicates in a specific module.
</dd>
<dt><b>foreign_t</b></dt>
<dd>
Return type for a C function implementing a Prolog predicate.
</dd>
<dt><b>control_t</b></dt>
<dd>
Passed as additional argument to non-deterministic foreign functions. 
See PL_retry*() and PL_foreign_context*().
</dd>
<dt><b>install_t</b></dt>
<dd>
Type for the install() and uninstall() functions of shared or dynamic 
link libraries. See <a class="sec" href="foreignlink.html">section 
10.2.3</a>.
</dd>
<dt><b>int64_t</b></dt>
<dd>
Actually part of the C99 standard rather than Prolog. As of version 
5.5.6, Prolog integers are 64-bit on all hardware. The C99 type
<code>int64_t</code> is defined in the <code>stdint.h</code> standard 
header and provides platform-independent 64-bit integers. Portable code 
accessing Prolog should use this type to exchange integer values. Please 
note that
<a class="func" href="foreigninclude.html#PL_get_long()">PL_get_long()</a> 
can return <code>FALSE</code> on Prolog integers that cannot be 
represented as a C long. Robust code should not assume any of the 
integer fetching functions to succeed, <em>even</em> if the Prolog term 
is known to be an integer.
</dd>
</dl>

<p></body></html>