- Timestamp:
- Jun 13, 2017, 11:53:11 AM (8 years ago)
- Branches:
- ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, deferred_resn, demangler, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, with_gc
- Children:
- 35dd0f42, 816d61c
- Parents:
- 8d50e34
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
doc/user/user.tex
r8d50e34 r46e4440e 11 11 %% Created On : Wed Apr 6 14:53:29 2016 12 12 %% Last Modified By : Peter A. Buhr 13 %% Last Modified On : Fri Jun 2 10:07:51201714 %% Update Count : 2 12813 %% Last Modified On : Tue Jun 13 11:50:27 2017 14 %% Update Count : 2403 15 15 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 16 16 … … 454 454 the type suffixes ©U©, ©L©, etc. may start with an underscore ©1_U©, ©1_ll© or ©1.0E10_f©. 455 455 \end{enumerate} 456 It is significantly easier to read and enter long constants when they are broken up into smaller groupings (m ost cultures use commaor period among digits for the same purpose).456 It is significantly easier to read and enter long constants when they are broken up into smaller groupings (many cultures use comma and/or period among digits for the same purpose). 457 457 This extension is backwards compatible, matches with the use of underscore in variable names, and appears in \Index*{Ada} and \Index*{Java} 8. 458 458 … … 464 464 \begin{cfa} 465 465 int ®`®otype®`® = 3; §\C{// make keyword an identifier}§ 466 double ®`® choose®`® = 3.5;467 \end{cfa} 468 Programs can be converted easily by enclosing keyword identifiers in backquotes, and the backquotes can be removed later when the identifier name is changed to anon-keyword name.466 double ®`®forall®`® = 3.5; 467 \end{cfa} 468 Existing C programs with keyword clashes can be converted by enclosing keyword identifiers in backquotes, and eventually the identifier name can be changed to a non-keyword name. 469 469 \VRef[Figure]{f:InterpositionHeaderFile} shows how clashes in C header files (see~\VRef{s:StandardHeaders}) can be handled using preprocessor \newterm{interposition}: ©#include_next© and ©-I filename©: 470 470 … … 473 473 // include file uses the CFA keyword "otype". 474 474 #if ! defined( otype ) §\C{// nesting ?}§ 475 #define otype `otype`475 #define otype ®`®otype®`® §\C{// make keyword an identifier}§ 476 476 #define __CFA_BFD_H__ 477 477 #endif // ! otype … … 497 497 \begin{tabular}{@{}ll@{}} 498 498 \begin{cfa} 499 int * x[5]499 int * x[5] 500 500 \end{cfa} 501 501 & … … 508 508 For example, a routine returning a \Index{pointer} to an array of integers is defined and used in the following way: 509 509 \begin{cfa} 510 int (*f())[5] {...}; §\C{}§511 ... (*f())[3] += 1; 510 int ®(*®f®())[®5®]® {...}; §\C{definition}§ 511 ... ®(*®f®())[®3®]® += 1; §\C{usage}§ 512 512 \end{cfa} 513 513 Essentially, the return type is wrapped around the routine name in successive layers (like an \Index{onion}). … … 516 516 \CFA provides its own type, variable and routine declarations, using a different syntax. 517 517 The new declarations place qualifiers to the left of the base type, while C declarations place qualifiers to the right of the base type. 518 In the following example, \R{red} is for the base type and \B{blue} is for thequalifiers.518 In the following example, \R{red} is the base type and \B{blue} is qualifiers. 519 519 The \CFA declarations move the qualifiers to the left of the base type, \ie move the blue to the left of the red, while the qualifiers have the same meaning but are ordered left to right to specify a variable's type. 520 520 \begin{quote2} … … 534 534 \end{tabular} 535 535 \end{quote2} 536 The only exception is bit fieldspecification, which always appear to the right of the base type.536 The only exception is \Index{bit field} specification, which always appear to the right of the base type. 537 537 % Specifically, the character ©*© is used to indicate a pointer, square brackets ©[©\,©]© are used to represent an array or function return value, and parentheses ©()© are used to indicate a routine parameter. 538 538 However, unlike C, \CFA type declaration tokens are distributed across all variables in the declaration list. … … 583 583 \begin{cfa} 584 584 int z[ 5 ]; 585 char * w[ 5 ];586 double (* v)[ 5 ];585 char * w[ 5 ]; 586 double (* v)[ 5 ]; 587 587 struct s { 588 588 int f0:3; 589 int * f1;590 int * f2[ 5 ]589 int * f1; 590 int * f2[ 5 ] 591 591 }; 592 592 \end{cfa} … … 637 637 \begin{cfa} 638 638 int extern x[ 5 ]; 639 const int static * y;639 const int static * y; 640 640 \end{cfa} 641 641 & … … 658 658 \begin{cfa} 659 659 y = (®int *®)x; 660 i = sizeof(®int * [ 5 ]®);660 i = sizeof(®int * [ 5 ]®); 661 661 \end{cfa} 662 662 \end{tabular} … … 672 672 C provides a \newterm{pointer type}; 673 673 \CFA adds a \newterm{reference type}. 674 These types may be derived from a object or routine type, called the \newterm{referenced type}.674 These types may be derived from an object or routine type, called the \newterm{referenced type}. 675 675 Objects of these types contain an \newterm{address}, which is normally a location in memory, but may also address memory-mapped registers in hardware devices. 676 676 An integer constant expression with the value 0, or such an expression cast to type ©void *©, is called a \newterm{null-pointer constant}.\footnote{ … … 729 729 730 730 A \Index{pointer}/\Index{reference} object is a generalization of an object variable-name, \ie a mutable address that can point to more than one memory location during its lifetime. 731 (Similarly, an integer variable can contain multiple integer literals during its lifetime versus an integer constant representing a single literal during its lifetime, and like a variable name, may not occupy storage asthe literal is embedded directly into instructions.)731 (Similarly, an integer variable can contain multiple integer literals during its lifetime versus an integer constant representing a single literal during its lifetime, and like a variable name, may not occupy storage if the literal is embedded directly into instructions.) 732 732 Hence, a pointer occupies memory to store its current address, and the pointer's value is loaded by dereferencing, \eg: 733 733 \begin{quote2} … … 758 758 \begin{cfa} 759 759 p1 = p2; §\C{// p1 = p2\ \ rather than\ \ *p1 = *p2}§ 760 p2 = p1 + x; §\C{// p2 = p1 + x\ \ rather than\ \ *p 1= *p1 + x}§760 p2 = p1 + x; §\C{// p2 = p1 + x\ \ rather than\ \ *p2 = *p1 + x}§ 761 761 \end{cfa} 762 762 even though the assignment to ©p2© is likely incorrect, and the programmer probably meant: … … 765 765 ®*®p2 = ®*®p1 + x; §\C{// pointed-to value assignment / operation}§ 766 766 \end{cfa} 767 The C semantics work swell for situations where manipulation of addresses is the primary meaning and data is rarely accessed, such as storage management (©malloc©/©free©).767 The C semantics work well for situations where manipulation of addresses is the primary meaning and data is rarely accessed, such as storage management (©malloc©/©free©). 768 768 769 769 However, in most other situations, the pointed-to value is requested more often than the pointer address. … … 799 799 For a \CFA reference type, the cancellation on the left-hand side of assignment leaves the reference as an address (\Index{lvalue}): 800 800 \begin{cfa} 801 (&®*®)r1 = &x; §\C{// (\&*) cancel giving address ofr1 not variable pointed-to by r1}§801 (&®*®)r1 = &x; §\C{// (\&*) cancel giving address in r1 not variable pointed-to by r1}§ 802 802 \end{cfa} 803 803 Similarly, the address of a reference can be obtained for assignment or computation (\Index{rvalue}): 804 804 \begin{cfa} 805 (&(&®*®)®*®)r3 = &(&®*®)r2; §\C{// (\&*) cancel giving address of r2, (\&(\&*)*) cancel giving address ofr3}§805 (&(&®*®)®*®)r3 = &(&®*®)r2; §\C{// (\&*) cancel giving address in r2, (\&(\&*)*) cancel giving address in r3}§ 806 806 \end{cfa} 807 807 Cancellation\index{cancellation!pointer/reference}\index{pointer!cancellation} works to arbitrary depth. … … 824 824 As for a pointer type, a reference type may have qualifiers: 825 825 \begin{cfa} 826 const int cx = 5; §\C{// cannot change cx;}§827 const int & cr = cx; §\C{// cannot change what cr points to}§828 ®&®cr = &cx; §\C{// can change cr}§829 cr = 7; §\C{// error, cannot change cx}§830 int & const rc = x; §\C{// must be initialized}§831 ®&®rc = &x; §\C{// error, cannot change rc}§832 const int & const crc = cx; §\C{// must be initialized}§833 crc = 7; §\C{// error, cannot change cx}§834 ®&®crc = &cx; §\C{// error, cannot change crc}§835 \end{cfa} 836 Hence, for type ©& const©, there is no pointer assignment, so ©&rc = &x© is disallowed, and \emph{the address value cannot be the null pointer unless an arbitrary pointer is coerced into the reference}:837 \begin{cfa} 838 int & const cr = *0; §\C{// where 0 is the int * zero}§839 \end{cfa} 840 Note, constant reference-types do not prevent addressing errorsbecause of explicit storage-management:826 const int cx = 5; §\C{// cannot change cx;}§ 827 const int & cr = cx; §\C{// cannot change what cr points to}§ 828 ®&®cr = &cx; §\C{// can change cr}§ 829 cr = 7; §\C{// error, cannot change cx}§ 830 int & const rc = x; §\C{// must be initialized}§ 831 ®&®rc = &x; §\C{// error, cannot change rc}§ 832 const int & const crc = cx; §\C{// must be initialized}§ 833 crc = 7; §\C{// error, cannot change cx}§ 834 ®&®crc = &cx; §\C{// error, cannot change crc}§ 835 \end{cfa} 836 Hence, for type ©& const©, there is no pointer assignment, so ©&rc = &x© is disallowed, and \emph{the address value cannot be the null pointer unless an arbitrary pointer is coerced\index{coercion} into the reference}: 837 \begin{cfa} 838 int & const cr = *0; §\C{// where 0 is the int * zero}§ 839 \end{cfa} 840 Note, constant reference-types do not prevent \Index{addressing errors} because of explicit storage-management: 841 841 \begin{cfa} 842 842 int & const cr = *malloc(); 843 843 cr = 5; 844 delete &cr;845 cr = 7; §\C{// unsound pointer dereference}§846 \end{cfa} 847 848 Finally, the position of the ©const© qualifier \emph{after} the pointer/reference qualifier causes confuse for C programmers.844 free( &cr ); 845 cr = 7; §\C{// unsound pointer dereference}§ 846 \end{cfa} 847 848 The position of the ©const© qualifier \emph{after} the pointer/reference qualifier causes confuse for C programmers. 849 849 The ©const© qualifier cannot be moved before the pointer/reference qualifier for C style-declarations; 850 \CFA-style declarations attempt to address this issue:850 \CFA-style declarations (see \VRef{s:Declarations}) attempt to address this issue: 851 851 \begin{quote2} 852 852 \begin{tabular}{@{}l@{\hspace{3em}}l@{}} … … 863 863 \end{tabular} 864 864 \end{quote2} 865 where the \CFA declaration is read left-to-right (see \VRef{s:Declarations}). 865 where the \CFA declaration is read left-to-right. 866 867 Finally, like pointers, references are usable and composable with other type operators and generators. 868 \begin{cfa} 869 int w, x, y, z, & ar[3] = { x, y, z }; §\C{// initialize array of references}§ 870 &ar[1] = &w; §\C{// change reference array element}§ 871 typeof( ar[1] ) p; §\C{// (gcc) is int, i.e., the type of referenced object}§ 872 typeof( &ar[1] ) q; §\C{// (gcc) is int \&, i.e., the type of reference}§ 873 sizeof( ar[1] ) == sizeof( int ); §\C{// is true, i.e., the size of referenced object}§ 874 sizeof( &ar[1] ) == sizeof( int *) §\C{// is true, i.e., the size of a reference}§ 875 \end{cfa} 866 876 867 877 In contrast to \CFA reference types, \Index*[C++]{\CC{}}'s reference types are all ©const© references, preventing changes to the reference address, so only value assignment is possible, which eliminates half of the \Index{address duality}. 878 Also, \CC does not allow \Index{array}s\index{array!reference} of reference\footnote{ 879 The reason for disallowing arrays of reference is unknown, but possibly comes from references being ethereal (like a textual macro), and hence, replaceable by the referant object.} 868 880 \Index*{Java}'s reference types to objects (all Java objects are on the heap) are like C pointers, which always manipulate the address, and there is no (bit-wise) object assignment, so objects are explicitly cloned by shallow or deep copying, which eliminates half of the address duality. 881 882 883 \subsection{Address-of Semantics} 884 885 In C, ©&E© is an rvalue for any expression ©E©. 886 \CFA extends the ©&© (address-of) operator as follows: 887 \begin{itemize} 888 \item 889 if ©R© is an \Index{rvalue} of type ©T &$_1$...&$_r$© where $r \ge 1$ references (©&© symbols) than ©&R© has type ©T ®*®&$_{\color{red}2}$...&$_{\color{red}r}$©, \ie ©T© pointer with $r-1$ references (©&© symbols). 890 891 \item 892 if ©L© is an \Index{lvalue} of type ©T &$_1$...&$_l$© where $l \ge 0$ references (©&© symbols) then ©&L© has type ©T ®*®&$_{\color{red}1}$...&$_{\color{red}l}$©, \ie ©T© pointer with $l$ references (©&© symbols). 893 \end{itemize} 894 The following example shows the first rule applied to different \Index{rvalue} contexts: 895 \begin{cfa} 896 int x, * px, ** ppx, *** pppx, **** ppppx; 897 int & rx = x, && rrx = rx, &&& rrrx = rrx ; 898 x = rrrx; // rrrx is an lvalue with type int &&& (equivalent to x) 899 px = &rrrx; // starting from rrrx, &rrrx is an rvalue with type int *&&& (&x) 900 ppx = &&rrrx; // starting from &rrrx, &&rrrx is an rvalue with type int **&& (&rx) 901 pppx = &&&rrrx; // starting from &&rrrx, &&&rrrx is an rvalue with type int ***& (&rrx) 902 ppppx = &&&&rrrx; // starting from &&&rrrx, &&&&rrrx is an rvalue with type int **** (&rrrx) 903 \end{cfa} 904 The following example shows the second rule applied to different \Index{lvalue} contexts: 905 \begin{cfa} 906 int x, * px, ** ppx, *** pppx; 907 int & rx = x, && rrx = rx, &&& rrrx = rrx ; 908 rrrx = 2; // rrrx is an lvalue with type int &&& (equivalent to x) 909 &rrrx = px; // starting from rrrx, &rrrx is an rvalue with type int *&&& (rx) 910 &&rrrx = ppx; // starting from &rrrx, &&rrrx is an rvalue with type int **&& (rrx) 911 &&&rrrx = pppx; // starting from &&rrrx, &&&rrrx is an rvalue with type int ***& (rrrx) 912 \end{cfa} 913 914 915 \subsection{Conversions} 916 917 C provides a basic implicit conversion to simplify variable usage: 918 \begin{enumerate} 919 \setcounter{enumi}{-1} 920 \item 921 lvalue to rvalue conversion: ©cv T© converts to ©T©, which allows implicit variable dereferencing. 922 \begin{cfa} 923 int x; 924 x + 1; // lvalue variable (int) converts to rvalue for expression 925 \end{cfa} 926 An rvalue has no type qualifiers (©cv©), so the lvalue qualifiers are dropped. 927 \end{enumerate} 928 \CFA provides three new implicit conversion for reference types to simplify reference usage. 929 \begin{enumerate} 930 \item 931 reference to rvalue conversion: ©cv T &© converts to ©T©, which allows implicit reference dereferencing. 932 \begin{cfa} 933 int x, &r = x, f( int p ); 934 x = ®r® + f( ®r® ); // lvalue reference converts to rvalue 935 \end{cfa} 936 An rvalue has no type qualifiers (©cv©), so the reference qualifiers are dropped. 937 938 \item 939 lvalue to reference conversion: \lstinline[deletekeywords={lvalue}]@lvalue-type cv1 T@ converts to ©cv2 T &©, which allows implicitly converting variables to references. 940 \begin{cfa} 941 int x, &r = ®x®, f( int & p ); // lvalue variable (int) convert to reference (int &) 942 f( ®x® ); // lvalue variable (int) convert to reference (int &) 943 \end{cfa} 944 Conversion can restrict a type, where ©cv1© $\le$ ©cv2©, \eg passing an ©int© to a ©const volatile int &©, which has low cost. 945 Conversion can expand a type, where ©cv1© $>$ ©cv2©, \eg passing a ©const volatile int© to an ©int &©, which has high cost (\Index{warning}); 946 furthermore, if ©cv1© has ©const© but not ©cv2©, a temporary variable is created to preserve the immutable lvalue. 947 948 \item 949 rvalue to reference conversion: ©T© converts to ©cv T &©, which allows binding references to temporaries. 950 \begin{cfa} 951 int x, & f( int & p ); 952 f( ®x + 3® ); // rvalue parameter (int) implicitly converts to lvalue temporary reference (int &) 953 ®&f®(...) = &x; // rvalue result (int &) implicitly converts to lvalue temporary reference (int &) 954 \end{cfa} 955 In both case, modifications to the temporary are inaccessible (\Index{warning}). 956 Conversion expands the temporary-type with ©cv©, which is low cost since the temporary is inaccessible. 957 \end{enumerate} 958 959 960 \subsection{Initialization} 869 961 870 962 \Index{Initialization} is different than \Index{assignment} because initialization occurs on the empty (uninitialized) storage on an object, while assignment occurs on possibly initialized storage of an object. … … 872 964 Because the object being initialized has no value, there is only one meaningful semantics with respect to address duality: it must mean address as there is no pointed-to value. 873 965 In contrast, the left-hand side of assignment has an address that has a duality. 874 Therefore, for pointer/reference initialization, the initializing value must be an address (\Index{lvalue}) not a value (\Index{rvalue}). 875 \begin{cfa} 876 int * p = &x; §\C{// must have address of x}§ 877 int & r = x; §\C{// must have address of x}§ 878 \end{cfa} 879 Therefore, it is superfluous to require explicitly taking the address of the initialization object, even though the type is incorrect. 880 Hence, \CFA allows ©r© to be assigned ©x© because it infers a reference for ©x©, by implicitly inserting a address-of operator, ©&©, and it is an error to put an ©&© because the types no longer match. 881 Unfortunately, C allows ©p© to be assigned with ©&x© or ©x©, by value, but most compilers warn about the latter assignment as being potentially incorrect. 882 (\CFA extends pointer initialization so a variable name is automatically referenced, eliminating the unsafe assignment.) 966 Therefore, for pointer/reference initialization, the initializing value must be an address not a value. 967 \begin{cfa} 968 int * p = &x; §\C{// assign address of x}§ 969 ®int * p = x;® §\C{// assign value of x}§ 970 int & r = x; §\C{// must have address of x}§ 971 \end{cfa} 972 Like the previous example with C pointer-arithmetic, it is unlikely assigning the value of ©x© into a pointer is meaningful (again, a warning is usually given). 973 Therefore, for safety, this context requires an address, so it is superfluous to require explicitly taking the address of the initialization object, even though the type is incorrect. 974 Note, this is strictly a convenience and safety feature for a programmer. 975 Hence, \CFA allows ©r© to be assigned ©x© because it infers a reference for ©x©, by implicitly inserting a address-of operator, ©&©, and it is an error to put an ©&© because the types no longer match due to the implicit dereference. 976 Unfortunately, C allows ©p© to be assigned with ©&x© (address) or ©x© (value), but most compilers warn about the latter assignment as being potentially incorrect. 883 977 Similarly, when a reference type is used for a parameter/return type, the call-site argument does not require a reference operator for the same reason. 884 978 \begin{cfa} 885 int & f( int & r ); §\C{// reference parameter and return}§886 z = f( x ) + f( y ); §\C{// reference operator added, temporaries needed for call results}§979 int & f( int & r ); §\C{// reference parameter and return}§ 980 z = f( x ) + f( y ); §\C{// reference operator added, temporaries needed for call results}§ 887 981 \end{cfa} 888 982 Within routine ©f©, it is possible to change the argument by changing the corresponding parameter, and parameter ©r© can be locally reassigned within ©f©. … … 892 986 z = temp1 + temp2; 893 987 \end{cfa} 894 This implicit referencingis crucial for reducing the syntactic burden for programmers when using references;988 This \Index{implicit referencing} is crucial for reducing the syntactic burden for programmers when using references; 895 989 otherwise references have the same syntactic burden as pointers in these contexts. 896 990 … … 899 993 void f( ®const® int & cr ); 900 994 void g( ®const® int * cp ); 901 f( 3 ); g( &3 );902 f( x + y ); g( &(x + y) );995 f( 3 ); g( ®&®3 ); 996 f( x + y ); g( ®&®(x + y) ); 903 997 \end{cfa} 904 998 Here, the compiler passes the address to the literal 3 or the temporary for the expression ©x + y©, knowing the argument cannot be changed through the parameter. 905 (The ©&© is necessary for the pointer-type parameter to make the types match, and is a common requirement for a C programmer.) 999 The ©&© before the constant/expression for the pointer-type parameter (©g©) is a \CFA extension necessary to type match and is a common requirement before a variable in C (\eg ©scanf©). 1000 Importantly, ©&3© may not be equal to ©&3©, where the references occur across calls because the temporaries maybe different on each call. 1001 906 1002 \CFA \emph{extends} this semantics to a mutable pointer/reference parameter, and the compiler implicitly creates the necessary temporary (copying the argument), which is subsequently pointed-to by the reference parameter and can be changed.\footnote{ 907 1003 If whole program analysis is possible, and shows the parameter is not assigned, \ie it is ©const©, the temporary is unnecessary.} … … 909 1005 void f( int & r ); 910 1006 void g( int * p ); 911 f( 3 ); g( &3 ); §\C{// compiler implicit generates temporaries}§912 f( x + y ); g( &(x + y) ); §\C{// compiler implicit generates temporaries}§1007 f( 3 ); g( ®&®3 ); §\C{// compiler implicit generates temporaries}§ 1008 f( x + y ); g( ®&®(x + y) ); §\C{// compiler implicit generates temporaries}§ 913 1009 \end{cfa} 914 1010 Essentially, there is an implicit \Index{rvalue} to \Index{lvalue} conversion in this case.\footnote{ … … 917 1013 918 1014 %\CFA attempts to handle pointers and references in a uniform, symmetric manner. 919 However, C handles routine objects in an inconsistent way.920 A routine object is both a pointer and a reference ( particle and wave).1015 Finally, C handles \Index{routine object}s in an inconsistent way. 1016 A routine object is both a pointer and a reference (\Index{particle and wave}). 921 1017 \begin{cfa} 922 1018 void f( int i ); 923 void (*fp)( int ); 924 fp = f; §\C{// reference initialization}§ 925 fp = &f; §\C{// pointer initialization}§ 926 fp = *f; §\C{// reference initialization}§ 927 fp(3); §\C{// reference invocation}§ 928 (*fp)(3); §\C{// pointer invocation}§ 929 \end{cfa} 930 A routine object is best described by a ©const© reference: 931 \begin{cfa} 932 const void (&fr)( int ) = f; 933 fr = ... §\C{// error, cannot change code}§ 934 &fr = ...; §\C{// changing routine reference}§ 935 fr( 3 ); §\C{// reference call to f}§ 936 (*fr)(3); §\C{// error, incorrect type}§ 1019 void (*fp)( int ); §\C{// routine pointer}§ 1020 fp = f; §\C{// reference initialization}§ 1021 fp = &f; §\C{// pointer initialization}§ 1022 fp = *f; §\C{// reference initialization}§ 1023 fp(3); §\C{// reference invocation}§ 1024 (*fp)(3); §\C{// pointer invocation}§ 1025 \end{cfa} 1026 While C's treatment of routine objects has similarity to inferring a reference type in initialization contexts, the examples are assignment not initialization, and all possible forms of assignment are possible (©f©, ©&f©, ©*f©) without regard for type. 1027 Instead, a routine object should be referenced by a ©const© reference: 1028 \begin{cfa} 1029 ®const® void (®&® fr)( int ) = f; §\C{// routine reference}§ 1030 fr = ... §\C{// error, cannot change code}§ 1031 &fr = ...; §\C{// changing routine reference}§ 1032 fr( 3 ); §\C{// reference call to f}§ 1033 (*fr)(3); §\C{// error, incorrect type}§ 937 1034 \end{cfa} 938 1035 because the value of the routine object is a routine literal, \ie the routine code is normally immutable during execution.\footnote{ 939 1036 Dynamic code rewriting is possible but only in special circumstances.} 940 1037 \CFA allows this additional use of references for routine objects in an attempt to give a more consistent meaning for them. 941 942 This situation is different from inferring with reference type being used ...943 1038 944 1039 … … 1258 1353 \section{Named and Default Arguments} 1259 1354 1260 Named and defaultarguments~\cite{Hardgrave76}\footnote{1355 Named\index{named arguments}\index{arguments!named} and default\index{default arguments}\index{arguments!default} arguments~\cite{Hardgrave76}\footnote{ 1261 1356 Francez~\cite{Francez77} proposed a further extension to the named-parameter passing style, which specifies what type of communication (by value, by reference, by name) the argument is passed to the routine.} 1262 1357 are two mechanisms to simplify routine call. … … 5229 5324 hence, names in these include files are not mangled\index{mangling!name} (see~\VRef{s:Interoperability}). 5230 5325 All other C header files must be explicitly wrapped in ©extern "C"© to prevent name mangling. 5326 For \Index*[C++]{\CC{}}, the name-mangling issue is handled implicitly because most C header-files are augmented with checks for preprocessor variable ©__cplusplus©, which adds appropriate ©extern "C"© qualifiers. 5231 5327 5232 5328 … … 5311 5407 } 5312 5408 5313 // §\CFA§ safe initialization/copy 5409 // §\CFA§ safe initialization/copy, i.e., implicit size specification 5314 5410 forall( dtype T | sized(T) ) T * memset( T * dest, char c );§\indexc{memset}§ 5315 5411 forall( dtype T | sized(T) ) T * memcpy( T * dest, const T * src );§\indexc{memcpy}§ … … 5421 5517 \leavevmode 5422 5518 \begin{cfa}[aboveskip=0pt,belowskip=0pt] 5423 forall( otype T | { int ?<?( T, T ); } ) 5424 T min( T t1, T t2 );§\indexc{min}§ 5425 5426 forall( otype T | { int ?>?( T, T ); } ) 5427 T max( T t1, T t2 );§\indexc{max}§ 5428 5429 forall( otype T | { T min( T, T ); T max( T, T ); } ) 5430 T clamp( T value, T min_val, T max_val );§\indexc{clamp}§ 5431 5432 forall( otype T ) 5433 void swap( T * t1, T * t2 );§\indexc{swap}§ 5519 forall( otype T | { int ?<?( T, T ); } ) T min( T t1, T t2 );§\indexc{min}§ 5520 forall( otype T | { int ?>?( T, T ); } ) T max( T t1, T t2 );§\indexc{max}§ 5521 forall( otype T | { T min( T, T ); T max( T, T ); } ) T clamp( T value, T min_val, T max_val );§\indexc{clamp}§ 5522 forall( otype T ) void swap( T * t1, T * t2 );§\indexc{swap}§ 5434 5523 \end{cfa} 5435 5524
Note: See TracChangeset
for help on using the changeset viewer.