OSDN Git Service

Please enter the commit message for your changes. Lines starting
[eos/hostdependX86LINUX64.git] / util / X86LINUX64 / man / man3 / Tcl_DuplicateObj.3
1 '\"
2 '\" Copyright (c) 1996-1997 Sun Microsystems, Inc.
3 '\"
4 '\" See the file "license.terms" for information on usage and redistribution
5 '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
6 '\" 
7 .TH Tcl_Obj 3 8.5 Tcl "Tcl Library Procedures"
8 .\" The -*- nroff -*- definitions below are for supplemental macros used
9 .\" in Tcl/Tk manual entries.
10 .\"
11 .\" .AP type name in/out ?indent?
12 .\"     Start paragraph describing an argument to a library procedure.
13 .\"     type is type of argument (int, etc.), in/out is either "in", "out",
14 .\"     or "in/out" to describe whether procedure reads or modifies arg,
15 .\"     and indent is equivalent to second arg of .IP (shouldn't ever be
16 .\"     needed;  use .AS below instead)
17 .\"
18 .\" .AS ?type? ?name?
19 .\"     Give maximum sizes of arguments for setting tab stops.  Type and
20 .\"     name are examples of largest possible arguments that will be passed
21 .\"     to .AP later.  If args are omitted, default tab stops are used.
22 .\"
23 .\" .BS
24 .\"     Start box enclosure.  From here until next .BE, everything will be
25 .\"     enclosed in one large box.
26 .\"
27 .\" .BE
28 .\"     End of box enclosure.
29 .\"
30 .\" .CS
31 .\"     Begin code excerpt.
32 .\"
33 .\" .CE
34 .\"     End code excerpt.
35 .\"
36 .\" .VS ?version? ?br?
37 .\"     Begin vertical sidebar, for use in marking newly-changed parts
38 .\"     of man pages.  The first argument is ignored and used for recording
39 .\"     the version when the .VS was added, so that the sidebars can be
40 .\"     found and removed when they reach a certain age.  If another argument
41 .\"     is present, then a line break is forced before starting the sidebar.
42 .\"
43 .\" .VE
44 .\"     End of vertical sidebar.
45 .\"
46 .\" .DS
47 .\"     Begin an indented unfilled display.
48 .\"
49 .\" .DE
50 .\"     End of indented unfilled display.
51 .\"
52 .\" .SO ?manpage?
53 .\"     Start of list of standard options for a Tk widget. The manpage
54 .\"     argument defines where to look up the standard options; if
55 .\"     omitted, defaults to "options". The options follow on successive
56 .\"     lines, in three columns separated by tabs.
57 .\"
58 .\" .SE
59 .\"     End of list of standard options for a Tk widget.
60 .\"
61 .\" .OP cmdName dbName dbClass
62 .\"     Start of description of a specific option.  cmdName gives the
63 .\"     option's name as specified in the class command, dbName gives
64 .\"     the option's name in the option database, and dbClass gives
65 .\"     the option's class in the option database.
66 .\"
67 .\" .UL arg1 arg2
68 .\"     Print arg1 underlined, then print arg2 normally.
69 .\"
70 .\" .QW arg1 ?arg2?
71 .\"     Print arg1 in quotes, then arg2 normally (for trailing punctuation).
72 .\"
73 .\" .PQ arg1 ?arg2?
74 .\"     Print an open parenthesis, arg1 in quotes, then arg2 normally
75 .\"     (for trailing punctuation) and then a closing parenthesis.
76 .\"
77 .\"     # Set up traps and other miscellaneous stuff for Tcl/Tk man pages.
78 .if t .wh -1.3i ^B
79 .nr ^l \n(.l
80 .ad b
81 .\"     # Start an argument description
82 .de AP
83 .ie !"\\$4"" .TP \\$4
84 .el \{\
85 .   ie !"\\$2"" .TP \\n()Cu
86 .   el          .TP 15
87 .\}
88 .ta \\n()Au \\n()Bu
89 .ie !"\\$3"" \{\
90 \&\\$1 \\fI\\$2\\fP (\\$3)
91 .\".b
92 .\}
93 .el \{\
94 .br
95 .ie !"\\$2"" \{\
96 \&\\$1  \\fI\\$2\\fP
97 .\}
98 .el \{\
99 \&\\fI\\$1\\fP
100 .\}
101 .\}
102 ..
103 .\"     # define tabbing values for .AP
104 .de AS
105 .nr )A 10n
106 .if !"\\$1"" .nr )A \\w'\\$1'u+3n
107 .nr )B \\n()Au+15n
108 .\"
109 .if !"\\$2"" .nr )B \\w'\\$2'u+\\n()Au+3n
110 .nr )C \\n()Bu+\\w'(in/out)'u+2n
111 ..
112 .AS Tcl_Interp Tcl_CreateInterp in/out
113 .\"     # BS - start boxed text
114 .\"     # ^y = starting y location
115 .\"     # ^b = 1
116 .de BS
117 .br
118 .mk ^y
119 .nr ^b 1u
120 .if n .nf
121 .if n .ti 0
122 .if n \l'\\n(.lu\(ul'
123 .if n .fi
124 ..
125 .\"     # BE - end boxed text (draw box now)
126 .de BE
127 .nf
128 .ti 0
129 .mk ^t
130 .ie n \l'\\n(^lu\(ul'
131 .el \{\
132 .\"     Draw four-sided box normally, but don't draw top of
133 .\"     box if the box started on an earlier page.
134 .ie !\\n(^b-1 \{\
135 \h'-1.5n'\L'|\\n(^yu-1v'\l'\\n(^lu+3n\(ul'\L'\\n(^tu+1v-\\n(^yu'\l'|0u-1.5n\(ul'
136 .\}
137 .el \}\
138 \h'-1.5n'\L'|\\n(^yu-1v'\h'\\n(^lu+3n'\L'\\n(^tu+1v-\\n(^yu'\l'|0u-1.5n\(ul'
139 .\}
140 .\}
141 .fi
142 .br
143 .nr ^b 0
144 ..
145 .\"     # VS - start vertical sidebar
146 .\"     # ^Y = starting y location
147 .\"     # ^v = 1 (for troff;  for nroff this doesn't matter)
148 .de VS
149 .if !"\\$2"" .br
150 .mk ^Y
151 .ie n 'mc \s12\(br\s0
152 .el .nr ^v 1u
153 ..
154 .\"     # VE - end of vertical sidebar
155 .de VE
156 .ie n 'mc
157 .el \{\
158 .ev 2
159 .nf
160 .ti 0
161 .mk ^t
162 \h'|\\n(^lu+3n'\L'|\\n(^Yu-1v\(bv'\v'\\n(^tu+1v-\\n(^Yu'\h'-|\\n(^lu+3n'
163 .sp -1
164 .fi
165 .ev
166 .\}
167 .nr ^v 0
168 ..
169 .\"     # Special macro to handle page bottom:  finish off current
170 .\"     # box/sidebar if in box/sidebar mode, then invoked standard
171 .\"     # page bottom macro.
172 .de ^B
173 .ev 2
174 'ti 0
175 'nf
176 .mk ^t
177 .if \\n(^b \{\
178 .\"     Draw three-sided box if this is the box's first page,
179 .\"     draw two sides but no top otherwise.
180 .ie !\\n(^b-1 \h'-1.5n'\L'|\\n(^yu-1v'\l'\\n(^lu+3n\(ul'\L'\\n(^tu+1v-\\n(^yu'\h'|0u'\c
181 .el \h'-1.5n'\L'|\\n(^yu-1v'\h'\\n(^lu+3n'\L'\\n(^tu+1v-\\n(^yu'\h'|0u'\c
182 .\}
183 .if \\n(^v \{\
184 .nr ^x \\n(^tu+1v-\\n(^Yu
185 \kx\h'-\\nxu'\h'|\\n(^lu+3n'\ky\L'-\\n(^xu'\v'\\n(^xu'\h'|0u'\c
186 .\}
187 .bp
188 'fi
189 .ev
190 .if \\n(^b \{\
191 .mk ^y
192 .nr ^b 2
193 .\}
194 .if \\n(^v \{\
195 .mk ^Y
196 .\}
197 ..
198 .\"     # DS - begin display
199 .de DS
200 .RS
201 .nf
202 .sp
203 ..
204 .\"     # DE - end display
205 .de DE
206 .fi
207 .RE
208 .sp
209 ..
210 .\"     # SO - start of list of standard options
211 .de SO
212 'ie '\\$1'' .ds So \\fBoptions\\fR
213 'el .ds So \\fB\\$1\\fR
214 .SH "STANDARD OPTIONS"
215 .LP
216 .nf
217 .ta 5.5c 11c
218 .ft B
219 ..
220 .\"     # SE - end of list of standard options
221 .de SE
222 .fi
223 .ft R
224 .LP
225 See the \\*(So manual entry for details on the standard options.
226 ..
227 .\"     # OP - start of full description for a single option
228 .de OP
229 .LP
230 .nf
231 .ta 4c
232 Command-Line Name:      \\fB\\$1\\fR
233 Database Name:  \\fB\\$2\\fR
234 Database Class: \\fB\\$3\\fR
235 .fi
236 .IP
237 ..
238 .\"     # CS - begin code excerpt
239 .de CS
240 .RS
241 .nf
242 .ta .25i .5i .75i 1i
243 ..
244 .\"     # CE - end code excerpt
245 .de CE
246 .fi
247 .RE
248 ..
249 .\"     # UL - underline word
250 .de UL
251 \\$1\l'|0\(ul'\\$2
252 ..
253 .\"     # QW - apply quotation marks to word
254 .de QW
255 .ie '\\*(lq'"' ``\\$1''\\$2
256 .\"" fix emacs highlighting
257 .el \\*(lq\\$1\\*(rq\\$2
258 ..
259 .\"     # PQ - apply parens and quotation marks to word
260 .de PQ
261 .ie '\\*(lq'"' (``\\$1''\\$2)\\$3
262 .\"" fix emacs highlighting
263 .el (\\*(lq\\$1\\*(rq\\$2)\\$3
264 ..
265 .\"     # QR - quoted range
266 .de QR
267 .ie '\\*(lq'"' ``\\$1''\\-``\\$2''\\$3
268 .\"" fix emacs highlighting
269 .el \\*(lq\\$1\\*(rq\\-\\*(lq\\$2\\*(rq\\$3
270 ..
271 .\"     # MT - "empty" string
272 .de MT
273 .QW ""
274 ..
275 .BS
276 .SH NAME
277 Tcl_NewObj, Tcl_DuplicateObj, Tcl_IncrRefCount, Tcl_DecrRefCount, Tcl_IsShared, Tcl_InvalidateStringRep \- manipulate Tcl values
278 .SH SYNOPSIS
279 .nf
280 \fB#include <tcl.h>\fR
281 .sp
282 Tcl_Obj *
283 \fBTcl_NewObj\fR()
284 .sp
285 Tcl_Obj *
286 \fBTcl_DuplicateObj\fR(\fIobjPtr\fR)
287 .sp
288 \fBTcl_IncrRefCount\fR(\fIobjPtr\fR)
289 .sp
290 \fBTcl_DecrRefCount\fR(\fIobjPtr\fR)
291 .sp
292 int
293 \fBTcl_IsShared\fR(\fIobjPtr\fR)
294 .sp
295 \fBTcl_InvalidateStringRep\fR(\fIobjPtr\fR)
296 .SH ARGUMENTS
297 .AS Tcl_Obj *objPtr
298 .AP Tcl_Obj *objPtr in
299 Points to a value;
300 must have been the result of a previous call to \fBTcl_NewObj\fR.
301 .BE
302 .SH INTRODUCTION
303 .PP
304 This man page presents an overview of Tcl values (called \fBTcl_Obj\fRs for
305 historical reasons) and how they are used.
306 It also describes generic procedures for managing Tcl values.
307 These procedures are used to create and copy values,
308 and increment and decrement the count of references (pointers) to values.
309 The procedures are used in conjunction with ones
310 that operate on specific types of values such as
311 \fBTcl_GetIntFromObj\fR and \fBTcl_ListObjAppendElement\fR.
312 The individual procedures are described along with the data structures
313 they manipulate.
314 .PP
315 Tcl's \fIdual-ported\fR values provide a general-purpose mechanism
316 for storing and exchanging Tcl values.
317 They largely replace the use of strings in Tcl.
318 For example, they are used to store variable values,
319 command arguments, command results, and scripts.
320 Tcl values behave like strings but also hold an internal representation
321 that can be manipulated more efficiently.
322 For example, a Tcl list is now represented as a value
323 that holds the list's string representation
324 as well as an array of pointers to the values for each list element.
325 Dual-ported values avoid most runtime type conversions.
326 They also improve the speed of many operations
327 since an appropriate representation is immediately available.
328 The compiler itself uses Tcl values to
329 cache the instruction bytecodes resulting from compiling scripts.
330 .PP
331 The two representations are a cache of each other and are computed lazily.
332 That is, each representation is only computed when necessary,
333 it is computed from the other representation,
334 and, once computed, it is saved.
335 In addition, a change in one representation invalidates the other one.
336 As an example, a Tcl program doing integer calculations can
337 operate directly on a variable's internal machine integer
338 representation without having to constantly convert
339 between integers and strings.
340 Only when it needs a string representing the variable's value,
341 say to print it,
342 will the program regenerate the string representation from the integer.
343 Although values contain an internal representation,
344 their semantics are defined in terms of strings:
345 an up-to-date string can always be obtained,
346 and any change to the value will be reflected in that string
347 when the value's string representation is fetched.
348 Because of this representation invalidation and regeneration,
349 it is dangerous for extension writers to access
350 \fBTcl_Obj\fR fields directly.
351 It is better to access Tcl_Obj information using
352 procedures like \fBTcl_GetStringFromObj\fR and \fBTcl_GetString\fR.
353 .PP
354 Values are allocated on the heap
355 and are referenced using a pointer to their \fBTcl_Obj\fR structure.
356 Values are shared as much as possible.
357 This significantly reduces storage requirements
358 because some values such as long lists are very large.
359 Also, most Tcl values are only read and never modified.
360 This is especially true for procedure arguments,
361 which can be shared between the caller and the called procedure.
362 Assignment and argument binding is done by
363 simply assigning a pointer to the value. 
364 Reference counting is used to determine when it is safe to
365 reclaim a value's storage.
366 .PP
367 Tcl values are typed.
368 A value's internal representation is controlled by its type.
369 Several types are predefined in the Tcl core
370 including integer, double, list, and bytecode.
371 Extension writers can extend the set of types
372 by defining their own \fBTcl_ObjType\fR structs.
373 .SH "THE TCL_OBJ STRUCTURE"
374 .PP
375 Each Tcl value is represented by a \fBTcl_Obj\fR structure
376 which is defined as follows.
377 .PP
378 .CS
379 typedef struct Tcl_Obj {
380     int \fIrefCount\fR;
381     char *\fIbytes\fR;
382     int \fIlength\fR;
383     const Tcl_ObjType *\fItypePtr\fR;
384     union {
385         long \fIlongValue\fR;
386         double \fIdoubleValue\fR;
387         void *\fIotherValuePtr\fR;
388         Tcl_WideInt \fIwideValue\fR;
389         struct {
390             void *\fIptr1\fR;
391             void *\fIptr2\fR;
392         } \fItwoPtrValue\fR;
393         struct {
394             void *\fIptr\fR;
395             unsigned long \fIvalue\fR;
396         } \fIptrAndLongRep\fR;
397     } \fIinternalRep\fR;
398 } \fBTcl_Obj\fR;
399 .CE
400 .PP
401 The \fIbytes\fR and the \fIlength\fR members together hold
402 a value's UTF-8 string representation,
403 which is a \fIcounted string\fR not containing null bytes (UTF-8 null
404 characters should be encoded as a two byte sequence: 192, 128.)
405 \fIbytes\fR points to the first byte of the string representation.
406 The \fIlength\fR member gives the number of bytes.
407 The byte array must always have a null byte after the last data byte,
408 at offset \fIlength\fR;
409 this allows string representations
410 to be treated as conventional null-terminated C strings.
411 C programs use \fBTcl_GetStringFromObj\fR and \fBTcl_GetString\fR to get
412 a value's string representation.
413 If \fIbytes\fR is NULL,
414 the string representation is invalid.
415 .PP
416 A value's type manages its internal representation.
417 The member \fItypePtr\fR points to the Tcl_ObjType structure
418 that describes the type.
419 If \fItypePtr\fR is NULL,
420 the internal representation is invalid.
421 .PP
422 The \fIinternalRep\fR union member holds
423 a value's internal representation.
424 This is either a (long) integer, a double-precision floating-point number,
425 a pointer to a value containing additional information
426 needed by the value's type to represent the value, a Tcl_WideInt
427 integer, two arbitrary pointers, or a pair made up of an unsigned long
428 integer and a pointer.
429 .PP
430 The \fIrefCount\fR member is used to tell when it is safe to free
431 a value's storage.
432 It holds the count of active references to the value.
433 Maintaining the correct reference count is a key responsibility
434 of extension writers.
435 Reference counting is discussed below
436 in the section \fBSTORAGE MANAGEMENT OF VALUES\fR.
437 .PP
438 Although extension writers can directly access
439 the members of a Tcl_Obj structure,
440 it is much better to use the appropriate procedures and macros.
441 For example, extension writers should never
442 read or update \fIrefCount\fR directly;
443 they should use macros such as
444 \fBTcl_IncrRefCount\fR and \fBTcl_IsShared\fR instead.
445 .PP
446 A key property of Tcl values is that they hold two representations.
447 A value typically starts out containing only a string representation:
448 it is untyped and has a NULL \fItypePtr\fR.
449 A value containing an empty string or a copy of a specified string
450 is created using \fBTcl_NewObj\fR or \fBTcl_NewStringObj\fR respectively.
451 A value's string value is gotten with
452 \fBTcl_GetStringFromObj\fR or \fBTcl_GetString\fR
453 and changed with \fBTcl_SetStringObj\fR.
454 If the value is later passed to a procedure like \fBTcl_GetIntFromObj\fR
455 that requires a specific internal representation,
456 the procedure will create one and set the value's \fItypePtr\fR.
457 The internal representation is computed from the string representation.
458 A value's two representations are duals of each other:
459 changes made to one are reflected in the other.
460 For example, \fBTcl_ListObjReplace\fR will modify a value's
461 internal representation and the next call to \fBTcl_GetStringFromObj\fR
462 or \fBTcl_GetString\fR will reflect that change.
463 .PP
464 Representations are recomputed lazily for efficiency.
465 A change to one representation made by a procedure
466 such as \fBTcl_ListObjReplace\fR is not reflected immediately
467 in the other representation.
468 Instead, the other representation is marked invalid
469 so that it is only regenerated if it is needed later.
470 Most C programmers never have to be concerned with how this is done
471 and simply use procedures such as \fBTcl_GetBooleanFromObj\fR or
472 \fBTcl_ListObjIndex\fR.
473 Programmers that implement their own value types
474 must check for invalid representations
475 and mark representations invalid when necessary.
476 The procedure \fBTcl_InvalidateStringRep\fR is used
477 to mark a value's string representation invalid and to
478 free any storage associated with the old string representation.
479 .PP
480 Values usually remain one type over their life,
481 but occasionally a value must be converted from one type to another.
482 For example, a C program might build up a string in a value
483 with repeated calls to \fBTcl_AppendToObj\fR,
484 and then call \fBTcl_ListObjIndex\fR to extract a list element from
485 the value.
486 The same value holding the same string value
487 can have several different internal representations
488 at different times.
489 Extension writers can also force a value to be converted from one type
490 to another using the \fBTcl_ConvertToType\fR procedure.
491 Only programmers that create new value types need to be concerned
492 about how this is done.
493 A procedure defined as part of the value type's implementation
494 creates a new internal representation for a value
495 and changes its \fItypePtr\fR.
496 See the man page for \fBTcl_RegisterObjType\fR
497 to see how to create a new value type.
498 .SH "EXAMPLE OF THE LIFETIME OF A VALUE"
499 .PP
500 As an example of the lifetime of a value,
501 consider the following sequence of commands:
502 .PP
503 .CS
504 \fBset x 123\fR
505 .CE
506 .PP
507 This assigns to \fIx\fR an untyped value whose
508 \fIbytes\fR member points to \fB123\fR and \fIlength\fR member contains 3.
509 The value's \fItypePtr\fR member is NULL.
510 .PP
511 .CS
512 \fBputs "x is $x"\fR
513 .CE
514 .PP
515 \fIx\fR's string representation is valid (since \fIbytes\fR is non-NULL)
516 and is fetched for the command.
517 .PP
518 .CS
519 \fBincr x\fR
520 .CE
521 .PP
522 The \fBincr\fR command first gets an integer from \fIx\fR's value
523 by calling \fBTcl_GetIntFromObj\fR.
524 This procedure checks whether the value is already an integer value.
525 Since it is not, it converts the value
526 by setting the value's \fIinternalRep.longValue\fR member
527 to the integer \fB123\fR
528 and setting the value's \fItypePtr\fR
529 to point to the integer Tcl_ObjType structure.
530 Both representations are now valid.
531 \fBincr\fR increments the value's integer internal representation
532 then invalidates its string representation
533 (by calling \fBTcl_InvalidateStringRep\fR)
534 since the string representation
535 no longer corresponds to the internal representation.
536 .PP
537 .CS
538 \fBputs "x is now $x"\fR
539 .CE
540 .PP
541 The string representation of \fIx\fR's value is needed
542 and is recomputed.
543 The string representation is now \fB124\fR
544 and both representations are again valid.
545 .SH "STORAGE MANAGEMENT OF VALUES"
546 .PP
547 Tcl values are allocated on the heap and are shared as much as possible
548 to reduce storage requirements.
549 Reference counting is used to determine when a value is
550 no longer needed and can safely be freed.
551 A value just created by \fBTcl_NewObj\fR or \fBTcl_NewStringObj\fR
552 has \fIrefCount\fR 0.
553 The macro \fBTcl_IncrRefCount\fR increments the reference count
554 when a new reference to the value is created.
555 The macro \fBTcl_DecrRefCount\fR decrements the count
556 when a reference is no longer needed and,
557 if the value's reference count drops to zero, frees its storage.
558 A value shared by different code or data structures has
559 \fIrefCount\fR greater than 1.
560 Incrementing a value's reference count ensures that
561 it will not be freed too early or have its value change accidentally.
562 .PP
563 As an example, the bytecode interpreter shares argument values
564 between calling and called Tcl procedures to avoid having to copy values.
565 It assigns the call's argument values to the procedure's
566 formal parameter variables.
567 In doing so, it calls \fBTcl_IncrRefCount\fR to increment
568 the reference count of each argument since there is now a new
569 reference to it from the formal parameter.
570 When the called procedure returns,
571 the interpreter calls \fBTcl_DecrRefCount\fR to decrement
572 each argument's reference count.
573 When a value's reference count drops less than or equal to zero,
574 \fBTcl_DecrRefCount\fR reclaims its storage.
575 Most command procedures do not have to be concerned about
576 reference counting since they use a value's value immediately
577 and do not retain a pointer to the value after they return.
578 However, if they do retain a pointer to a value in a data structure,
579 they must be careful to increment its reference count
580 since the retained pointer is a new reference.
581 .PP
582 Command procedures that directly modify values
583 such as those for \fBlappend\fR and \fBlinsert\fR must be careful to
584 copy a shared value before changing it.
585 They must first check whether the value is shared
586 by calling \fBTcl_IsShared\fR.
587 If the value is shared they must copy the value
588 by using \fBTcl_DuplicateObj\fR;
589 this returns a new duplicate of the original value
590 that has \fIrefCount\fR 0.
591 If the value is not shared,
592 the command procedure
593 .QW "owns"
594 the value and can safely modify it directly.
595 For example, the following code appears in the command procedure
596 that implements \fBlinsert\fR.
597 This procedure modifies the list value passed to it in \fIobjv[1]\fR
598 by inserting \fIobjc-3\fR new elements before \fIindex\fR.
599 .PP
600 .CS
601 listPtr = objv[1];
602 if (\fBTcl_IsShared\fR(listPtr)) {
603     listPtr = \fBTcl_DuplicateObj\fR(listPtr);
604 }
605 result = Tcl_ListObjReplace(interp, listPtr, index, 0,
606         (objc-3), &(objv[3]));
607 .CE
608 .PP
609 As another example, \fBincr\fR's command procedure
610 must check whether the variable's value is shared before
611 incrementing the integer in its internal representation.
612 If it is shared, it needs to duplicate the value
613 in order to avoid accidentally changing values in other data structures.
614 .SH "SEE ALSO"
615 Tcl_ConvertToType(3), Tcl_GetIntFromObj(3), Tcl_ListObjAppendElement(3), Tcl_ListObjIndex(3), Tcl_ListObjReplace(3), Tcl_RegisterObjType(3)
616 .SH KEYWORDS
617 internal representation, value, value creation, value type,
618 reference counting, string representation, type conversion