Changes in / [7ef1555e:1f17e07]
- Files:
-
- 25 added
- 8 edited
Legend:
- Unmodified
- Added
- Removed
-
Makefile.am
r7ef1555e r1f17e07 11 11 ## Created On : Sun May 31 22:14:18 2015 12 12 ## Last Modified By : Peter A. Buhr 13 ## Last Modified On : Mon Jan 25 22:16:13201614 ## Update Count : 1 013 ## Last Modified On : Fri Jun 17 14:56:18 2016 14 ## Update Count : 13 15 15 ############################################################################### 16 16 … … 20 20 BACKEND_CC = @BACKEND_CC@ # C compiler used to compile Cforall programs, versus C++ compiler used to build cfa command 21 21 22 MAINTAINERCLEANFILES = lib/* bin/* 22 MAINTAINERCLEANFILES = lib/* bin/* src/examples/.deps/* src/tests/.deps/* src/tests/.out/* -
Makefile.in
r7ef1555e r1f17e07 222 222 SUBDIRS = src/driver src src/libcfa # order important, src before libcfa because cfa-cpp used to build prelude 223 223 EXTRA_DIST = Docs # non-source files 224 MAINTAINERCLEANFILES = lib/* bin/* 224 MAINTAINERCLEANFILES = lib/* bin/* src/examples/.deps/* src/tests/.deps/* src/tests/.out/* 225 225 all: config.h 226 226 $(MAKE) $(AM_MAKEFLAGS) all-recursive -
doc/LaTeXmacros/common.tex
r7ef1555e r1f17e07 11 11 %% Created On : Sat Apr 9 10:06:17 2016 12 12 %% Last Modified By : Peter A. Buhr 13 %% Last Modified On : Fri Jun 10 16:35:25201614 %% Update Count : 1 0113 %% Last Modified On : Mon Jun 20 09:35:20 2016 14 %% Update Count : 178 15 15 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 16 16 … … 23 23 \renewcommand{\floatpagefraction}{0.8} % float must be greater than X of the page before it is forced onto its own page 24 24 \renewcommand{\textfraction}{0.0} % the entire page maybe devoted to floats with no text on the page at all 25 26 \lefthyphenmin=4 27 \righthyphenmin=4 28 25 29 \usepackage{pslatex} % reduce size of san serif font 30 31 \usepackage[ignoredisplayed]{enumitem} % do not affect trivlist 32 \setlist{labelsep=1ex}% global 33 \setlist[itemize]{topsep=0.5ex,parsep=0.25ex,itemsep=0.25ex,listparindent=\parindent,leftmargin=\parindent}% global 34 \setlist[itemize,1]{label=\textbullet}% local 35 %\renewcommand{\labelitemi}{{\raisebox{0.25ex}{\footnotesize$\bullet$}}} 36 \setlist[enumerate]{listparindent=\parindent}% global 37 \setlist[enumerate,2]{leftmargin=\parindent,labelsep=*,align=parleft,label=\alph*.}% local 38 \setlist[description]{listparindent=\parindent,leftmargin=\parindent,labelsep=*} 26 39 27 40 % Names used in the document. … … 29 42 \newcommand{\CFA}{C$\mathbf\forall$\xspace} % set language symbolic name 30 43 \newcommand{\CFL}{Cforall\xspace} % set language text name 31 \newcommand{\CC}{ C\kern-.1em\hbox{+\kern-.25em+}\xspace} % CC symbolic name44 \newcommand{\CC}{\rm C\kern-.1em\hbox{+\kern-.25em+}\xspace} % CC symbolic name 32 45 \def\c11{ISO/IEC C} % C11 name (cannot have numbers in latex command name) 33 46 … … 35 48 36 49 \makeatletter 37 % parindent is relative, i.e., toggled on/off in environments like itemize, 38 % so store the value foruse rather than use \parident directly.39 \newlength{\parindentl ength}40 \setlength{\parindentl ength}{\parindent}50 % parindent is relative, i.e., toggled on/off in environments like itemize, so store the value for 51 % use rather than use \parident directly. 52 \newlength{\parindentlnth} 53 \setlength{\parindentlnth}{\parindent} 41 54 42 55 % allow escape sequence in lstinline 43 56 %\usepackage{etoolbox} 44 57 %\patchcmd{\lsthk@TextStyle}{\let\lst@DefEsc\@empty}{}{}{\errmessage{failed to patch}} 45 46 % make fontsize "small" slightly larger, specifically for san serif (helvetica) in program code47 %\renewcommand\small{%48 % \@setfontsize\small{8.5}{11}%49 % \abovedisplayskip 8.5pt \@plus 3pt \@minus 4pt50 % \abovedisplayshortskip \z@ \@plus 2pt51 % \belowdisplayshortskip 4pt \@plus 2pt \@minus 2pt52 % \def\@listi{\leftmargin\leftmargini53 % \topsep 4pt \@plus 2pt \@minus 2pt54 % \parsep 2pt \@pluspt \@minuspt55 % \itemsep \parsep}%56 % \belowdisplayskip \abovedisplayskip57 %}58 58 59 59 \usepackage{pslatex} % reduce size of san serif font … … 91 91 \newcommand{\see}[1]{\emph{see} #1} 92 92 93 % reduce bullet size and spacing for "itemize" macro94 \renewcommand{\labelitemi}{{\raisebox{0.25ex}{\footnotesize$\bullet$}}}95 \renewenvironment{itemize}{\begin{list}{\labelitemi}{\topsep=5pt\itemsep=5pt\parsep=0pt}}{\end{list}}96 97 93 % Define some commands that produce formatted index entries suitable for cross-references. 98 94 % ``\spec'' produces entries for specifications of entities. ``\impl'' produces entries for their … … 140 136 }% quote2 141 137 \newenvironment{rationale}{% 142 \begin{quot ation}\noindent$\Box$\enspace138 \begin{quote2}\noindent$\Box$\enspace 143 139 }{% 144 \hfill\enspace$\Box$\end{quot ation}140 \hfill\enspace$\Box$\end{quote2} 145 141 }% 146 142 … … 154 150 155 151 % BNF macros 156 \def\syntax{\paragraph{Syntax}\trivlist\parindent=.5in\item[\hskip.5in]} 157 \let\endsyntax=\endtrivlist 158 \newcommand{\lhs}[1]{\par{\emph{#1:}}\index{#1@{\emph{#1}}|italic}} 159 \newcommand{\rhs}{\hfil\break\hbox{\hskip1in}} 160 \newcommand{\oldlhs}[1]{\emph{#1: \dots}\index{#1@{\emph{#1}}|italic}} 161 \newcommand{\nonterm}[1]{\emph{#1\/}\index{#1@{\emph{#1}}|italic}} 152 \newenvironment{syntax}{ 153 \paragraph{Syntax} 154 \begin{quote2} 155 \begin{description}[noitemsep,leftmargin=\parindentlnth] 156 }{ 157 \end{description} 158 \end{quote2} 159 } 160 % \def\syntax{\paragraph{Syntax}\trivlist\parindent=.5in\item[\hskip.5in]} 161 %\let\endsyntax=\endtrivlist 162 \newcommand{\lhs}[1]{\item[\emph{#1:}\index{#1@{\emph{#1}}|italic}]~\ignorespaces} 163 \newcommand{\oldlhs}[1]{\item[\emph{#1:}\index{#1@{\emph{#1}}|italic}~\dots]~} 164 \newcommand{\rhs}{\hfil\newline} 165 \newcommand{\nonterm}[1]{\emph{#1}\index{#1@{\emph{#1}}|italic}} 162 166 \newcommand{\opt}{$_{opt}$\ } 163 167 … … 204 208 stringstyle=\tt, 205 209 tabsize=4, 206 xleftmargin=\parindentl ength,210 xleftmargin=\parindentlnth, 207 211 extendedchars=true, 208 212 escapechar=§, -
doc/bibliography/cfa.bib
r7ef1555e r1f17e07 2924 2924 2925 2925 @unpublished{Bilson, 2926 keywords= {generic programming, generics, polymorphism},2927 contributor{a3moss@plg},2928 author= {Richard C. Bilson and Glen Ditchfield and Peter A. Buhr},2929 title= {Generic Programming with Inferred Models},2926 keywords = {generic programming, generics, polymorphism}, 2927 contributor = {a3moss@plg}, 2928 author = {Richard C. Bilson and Glen Ditchfield and Peter A. Buhr}, 2929 title = {Generic Programming with Inferred Models}, 2930 2930 } 2931 2931 -
doc/refrat/Makefile
r7ef1555e r1f17e07 1 1 ## Define the appropriate configuration variables. 2 2 3 TeXLIB = .:../ bibliography/:../LaTeXmacros/:3 TeXLIB = .:../LaTeXmacros:../LaTeXmacros/listings:../LaTeXmacros/enumitem:../bibliography/: 4 4 LaTeX = TEXINPUTS=${TeXLIB} && export TEXINPUTS && latex 5 5 BibTeX = BIBINPUTS=${TeXLIB} && export BIBINPUTS && bibtex -
doc/refrat/refrat.tex
r7ef1555e r1f17e07 11 11 %% Created On : Wed Apr 6 14:52:25 2016 12 12 %% Last Modified By : Peter A. Buhr 13 %% Last Modified On : Fri Jun 3 09:43:48201614 %% Update Count : 6613 %% Last Modified On : Sat Jun 18 19:21:30 2016 14 %% Update Count : 74 15 15 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 16 16 … … 18 18 19 19 % inline code ©...© (copyright symbol) emacs: C-q M-) 20 % red highlighting ®...® (registered trademark sumbol) emacs: C-q M-. 21 % latex escape §...§ (section symbol) emacs: C-q M-' 20 % red highlighting ®...® (registered trademark symbol) emacs: C-q M-. 21 % blue highlighting ß...ß (sharp s symbol) emacs: C-q M-_ 22 % green highlighting ¢...¢ (cent symbol) emacs: C-q M-" 23 % LaTex escape §...§ (section symbol) emacs: C-q M-' 22 24 % keyword escape ¶...¶ (pilcrow symbol) emacs: C-q M-^ 23 25 % math escape $...$ (dollar symbol) … … 32 34 \usepackage{fullpage,times,comment} 33 35 \usepackage{epic,eepic} 34 \usepackage{upquote} % switch curled `' to straight `'36 \usepackage{upquote} % switch curled `'" to straight 35 37 \usepackage{xspace} 36 38 \usepackage{varioref} % extended references 37 39 \usepackage{listings} % format program code 38 \usepackage {footmisc}% support label/reference in footnote40 \usepackage[flushmargin]{footmisc} % support label/reference in footnote 39 41 \usepackage{latexsym} % \Box glyph 40 42 \usepackage{mathptmx} % better math font with "times" 43 \usepackage[usenames]{color} 41 44 \usepackage[pagewise]{lineno} 42 45 \renewcommand{\linenumberfont}{\scriptsize\sffamily} 46 \input{common} % bespoke macros used in the document 43 47 \usepackage[dvips,plainpages=false,pdfpagelabels,pdfpagemode=UseNone,colorlinks=true,pagebackref=true,linkcolor=blue,citecolor=blue,urlcolor=blue,pagebackref=true,breaklinks=true]{hyperref} 44 48 \usepackage{breakurl} … … 47 51 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 48 52 49 % Bespoke macros used in the document.50 \input{common}51 52 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%53 54 53 % Names used in the document. 55 54 56 55 \newcommand{\Version}{1.0.0} 56 57 \newcommand{\Textbf}[2][red]{{\color{#1}{\textbf{#2}}}} 58 \newcommand{\Emph}[2][red]{{\color{#1}\textbf{\emph{#2}}}} 59 \newcommand{\R}[1]{\Textbf{#1}} 60 \newcommand{\B}[1]{{\Textbf[blue]{#1}}} 61 \newcommand{\G}[1]{{\Textbf[OliveGreen]{#1}}} 57 62 58 63 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% … … 76 81 }% author 77 82 \date{ 78 DRAFT\\\today 83 DRAFT \\ 84 \today 79 85 }% date 80 86 … … 390 396 \end{itemize} 391 397 398 392 399 \section{Lexical elements} 400 401 393 402 \subsection{Keywords} 403 394 404 \begin{syntax} 395 405 \oldlhs{keyword} 396 397 398 399 400 401 406 \rhs ©forall© 407 \rhs ©lvalue© 408 \rhs ©trait© 409 \rhs ©dtype© 410 \rhs ©ftype© 411 \rhs ©otype© 402 412 \end{syntax} 403 413 … … 1107 1117 \begin{syntax} 1108 1118 \lhs{unary-expression} 1109 \rhs \nonterm{postfix-expression} 1110 \rhs ©++© \nonterm{unary-expression} 1111 \rhs ©--© \nonterm{unary-expression} 1112 \rhs \nonterm{unary-operator} \nonterm{cast-expression} 1113 \rhs ©sizeof© \nonterm{unary-expression} 1114 \rhs ©sizeof© ©(© \nonterm{type-name} ©)© 1115 \lhs{unary-operator} one of \rhs ©&© ©*© ©+© ©-© ©~© ©!© 1119 \rhs \nonterm{postfix-expression} 1120 \rhs ©++© \nonterm{unary-expression} 1121 \rhs ©--© \nonterm{unary-expression} 1122 \rhs \nonterm{unary-operator} \nonterm{cast-expression} 1123 \rhs ©sizeof© \nonterm{unary-expression} 1124 \rhs ©sizeof© ©(© \nonterm{type-name} ©)© 1125 \lhs{unary-operator} one of 1126 \rhs ©&© ©*© ©+© ©-© ©~© ©!© 1116 1127 \end{syntax} 1117 1128 -
doc/user/Makefile
r7ef1555e r1f17e07 1 1 ## Define the appropriate configuration variables. 2 2 3 TeXLIB = .:../ bibliography/:../LaTeXmacros/:3 TeXLIB = .:../LaTeXmacros:../LaTeXmacros/listings:../LaTeXmacros/enumitem:../bibliography/: 4 4 LaTeX = TEXINPUTS=${TeXLIB} && export TEXINPUTS && latex 5 5 BibTeX = BIBINPUTS=${TeXLIB} && export BIBINPUTS && bibtex -
doc/user/user.tex
r7ef1555e r1f17e07 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 10 16:38:22 201614 %% Update Count : 39413 %% Last Modified On : Mon Jun 20 10:47:22 2016 14 %% Update Count : 575 15 15 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 16 16 … … 21 21 % blue highlighting ß...ß (sharp s symbol) emacs: C-q M-_ 22 22 % green highlighting ¢...¢ (cent symbol) emacs: C-q M-" 23 % La tex escape §...§ (section symbol) emacs: C-q M-'23 % LaTex escape §...§ (section symbol) emacs: C-q M-' 24 24 % keyword escape ¶...¶ (pilcrow symbol) emacs: C-q M-^ 25 25 % math escape $...$ (dollar symbol) 26 26 27 27 \documentclass[twoside,11pt]{article} 28 28 29 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 29 30 … … 34 35 \usepackage{fullpage,times,comment} 35 36 \usepackage{epic,eepic} 36 \usepackage{upquote} % switch curled `'" to straight `'"37 \usepackage{upquote} % switch curled `'" to straight 37 38 \usepackage{xspace} 38 39 \usepackage{varioref} % extended references … … 49 50 \renewcommand{\UrlFont}{\small\sf} 50 51 52 \makeatletter 53 \renewcommand{\pagestyle}[1]{ 54 \@ifundefined{ps@#1}% 55 \undefinedpagestyle 56 {\def\@tempa{#1}\def\@tempb{headings}\def\@tempc{myheadings}% 57 \ifx\@tempa\@tempb\setlength{\topmargin}{-0.25in}\setlength{\headsep}{0.25in}% 58 \else\ifx\@tempa\@tempc\setlength{\topmargin}{-0.25in}\setlength{\headsep}{0.25in}\fi\fi% 59 \@nameuse{ps@#1}}}% pagestyle 60 \makeatother 61 62 63 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 64 51 65 % Names used in the document. 52 66 … … 60 74 \newcommand{\G}[1]{{\Textbf[OliveGreen]{#1}}} 61 75 76 \newsavebox{\LstBox} 77 62 78 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 63 79 … … 67 83 68 84 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 69 70 \begin{document}71 \pagestyle{headings}72 \linenumbers % comment out to turn off line numbering73 85 74 86 \title{\Huge … … 77 89 Version 1.0 \\ 78 90 \vspace*{0.25in} 79 \huge``describe not prescribe'' \\91 \huge``describe not prescribe'' 80 92 \vspace*{1in} 81 93 }% title 94 82 95 \author{\huge 83 Peter A. Buhr and ... \\96 Peter A. Buhr and ... 84 97 }% author 98 85 99 \date{ 86 DRAFT \\ 87 \today 100 DRAFT \\ \today 88 101 }% date 89 102 103 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 104 105 \begin{document} 106 \pagestyle{headings} 90 107 \pagenumbering{roman} 91 \ pagestyle{plain}108 \linenumbers % comment out to turn off line numbering 92 109 93 110 \maketitle … … 107 124 108 125 \clearpage 126 \markright{\CFA User Manual} 109 127 \pagenumbering{arabic} 110 128 … … 471 489 \end{quote2} 472 490 473 Unsupported are K\&R C declarations where the base type defaults to ©int©, if no type is specified \footnote{474 At least one type specifier shall be given in the declaration specifiers in each declaration, and in the specifier-qualifier list in each structure declaration and type name~\cite[\S~6.7.2(2)]{C11}} ,491 Unsupported are K\&R C declarations where the base type defaults to ©int©, if no type is specified,\footnote{ 492 At least one type specifier shall be given in the declaration specifiers in each declaration, and in the specifier-qualifier list in each structure declaration and type name~\cite[\S~6.7.2(2)]{C11}} 475 493 e.g.: 476 494 \begin{lstlisting} … … 485 503 Clearly, both styles need to be supported for some time due to existing C-style header-files, particularly for UNIX systems. 486 504 505 506 \section{Reference Pointers} 507 508 Program variables are implicit pointers to memory locations generated by the compiler and automatically dereferenced, as in: 509 \begin{quote2} 510 \begin{tabular}{@{}l|l@{}} 511 \multicolumn{1}{c|}{Variables} & \multicolumn{1}{c}{Compiler generated addresses (100, 104) and dereferencing} \\ 512 \hline 513 \begin{lstlisting} 514 int x, y; 515 x = 3; 516 y = x; 517 \end{lstlisting} 518 & 519 \begin{lstlisting} 520 int * const x = (int *)100, * const y = (int *)104; 521 *x = 3; // implicit dereference 522 *y = *x; 523 \end{lstlisting} 524 \end{tabular} 525 \end{quote2} 526 A variable name only points to one location during its lifetime, i.e., it is a \Index{non-mutable} pointer. 527 For example, the variables ©x© and ©y© are constant pointers. 528 Variable addresses are usually not stored in memory and loaded before dereferencing; 529 instead, variable addresses are stored in instructions, so an instruction fetch implicitly gets the variable's address. 530 \begin{quote2} 531 \begin{tabular}{@{}l|l@{}} 532 \begin{lstlisting} 533 x = x + 1 534 &x = *(&x) + 1 535 (100) = *(100) + 1 536 \end{lstlisting} 537 & 538 \begin{lstlisting} 539 ld r1,(100) // address of x 540 add r1,1 541 st r1,(100) // address of x 542 \end{lstlisting} 543 \end{tabular} 544 \end{quote2} 545 Finally, the non-mutable nature of variables and the fact that there is no storage for a variable address means pointer assignment is impossible. 546 Therefore, the expression ©x = y© only has one meaning, ©*x = *y©, i.e., copy the variable values, so explicitly writing the dereferences is unnecessary even though it occurs implicitly as part of instruction decoding. 547 548 A variable name is generalized by a \newterm{pointer}, which is a mutable pointer variable that can point to more than one memory location during its life-time (like an integer variable versus a literal). 549 Hence, a pointer occupies memory to store its current address, and the pointer's value is loaded by dereferencing, e.g.: 550 \begin{lstlisting} 551 int x, y, z, ®*® p1, ®*® p2; 552 p1 = ®&®x; // p1 points to x 553 p2 = p1; // p2 also points to x 554 p1 = ®&®y; // p1 points to y 555 p2 = p1 + 1; // p2 points to z, pointer arithmetic 556 \end{lstlisting} 557 In many cases, a pointer name is anonymous (dynamically computed), so it cannot be stored directly in an instruction like a variable name. 558 559 Pointers have a duality: an address in memory or the value at that address. 560 In many cases, the compiler can infer which of these operations are needed: 561 \begin{lstlisting} 562 p2 = p1 + x; // compiler infers *p2 = *p1 + x; 563 \end{lstlisting} 564 because adding the integer value of ©x© to the address of ©p1© and storing the resulting address into ©p2© is an unlikely operation. 565 Algol68~\cite{Algol68} inferences pointer dereferencing to select the best meaning for each pointer usage. 566 However, there are ambiguous cases, especially when pointer arithmetic is possible, as in C: 567 \begin{lstlisting} 568 p1 = p2; // p1 = p2 or *p1 = *p2 569 p1 = p1 + 1; // p1 = p1 + 1 or *p1 = *p1 + 1 570 \end{lstlisting} 571 572 Most programming languages pick a default operation and supply an explicit operation to resolve the pointer-duality ambiguity. 573 In C, the default operation for pointers is manipulate the pointer value and the pointed-to value is explicitly accessed by dereferencing ©*©. 574 \begin{lstlisting} 575 p1 = p2; // pointer value assignment 576 *p1 = *p1 + 1; // pointed-to value assignment/operation 577 \end{lstlisting} 578 which works well for low-level memory management, such as ©malloc©/©free©, where manipulation of addresses in the primary operation, and data is only occasionally accessed. 579 580 However, in the majority of pointer usages, the pointed-to value is required rather than the pointer address. 581 \begin{lstlisting} 582 *p2 = ((*p1 + *p2) * (*p2 - *p1)) / (*p1 - *p2); 583 \end{lstlisting} 584 And, it is tedious and error prone to explicitly write the dereferencing, especially when pointer arithmetic with integer values is allowed. 585 It is better to have the compiler generate the dereferencing: 586 \begin{lstlisting} 587 p2 = ((p1 + p2) * (p2 - p1)) / (p1 - p2); 588 \end{lstlisting} 589 590 To provide this capability, it is necessary to switch the default operation to resolve the pointer-duality ambiguity, which requires a new kind of pointer called a \newterm{reference} pointer. 591 \begin{lstlisting} 592 int x, y, z, ®&® r1, ®&® r2; // & denotes reference pointer 593 r1 ®:=® &x; // r1 points to x 594 r2 ®:=® &r1; // r2 also points to x 595 r1 ®:=® &y; // r1 points to y 596 r2 ®:=® &r1 + 1; // r2 points to z 597 r2 = ((r1 + r2) * (r2 - r1)) / (r1 - r2); // implicit dereferencing 598 \end{lstlisting} 599 Hence, a reference pointer behaves like a variable name for the current variable it is pointing-to, so dereferencing a reference pointer returns the address of its pointed-to value, i.e., the address in the reference pointer. 600 Notice, the explicit operator ©:=© to denote pointer assignment to a reference pointer to support both aspects of pointer duality. 601 Note, \CC deals with the pointer duality by making a reference pointer a constant (©const©), like a plain variable, so there is no reference assignment. 602 603 Like pointers, it is possible to use ©const© qualifiers with a reference: 604 \begin{lstlisting} 605 const int cx = 5; // cannot change cx; 606 const int & r3 = &cx; // cannot change what r3 is pointing to 607 r3 ®:=® &cx; // can change r3 608 r3 = 7; // error, cannot change cx 609 int & const r4 = &x; // must be initialized, §\CC§ reference 610 r4 ®:=® &x; // error, cannot change r4 611 const int & const r5 = &cx; // must be initialized, §\CC§ reference 612 r5 = 7; // error, cannot change cx 613 r5 ®:=® &cx; // error, cannot change r5 614 \end{lstlisting} 615 Note, for type ©& const©, there is no pointer assignment, so ©r4 := &x© is disallowed, and the pointer value cannot be ©0©. 616 Since there is only one meaning for ©r4 = x©, which is to change the value of the variable pointed to by ©r4©, therefore: 617 \begin{itemize} 618 \item 619 it in impossible to take the address of ©r4© as it always means the address of what ©r4© is pointing to. 620 \item 621 the dereference at initialization is optional because there can only be one 622 \begin{lrbox}{\LstBox}% 623 \footnotesize% 624 \begin{lstlisting}% 625 void f( int p ) {...} 626 void (*fp)( int ) = &f; // equivalent initialization 627 void (*fp)( int ) = f; // missing dereference allowed 628 \end{lstlisting}% 629 \end{lrbox}% 630 meaning.\footnote{ 631 This case is similar to initializing a routine pointer, where the routine constant should be dereferenced. 632 \newline 633 \usebox{\LstBox} 634 }% footnote 635 \begin{lstlisting} 636 int & const r4 = &x; // equivalent initialization 637 int & const r4 = x; // missing dereference allowed 638 \end{lstlisting} 639 \end{itemize} 640 Similarly, when a ©const© reference is used for a parameters type, the call-site argument does not require a reference. 641 \begin{lstlisting} 642 void f( int & ri, int & const cri ); 643 f( &x, x ); // reference not required for second argument 644 \end{lstlisting} 645 Within routine ©f©, it is possible to change an argument by changing the corresponding parameter, and parameter ©ri© can be locally reassigned within ©f©. 646 647 Finally, when a reference parameter has a ©const© value, it is possible to pass literals and expressions. 648 \begin{lstlisting} 649 void g( const int & ri, const int & const cri ); 650 f( &3, 3 ); 651 f( &(x + y), x + y ); 652 \end{lstlisting} 653 At the call site, the compiler implicitly creates the necessary temporary that is subsequently pointed to by the reference parameter. 654 Hence, changing the parameter only changes the temporary at the call site. 655 For the non-©const© parameter, requiring the reference on the literal or expression makes it clear that nothing is changing at the call site and allows the call to proceed, where other languages require the programmer to explicitly create the temporary for the argument. 487 656 488 657 \section{Type Operators} … … 808 977 \subsection{Type Nesting} 809 978 810 \CFA allows \Index{type nesting}, and type qualification of the nested types , where as C hoists\index{type hoisting} (refactors) nested types into the enclosing scope and has no type qualification.811 \begin{ quote2}979 \CFA allows \Index{type nesting}, and type qualification of the nested types (see \VRef[Figure]{f:TypeNestingQualification}), where as C hoists\index{type hoisting} (refactors) nested types into the enclosing scope and has no type qualification. 980 \begin{figure} 812 981 \begin{tabular}{@{}l@{\hspace{3em}}l|l@{}} 813 982 \multicolumn{1}{c@{\hspace{3em}}}{\textbf{C Type Nesting}} & \multicolumn{1}{c}{\textbf{C Implicit Hoisting}} & \multicolumn{1}{|c}{\textbf{\CFA}} \\ … … 870 1039 \end{lstlisting} 871 1040 \end{tabular} 872 \end{quote2} 1041 \caption{Type Nesting / Qualification} 1042 \label{f:TypeNestingQualification} 1043 \end{figure} 873 1044 In the left example in C, types ©C©, ©U© and ©T© are implicitly hoisted outside of type ©S© into the containing block scope. 874 1045 In the right example in \CFA, the types are not hoisted and accessed using the field-selection operator ``©.©'' for type qualification, as does Java, rather than the \CC type-selection operator ``©::©''.
Note: See TracChangeset
for help on using the changeset viewer.