Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(481)

Side by Side Diff: docs/language/informal/generic-function-type-alias.md

Issue 2841483003: Added informal generic method syntax and generic function type specs. (Closed)
Patch Set: Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | docs/language/informal/generic-method-syntax.md » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1
2
3
4
5
6
7 <!DOCTYPE html>
8 <html lang="en">
9 <head>
10 <meta charset="utf-8">
11
Lasse Reichstein Nielsen 2017/04/24 13:02:05 The document has extension .md, but contains HTML.
eernst 2017/04/25 11:57:15 Fixed.
12
13
14 <link crossorigin="anonymous" href="https://assets-cdn.github.com/assets/frame works-d7b19415c108234b91acac0d0c02091c860993c13687a757ee345cc1ecd3a9d1.css" medi a="all" rel="stylesheet" />
15 <link crossorigin="anonymous" href="https://assets-cdn.github.com/assets/githu b-678c6c9fa597e3eabad2135736d58fe40e2ef37d8e272589d7d39d7c1c0f9056.css" media="a ll" rel="stylesheet" />
16
17
18 <link crossorigin="anonymous" href="https://assets-cdn.github.com/assets/site- 537c466d44a69d38c4bd60c2fd2955373ef96d051bd97b2ad30ed039acc97bff.css" media="all " rel="stylesheet" />
19
20
21 <meta name="viewport" content="width=device-width">
22
23 <title>INFORMAL SPECIFICATION: Generic Function Type Alias · GitHub</title>
24 <link rel="search" type="application/opensearchdescription+xml" href="/opensea rch.xml" title="GitHub">
25 <link rel="fluid-icon" href="https://gist.github.com/fluidicon.png" title="Git Hub">
26 <meta property="fb:app_id" content="1401488693436528">
27
28
29 <meta content="https://avatars3.githubusercontent.com/u/9606994?v=3&amp;s=40 0" property="og:image" /><meta content="Gist" property="og:site_name" /><meta co ntent="object" property="og:type" /><meta content="INFORMAL SPECIFICATION: Gener ic Function Type Alias" property="og:title" /><meta content="https://gist.github .com/eernstg/ffc7bd281974e9018f10f0cb6cfee4aa" property="og:url" /><meta content ="INFORMAL SPECIFICATION: Generic Function Type Alias" property="og:description" />
30
31 <link rel="assets" href="https://assets-cdn.github.com/">
32
33 <meta name="pjax-timeout" content="1000">
34
35 <meta name="request-id" content="CE98:2758B:2C00754:46C66AC:58FDDC27" data-pja x-transient>
36
37
38 <meta name="selected-link" value="gist_code" data-pjax-transient>
39
40 <meta name="google-site-verification" content="KT5gs8h0wvaagLKAVWq8bbeNwnZZK1r 1XQysX3xurLU">
41 <meta name="google-site-verification" content="ZzhVyEFwb7w3e0-uOTltm8Jsck2F5StVi hD0exw2fsA">
42 <meta name="google-analytics" content="UA-3769691-4">
43
44 <meta content="collector.githubapp.com" name="octolytics-host" /><meta content=" gist" name="octolytics-app-id" /><meta content="https://collector.githubapp.com/ github-external/browser_event" name="octolytics-event-url" /><meta content="CE98 :2758B:2C00754:46C66AC:58FDDC27" name="octolytics-dimension-request_id" />
45 <meta content="/&lt;user-name&gt;/&lt;gist-id&gt;" data-pjax-transient="true" na me="analytics-location" />
46
47
48
49
50 <meta class="js-ga-set" name="dimension1" content="Logged Out">
51
52
53
54 <meta content="true" name="octolytics-dimension-public" /><meta content="429 10666" name="octolytics-dimension-gist_id" /><meta content="ffc7bd281974e9018f10 f0cb6cfee4aa" name="octolytics-dimension-gist_name" /><meta content="false" name ="octolytics-dimension-anonymous" /><meta content="9606994" name="octolytics-dim ension-owner_id" /><meta content="eernstg" name="octolytics-dimension-owner_logi n" /><meta content="false" name="octolytics-dimension-forked" />
55
56 <meta class="js-ga-set" name="dimension5" content="public">
57 <meta class="js-ga-set" name="dimension6" content="owned">
58 <meta class="js-ga-set" name="dimension7" content="markdown">
59
60
61 <meta name="hostname" content="gist.github.com">
62 <meta name="user-login" content="">
63
64 <meta name="expected-hostname" content="gist.github.com">
65 <meta name="js-proxy-site-detection-payload" content="Zjg3ZjIwNTUyZjZhOWY0Nj cxZWQzZDkyOWRmNGE5ZmMxYWE4ZDhhZTQ4NTc3MmFhZjYzNjM2ZmY2MGUwM2Y2MXx7InJlbW90ZV9hZG RyZXNzIjoiMTA0LjEzMi4xODAuMTk4IiwicmVxdWVzdF9pZCI6IkNFOTg6Mjc1OEI6MkMwMDc1NDo0Nk M2NkFDOjU4RkREQzI3IiwidGltZXN0YW1wIjoxNDkzMDMxOTc1LCJob3N0IjoiZ2l0aHViLmNvbSJ9">
66
67
68 <meta name="html-safe-nonce" content="641be3c5eee41a088cf23e80ff9618ddc83c8f54 ">
69
70 <meta http-equiv="x-pjax-version" content="2e017d75c6ea5cb7f0c7e24d0a0382b8">
71
72
73 <link href="/eernstg.atom" rel="alternate" title="atom" type="application/ atom+xml">
74
75 <link crossorigin="anonymous" href="https://assets-cdn.github.com/assets/gist- 67dd5139d22e4e9921ef362b5458f51e5973a20db04a54c9d74116748f852917.css" media="all " rel="stylesheet" />
76
77
78
79
80 <meta name="browser-stats-url" content="https://api.github.com/_private/browse r/stats">
81
82 <meta name="browser-errors-url" content="https://api.github.com/_private/brows er/errors">
83
84 <link rel="mask-icon" href="https://assets-cdn.github.com/pinned-octocat.svg" color="#000000">
85 <link rel="icon" type="image/x-icon" href="https://assets-cdn.github.com/favic on.ico">
86
87 <meta name="theme-color" content="#1e2327">
88
89
90
91 </head>
92
93 <body class="logged-out env-production">
94
95
96
97 <div class="position-relative js-header-wrapper ">
98 <a href="#start-of-content" tabindex="1" class="accessibility-aid js-skip-to -content">Skip to content</a>
99 <div id="js-pjax-loader-bar" class="pjax-loader-bar"><div class="progress">< /div></div>
100
101
102
103
104
105
106
107 <div class="header gist-header header-logged-out" role="banner">
108 <div class="container clearfix">
109
110 <a href="/" aria-label="Gist Homepage" class="header-logo-wordmark" data-hot key="g d">
111 <svg aria-hidden="true" class="octicon octicon-logo-github" height="28" ve rsion="1.1" viewBox="0 0 45 16" width="78"><path fill-rule="evenodd" d="M18.53 1 2.03h-.02c.009 0 .015.01.024.011h.006l-.01-.01zm.004.011c-.093.001-.327.05-.574. 05-.78 0-1.05-.36-1.05-.83V8.13h1.59c.09 0 .16-.08.16-.19v-1.7c0-.09-.08-.17-.16 -.17h-1.59V3.96c0-.08-.05-.13-.14-.13h-2.16c-.09 0-.14.05-.14.13v2.17s-1.09.27-1 .16.28c-.08.02-.13.09-.13.17v1.36c0 .11.08.19.17.19h1.11v3.28c0 2.44 1.7 2.69 2. 86 2.69.53 0 1.17-.17 1.27-.22.06-.02.09-.09.09-.16v-1.5a.177.177 0 0 0-.146-.18 zm23.696-2.2c0-1.81-.73-2.05-1.5-1.97-.6.04-1.08.34-1.08.34v3.52s.49.34 1.22.36c 1.03.03 1.36-.34 1.36-2.25zm2.43-.16c0 3.43-1.11 4.41-3.05 4.41-1.64 0-2.52-.83- 2.52-.83s-.04.46-.09.52c-.03.06-.08.08-.14.08h-1.48c-.1 0-.19-.08-.19-.17l.02-11 .11c0-.09.08-.17.17-.17h2.13c.09 0 .17.08.17.17v3.77s.82-.53 2.02-.53l-.01-.02c1 .2 0 2.97.45 2.97 3.88zm-8.72-3.61H33.84c-.11 0-.17.08-.17.19v5.44s-.55.39-1.3.3 9-.97-.34-.97-1.09V6.25c0-.09-.08-.17-.17-.17h-2.14c-.09 0-.17.08-.17.17v5.11c0 2.2 1.23 2.75 2.92 2.75 1.39 0 2.52-.77 2.52-.77s.05.39.08.45c.02.05.09.09.16.09 h1.34c.11 0 .17-.08.17-.17l.02-7.47c0-.09-.08-.17-.19-.17zm-23.7-.01h-2.13c-.09 0-.17.09-.17.2v7.34c0 .2.13.27.3.27h1.92c.2 0 .25-.09.25-.27V6.23c0-.09-.08-.17- .17-.17zm-1.05-3.38c-.77 0-1.38.61-1.38 1.38 0 .77.61 1.38 1.38 1.38.75 0 1.36-. 61 1.36-1.38 0-.77-.61-1.38-1.36-1.38zm16.49-.25h-2.11c-.09 0-.17.08-.17.17v4.09 h-3.31V2.6c0-.09-.08-.17-.17-.17h-2.13c-.09 0-.17.08-.17.17v11.11c0 .09.09.17.17 .17h2.13c.09 0 .17-.08.17-.17V8.96h3.31l-.02 4.75c0 .09.08.17.17.17h2.13c.09 0 . 17-.08.17-.17V2.6c0-.09-.08-.17-.17-.17zM8.81 7.35v5.74c0 .04-.01.11-.06.13 0 0- 1.25.89-3.31.89-2.49 0-5.44-.78-5.44-5.92S2.58 1.99 5.1 2c2.18 0 3.06.49 3.2.58. 04.05.06.09.06.14L7.94 4.5c0 .09-.09.2-.2.17-.36-.11-.9-.33-2.17-.33-1.47 0-3.05 .42-3.05 3.73s1.5 3.7 2.58 3.7c.92 0 1.25-.11 1.25-.11v-2.3H4.88c-.11 0-.19-.08- .19-.17V7.35c0-.09.08-.17.19-.17h3.74c.11 0 .19.08.19.17z"/></svg>
112 <svg aria-hidden="true" class="octicon octicon-logo-gist" height="28" vers ion="1.1" viewBox="0 0 25 16" width="40"><path fill-rule="evenodd" d="M4.7 8.73h 2.45v4.02c-.55.27-1.64.34-2.53.34-2.56 0-3.47-2.2-3.47-5.05 0-2.85.91-5.06 3.48- 5.06 1.28 0 2.06.23 3.28.73V2.66C7.27 2.33 6.25 2 4.63 2 1.13 2 0 4.69 0 8.03c0 3.34 1.11 6.03 4.63 6.03 1.64 0 2.81-.27 3.59-.64V7.73H4.7v1zm6.39 3.72V6.06h-1. 05v6.28c0 1.25.58 1.72 1.72 1.72v-.89c-.48 0-.67-.16-.67-.7v-.02zm.25-8.72c0-.44 -.33-.78-.78-.78s-.77.34-.77.78.33.78.77.78.78-.34.78-.78zm4.34 5.69c-1.5-.13-1. 78-.48-1.78-1.17 0-.77.33-1.34 1.88-1.34 1.05 0 1.66.16 2.27.36v-.94c-.69-.3-1.5 2-.39-2.25-.39-2.2 0-2.92 1.2-2.92 2.31 0 1.08.47 1.88 2.73 2.08 1.55.13 1.77.63 1.77 1.34 0 .73-.44 1.42-2.06 1.42-1.11 0-1.86-.19-2.33-.36v.94c.5.2 1.58.39 2. 33.39 2.38 0 3.14-1.2 3.14-2.41 0-1.28-.53-2.03-2.75-2.23h-.03zm8.58-2.47v-.86h- 2.42v-2.5l-1.08.31v2.11l-1.56.44v.48h1.56v5c0 1.53 1.19 2.13 2.5 2.13.19 0 .52-. 02.69-.05v-.89c-.19.03-.41.03-.61.03-.97 0-1.5-.39-1.5-1.34V6.94h2.42v.02-.01z"/ ></svg>
113 </a>
114 <div class="site-search js-site-search" role="search">
115 <div class="header-search" role="search">
116
117 <!-- '"` --><!-- </textarea></xmp> --></option></form><form accept-charset="UTF- 8" action="/search" class="position-relative" method="get"><div style="margin:0; padding:0;display:inline"><input name="utf8" type="hidden" value="&#x2713;" /></ div>
118 <label class="header-search-wrapper form-control js-chromeless-input-container ">
119 <input type="text"
120 class="form-control js-site-search-focus header-search-input"
121 data-hotkey="s"
122 name="q"
123 placeholder="Search…"
124 tabindex="1"
125 autocorrect="off"
126 autocomplete="off"
127 autocapitalize="off">
128 </label>
129
130 </form></div>
131
132 </div>
133 <ul class="header-nav float-left" role="navigation">
134 <li class="header-nav-item">
135 <a href="/discover" class="header-nav-link" data-ga-click="Header, go to all gists, text:all gists">All gists</a>
136 </li>
137
138 <li class="header-nav-item">
139 <a href="https://github.com" class="header-nav-link" data-ga-click="Head er, go to GitHub, text:GitHub">GitHub</a>
140 </li>
141 </ul>
142
143 <div class="header-actions" role="navigation">
144 <a href="/join?source=header-gist" class="btn btn-primary" data-ga-cli ck="Header, sign up">Sign up for a GitHub account</a>
145 <a href="https://gist.github.com/auth/github?return_to=gist" class="btn" data-ga-click="Header, sign in">Sign in</a>
146 </div>
147 </div>
148 </div>
149
150
151
152 </div>
153
154 <div id="start-of-content" class="accessibility-aid"></div>
155
156 <div id="js-flash-container">
157 </div>
158
159
160
161 <div role="main">
162 <div itemscope itemtype="http://schema.org/Code">
163 <div id="gist-pjax-container" class="gist-content-wrapper" data-pjax-contain er>
164
165
166
167 <div class="gist-detail-intro gist-banner">
168 <div class="container">
169 <a href="/" class="btn btn-outline float-right">Create a gist now</a>
170 <p class="lead">
171 Instantly share code, notes, and snippets.
172 </p>
173 </div>
174 </div>
175
176
177 <div class="gisthead pagehead repohead instapaper_ignore readability-menu experi ment-repo-nav mb-4">
178 <div class="container">
179
180
181 <div class="container repohead-details-container">
182
183 <ul class="pagehead-actions">
184
185
186 <li>
187 <a href="/login?return_to=https%3A%2F%2Fgist.github.com%2Feernstg%2Fffc7 bd281974e9018f10f0cb6cfee4aa" aria-label="You must be signed in to star a gist" class="btn btn-sm btn-with-count tooltipped tooltipped-n" rel="nofollow">
188 <svg aria-hidden="true" class="octicon octicon-star" height="16" version="1. 1" viewBox="0 0 14 16" width="14"><path fill-rule="evenodd" d="M14 6l-4.9-.64L7 1 4.9 5.36 0 6l3.6 3.26L2.67 14 7 11.67 11.33 14l-.93-4.74z"/></svg>
189 Star
190 </a>
191 <a href="/eernstg/ffc7bd281974e9018f10f0cb6cfee4aa/stargazers" aria-label="0 u sers starred this gist" class="social-count">
192 0
193 </a>
194 </li>
195
196 <li>
197 <a href="/login?return_to=https%3A%2F%2Fgist.github.com%2Feernstg%2Fff c7bd281974e9018f10f0cb6cfee4aa" aria-label="You must be signed in to fork a gist " class="btn btn-sm btn-with-count tooltipped tooltipped-n" rel="nofollow">
198 <svg aria-hidden="true" class="octicon octicon-repo-forked" height="16" vers ion="1.1" viewBox="0 0 10 16" width="10"><path fill-rule="evenodd" d="M8 1a1.993 1.993 0 0 0-1 3.72V6L5 8 3 6V4.72A1.993 1.993 0 0 0 2 1a1.993 1.993 0 0 0-1 3.7 2V6.5l3 3v1.78A1.993 1.993 0 0 0 5 15a1.993 1.993 0 0 0 1-3.72V9.5l3-3V4.72A1.99 3 1.993 0 0 0 8 1zM2 4.2C1.34 4.2.8 3.65.8 3c0-.65.55-1.2 1.2-1.2.65 0 1.2.55 1. 2 1.2 0 .65-.55 1.2-1.2 1.2zm3 10c-.66 0-1.2-.55-1.2-1.2 0-.65.55-1.2 1.2-1.2.65 0 1.2.55 1.2 1.2 0 .65-.55 1.2-1.2 1.2zm3-10c-.66 0-1.2-.55-1.2-1.2 0-.65.55-1. 2 1.2-1.2.65 0 1.2.55 1.2 1.2 0 .65-.55 1.2-1.2 1.2z"/></svg>
199 Fork
200 </a>
201 <a href="/eernstg/ffc7bd281974e9018f10f0cb6cfee4aa/forks" aria-label="0 users forked this gist" class="social-count">
202 0
203 </a>
204 </li>
205
206 </ul>
207
208 <h1 class="public css-truncate">
209 <img alt="@eernstg" class="avatar gist-avatar" height="26" src="https://avat ars1.githubusercontent.com/u/9606994?v=3&amp;s=52" width="26" />
210 <span class="author"><a href="/eernstg" class="url fn" rel="author"><span it emprop="author">eernstg</span></a></span><!--
211 --><span class="path-divider">/</span><!--
212 --><strong itemprop="name" class="gist-header-title css-truncate-target" ><a href="/eernstg/ffc7bd281974e9018f10f0cb6cfee4aa">GenericFunctionTypeAlias.md </a></strong>
213
214 <div class="gist-timestamp">Last active <time-ago datetime="2017-01-04T11:41 :57Z">Jan 4, 2017</time-ago></div>
215 </h1>
216 </div>
217
218 <div class="container gist-file-navigation">
219 <div class="float-right file-navigation-options" data-multiple>
220
221 <div class="file-navigation-option">
222 <input type="hidden" name="protocol_type" value="clone">
223
224 <div class="select-menu js-menu-container js-select-menu">
225 <div class="input-group js-select-button js-zeroclipboard-container">
226 <div class="input-group-button">
227 <button type="button" class="btn btn-sm select-menu-button js-menu-target" dat a-ga-click="Repository, clone Embed, location:repo overview">
228 Embed
229 </button>
230 </div>
231 <input type="text" class="form-control input-monospace input-sm js-zeroclipboard -target js-url-field" value="&lt;script src=&quot;https://gist.github.com/eernst g/ffc7bd281974e9018f10f0cb6cfee4aa.js&quot;&gt;&lt;/script&gt;" aria-label="Clon e this repository at &lt;script src=&quot;https://gist.github.com/eernstg/ffc7bd 281974e9018f10f0cb6cfee4aa.js&quot;&gt;&lt;/script&gt;" readonly>
232 <div class="input-group-button">
233 <button aria-label="Copy to clipboard" class="js-zeroclipboard btn btn-sm zero clipboard-button tooltipped tooltipped-s" data-copied-hint="Copied!" type="butto n"><svg aria-hidden="true" class="octicon octicon-clippy" height="16" version="1 .1" viewBox="0 0 14 16" width="14"><path fill-rule="evenodd" d="M2 13h4v1H2v-1zm 5-6H2v1h5V7zm2 3V8l-3 3 3 3v-2h5v-2H9zM4.5 9H2v1h2.5V9zM2 12h2.5v-1H2v1zm9 1h1v2 c-.02.28-.11.52-.3.7-.19.18-.42.28-.7.3H1c-.55 0-1-.45-1-1V4c0-.55.45-1 1-1h3c0- 1.11.89-2 2-2 1.11 0 2 .89 2 2h3c.55 0 1 .45 1 1v5h-1V6H1v9h10v-2zM2 5h8c0-.55-. 45-1-1-1H8c-.55 0-1-.45-1-1s-.45-1-1-1-1 .45-1 1-.45 1-1 1H3c-.55 0-1 .45-1 1z"/ ></svg></button>
234 </div>
235
236 </div>
237
238 <div class="select-menu-modal-holder">
239 <div class="select-menu-modal js-menu-content">
240 <div class="select-menu-header">
241 <svg aria-label="Close" class="octicon octicon-x js-menu-close" height ="16" role="img" version="1.1" viewBox="0 0 12 16" width="12"><path fill-rule="e venodd" d="M7.48 8l3.75 3.75-1.48 1.48L6 9.48l-3.75 3.75-1.48-1.48L4.52 8 .77 4. 25l1.48-1.48L6 6.52l3.75-3.75 1.48 1.48z"/></svg>
242 <span class="select-menu-title">What would you like to do?</span>
243 </div>
244
245 <div class="select-menu-list js-navigation-container" role="menu">
246 <div class="select-menu-item js-navigation-item selected" role="menu item" tabindex="0">
247 <svg aria-hidden="true" class="octicon octicon-check select-menu-i tem-icon" height="16" version="1.1" viewBox="0 0 12 16" width="12"><path fill-ru le="evenodd" d="M12 5l-8 8-4-4 1.5-1.5L4 10l6.5-6.5z"/></svg>
248 <div class="select-menu-item-text">
249 <input type="radio" name="protocol_selector" value="embed" check ed>
250 <span class="select-menu-item-heading">
251
252 Embed
253 </span>
254 <span class="description">
255 Embed this gist in your website.
256 </span>
257 <span class="js-select-button-text hidden-select-button-text">
258 <div class="input-group-button">
259 <button type="button" class="btn btn-sm select-menu-button js-menu-target" dat a-ga-click="Repository, clone Embed, location:repo overview">
260 Embed
261 </button>
262 </div>
263 <input type="text" class="form-control input-monospace input-sm js-zeroclipboard -target js-url-field" value="&lt;script src=&quot;https://gist.github.com/eernst g/ffc7bd281974e9018f10f0cb6cfee4aa.js&quot;&gt;&lt;/script&gt;" aria-label="Clon e this repository at &lt;script src=&quot;https://gist.github.com/eernstg/ffc7bd 281974e9018f10f0cb6cfee4aa.js&quot;&gt;&lt;/script&gt;" readonly>
264 <div class="input-group-button">
265 <button aria-label="Copy to clipboard" class="js-zeroclipboard btn btn-sm zero clipboard-button tooltipped tooltipped-s" data-copied-hint="Copied!" type="butto n"><svg aria-hidden="true" class="octicon octicon-clippy" height="16" version="1 .1" viewBox="0 0 14 16" width="14"><path fill-rule="evenodd" d="M2 13h4v1H2v-1zm 5-6H2v1h5V7zm2 3V8l-3 3 3 3v-2h5v-2H9zM4.5 9H2v1h2.5V9zM2 12h2.5v-1H2v1zm9 1h1v2 c-.02.28-.11.52-.3.7-.19.18-.42.28-.7.3H1c-.55 0-1-.45-1-1V4c0-.55.45-1 1-1h3c0- 1.11.89-2 2-2 1.11 0 2 .89 2 2h3c.55 0 1 .45 1 1v5h-1V6H1v9h10v-2zM2 5h8c0-.55-. 45-1-1-1H8c-.55 0-1-.45-1-1s-.45-1-1-1-1 .45-1 1-.45 1-1 1H3c-.55 0-1 .45-1 1z"/ ></svg></button>
266 </div>
267
268 </span>
269 </div>
270 </div>
271 <div class="select-menu-item js-navigation-item " role="menuitem" ta bindex="0">
272 <svg aria-hidden="true" class="octicon octicon-check select-menu-i tem-icon" height="16" version="1.1" viewBox="0 0 12 16" width="12"><path fill-ru le="evenodd" d="M12 5l-8 8-4-4 1.5-1.5L4 10l6.5-6.5z"/></svg>
273 <div class="select-menu-item-text">
274 <input type="radio" name="protocol_selector" value="share" >
275 <span class="select-menu-item-heading">
276
277 Share
278 </span>
279 <span class="description">
280 Copy sharable URL for this gist.
281 </span>
282 <span class="js-select-button-text hidden-select-button-text">
283 <div class="input-group-button">
284 <button type="button" class="btn btn-sm select-menu-button js-menu-target" dat a-ga-click="Repository, clone Share, location:repo overview">
285 Share
286 </button>
287 </div>
288 <input type="text" class="form-control input-monospace input-sm js-zeroclipboard -target js-url-field" value="https://gist.github.com/eernstg/ffc7bd281974e9018f1 0f0cb6cfee4aa" aria-label="Clone this repository at https://gist.github.com/eern stg/ffc7bd281974e9018f10f0cb6cfee4aa" readonly>
289 <div class="input-group-button">
290 <button aria-label="Copy to clipboard" class="js-zeroclipboard btn btn-sm zero clipboard-button tooltipped tooltipped-s" data-copied-hint="Copied!" type="butto n"><svg aria-hidden="true" class="octicon octicon-clippy" height="16" version="1 .1" viewBox="0 0 14 16" width="14"><path fill-rule="evenodd" d="M2 13h4v1H2v-1zm 5-6H2v1h5V7zm2 3V8l-3 3 3 3v-2h5v-2H9zM4.5 9H2v1h2.5V9zM2 12h2.5v-1H2v1zm9 1h1v2 c-.02.28-.11.52-.3.7-.19.18-.42.28-.7.3H1c-.55 0-1-.45-1-1V4c0-.55.45-1 1-1h3c0- 1.11.89-2 2-2 1.11 0 2 .89 2 2h3c.55 0 1 .45 1 1v5h-1V6H1v9h10v-2zM2 5h8c0-.55-. 45-1-1-1H8c-.55 0-1-.45-1-1s-.45-1-1-1-1 .45-1 1-.45 1-1 1H3c-.55 0-1 .45-1 1z"/ ></svg></button>
291 </div>
292
293 </span>
294 </div>
295 </div>
296 <div class="select-menu-item js-navigation-item " role="menuitem" ta bindex="0">
297 <svg aria-hidden="true" class="octicon octicon-check select-menu-i tem-icon" height="16" version="1.1" viewBox="0 0 12 16" width="12"><path fill-ru le="evenodd" d="M12 5l-8 8-4-4 1.5-1.5L4 10l6.5-6.5z"/></svg>
298 <div class="select-menu-item-text">
299 <input type="radio" name="protocol_selector" value="http" >
300 <span class="select-menu-item-heading">
301 Clone via
302 HTTPS
303 </span>
304 <span class="description">
305 Clone with Git or checkout with SVN using the repository's w eb address.
306 </span>
307 <span class="js-select-button-text hidden-select-button-text">
308 <div class="input-group-button">
309 <button type="button" class="btn btn-sm select-menu-button js-menu-target" dat a-ga-click="Repository, clone HTTPS, location:repo overview">
310 HTTPS
311 </button>
312 </div>
313 <input type="text" class="form-control input-monospace input-sm js-zeroclipboard -target js-url-field" value="https://gist.github.com/ffc7bd281974e9018f10f0cb6cf ee4aa.git" aria-label="Clone this repository at https://gist.github.com/ffc7bd28 1974e9018f10f0cb6cfee4aa.git" readonly>
314 <div class="input-group-button">
315 <button aria-label="Copy to clipboard" class="js-zeroclipboard btn btn-sm zero clipboard-button tooltipped tooltipped-s" data-copied-hint="Copied!" type="butto n"><svg aria-hidden="true" class="octicon octicon-clippy" height="16" version="1 .1" viewBox="0 0 14 16" width="14"><path fill-rule="evenodd" d="M2 13h4v1H2v-1zm 5-6H2v1h5V7zm2 3V8l-3 3 3 3v-2h5v-2H9zM4.5 9H2v1h2.5V9zM2 12h2.5v-1H2v1zm9 1h1v2 c-.02.28-.11.52-.3.7-.19.18-.42.28-.7.3H1c-.55 0-1-.45-1-1V4c0-.55.45-1 1-1h3c0- 1.11.89-2 2-2 1.11 0 2 .89 2 2h3c.55 0 1 .45 1 1v5h-1V6H1v9h10v-2zM2 5h8c0-.55-. 45-1-1-1H8c-.55 0-1-.45-1-1s-.45-1-1-1-1 .45-1 1-.45 1-1 1H3c-.55 0-1 .45-1 1z"/ ></svg></button>
316 </div>
317
318 </span>
319 </div>
320 </div>
321 </div>
322 <div class="select-menu-list" role="menu">
323 <a class="select-menu-item select-menu-action" href="https://help.gith ub.com/articles/which-remote-url-should-i-use" target="_blank">
324 <svg aria-hidden="true" class="octicon octicon-question select-menu- item-icon" height="16" version="1.1" viewBox="0 0 14 16" width="14"><path fill-r ule="evenodd" d="M6 10h2v2H6v-2zm4-3.5C10 8.64 8 9 8 9H6c0-.55.45-1 1-1h.5c.28 0 .5-.22.5-.5v-1c0-.28-.22-.5-.5-.5h-1c-.28 0-.5.22-.5.5V7H4c0-1.5 1.5-3 3-3s3 1 3 2.5zM7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3 .14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7z"/> </svg>
325 <div class="select-menu-item-text">
326 Learn more about clone URLs
327 </div>
328 </a>
329 </div>
330 </div>
331 </div>
332 </div>
333 </div>
334
335
336 <div class="file-navigation-option">
337 </div>
338
339
340 <div class="file-navigation-option">
341 <a href="/eernstg/ffc7bd281974e9018f10f0cb6cfee4aa/archive/99158a070435c0e f7a13abd49b04de53248ef82b.zip"
342 class="btn btn-sm"
343 rel="nofollow"
344 data-ga-click="Gist, download zip, location:gist overview">
345 Download ZIP
346 </a>
347 </div>
348 </div>
349
350 <div class="float-left">
351 <nav class="reponav js-repo-nav js-sidenav-container-pjax"
352 role="navigation"
353 data-pjax="#gist-pjax-container">
354
355 <a href="/eernstg/ffc7bd281974e9018f10f0cb6cfee4aa" aria-label="Code" class="j s-selected-navigation-item selected reponav-item" data-hotkey="g c" data-pjax="t rue" data-selected-links="gist_code /eernstg/ffc7bd281974e9018f10f0cb6cfee4aa">
356 <svg aria-hidden="true" class="octicon octicon-code" height="16" version="1. 1" viewBox="0 0 14 16" width="14"><path fill-rule="evenodd" d="M9.5 3L8 4.5 11.5 8 8 11.5 9.5 13 14 8 9.5 3zm-5 0L0 8l4.5 5L6 11.5 2.5 8 6 4.5 4.5 3z"/></svg>
357 Code
358 </a>
359 <a href="/eernstg/ffc7bd281974e9018f10f0cb6cfee4aa/revisions" aria-label="Re visions" class="js-selected-navigation-item reponav-item" data-hotkey="g r" data -pjax="true" data-selected-links="gist_revisions /eernstg/ffc7bd281974e9018f10f0 cb6cfee4aa/revisions">
360 <svg aria-hidden="true" class="octicon octicon-git-commit" height="16" ver sion="1.1" viewBox="0 0 14 16" width="14"><path fill-rule="evenodd" d="M10.86 7c -.45-1.72-2-3-3.86-3-1.86 0-3.41 1.28-3.86 3H0v2h3.14c.45 1.72 2 3 3.86 3 1.86 0 3.41-1.28 3.86-3H14V7h-3.14zM7 10.2c-1.22 0-2.2-.98-2.2-2.2 0-1.22.98-2.2 2.2-2 .2 1.22 0 2.2.98 2.2 2.2 0 1.22-.98 2.2-2.2 2.2z"/></svg>
361 Revisions
362 <span class="Counter">35</span>
363 </a>
364
365 </nav>
366
367 </div>
368 </div>
369
370
371 </div>
372 </div>
373
374 <div class="container new-discussion-timeline experiment-repo-nav">
375 <div class="repository-content gist-content">
376
377 <div>
378 <div class="repository-meta js-details-container Details">
379 <div class="repository-meta-content" itemprop="about">
380 INFORMAL SPECIFICATION: Generic Function Type Alias
381 </div>
382 </div>
383
384
385 <div class="js-gist-file-update-container js-task-list-container file-bo x">
386 <div id="file-genericfunctiontypealias-md" class="file">
387 <div class="file-header">
388 <div class="file-actions">
389
390 <a href="/eernstg/ffc7bd281974e9018f10f0cb6cfee4aa/raw/99158a070435c0e f7a13abd49b04de53248ef82b/GenericFunctionTypeAlias.md" class="btn btn-sm ">Raw</ a>
391 </div>
392 <div class="file-info">
393 <span class="icon">
394 <svg aria-hidden="true" class="octicon octicon-gist" height="16" ver sion="1.1" viewBox="0 0 12 16" width="12"><path fill-rule="evenodd" d="M7.5 5L10 7.5 7.5 10l-.75-.75L8.5 7.5 6.75 5.75 7.5 5zm-3 0L2 7.5 4.5 10l.75-.75L3.5 7.5l 1.75-1.75L4.5 5zM0 13V2c0-.55.45-1 1-1h10c.55 0 1 .45 1 1v11c0 .55-.45 1-1 1H1c- .55 0-1-.45-1-1zm1 0h10V2H1v11z"/></svg>
395 </span>
396 <a class="tooltipped tooltipped-s css-truncate" aria-label="Permalink" href="#file-genericfunctiontypealias-md">
397 <strong class="user-select-contain gist-blob-name css-truncate-targe t">
398 GenericFunctionTypeAlias.md
399 </strong>
400 </a>
401 </div>
402 </div>
403
404 <div id="readme" class="readme blob instapaper_body">
405 <article class="markdown-body entry-content" itemprop="text"><h1><a id="user -content-feature-generic-function-type-alias" class="anchor" href="#feature-gene ric-function-type-alias" aria-hidden="true"><svg aria-hidden="true" class="octic on octicon-link" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-. 98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2 -1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 1 3h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></path></svg></a>Feature: Generic Function Type Alias</h1>
406 <p><strong>Status</strong>: Under implementation.</p>
407 <p><strong>This document</strong> is an informal specification of a feature supp orting the
408 definition of function type aliases using a more expressive syntax than the
409 one available today, such that it also covers generic function types. The
410 feature also introduces syntax for specifying function types directly, such
411 that they can be used in type annotations etc. without going via a
412 <code>typedef</code>. This feature is being introduced into Dart starting Q4, 2 016.</p>
413 <p><strong>This feature</strong> introduces a new syntactic form of typedef decl aration
414 which includes an identifier and a type, connecting the two with an equals
415 sign, <code>=</code>. The effect of such a declaration is that the name is decla red to
416 be an alias for the type. Type parameterization may occur in the
417 declaration itself, as well as in the declared type. This feature also
418 introduces syntax for specifying function types directly, using a syntax
419 which is similar to the header of a function declaration.</p>
420 <p>The <strong>motivation</strong> for adding this feature is that it allows dev elopers to
421 specify generic function types everywhere a type is expected, including
422 type annotations, return types, actual type arguments, and formal type
423 parameter bounds. Currently there is no way to specify a generic function
424 type in these situations. Even in the case where a generic function type
425 <em>can</em> be specified (such as a type annotation for a formal parameter) it
426 may be useful for readability to declare a name as an alias of a complex
427 type, and use that name instead of the type.</p>
428 <h2><a id="user-content-examples" class="anchor" href="#examples" aria-hidden="t rue"><svg aria-hidden="true" class="octicon octicon-link" height="16" version="1 .1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58- .45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c- 1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z">< /path></svg></a>Examples</h2>
429 <p>Using the new syntax, a function type alias may be declared as follows:</p>
430 <div class="highlight highlight-source-dart"><pre><span class="pl-k">typedef</sp an> F = List&lt;T&gt; Function&lt;T&gt;(T);</pre></div>
431 <p>This declares <code>F</code> to be the type of a function that accepts one ty pe
432 parameter <code>T</code> and one value parameter of type <code>T</code> whose na me is
433 unspecified, and returns a result of type <code>List&lt;T&gt;</code>. It is poss ible to use
434 the new syntax to declare function types that we can already declare using
435 the existing typedef declaration. For instance, <code>G</code> and <code>H</code > both declare
436 the same type:</p>
437 <div class="highlight highlight-source-dart"><pre><span class="pl-k">typedef</sp an> G = List&lt;int&gt; Function(<span class="pl-k">int</span>); <span class="pl -c">// New form.</span>
438 <span class="pl-k">typedef</span> List&lt;int&gt; H(<span class="pl-k">int</span > i); <span class="pl-c">// Old form.</span></pre></div>
439 <p>Note that the name of the parameter is required in the old form, but the
440 type may be omitted. In contrast, the type is required in the new form, but
441 the name may be omitted.</p>
442 <p>The reason for having two ways to express the same thing is that the new
443 form seamlessly covers non-generic functions as well as generic ones, and
444 developers might prefer to use the new form everywhere, for improved
445 readability.</p>
446 <p><em>We may deprecate the old form after a while, or we may choose
447 to keep it, because it is more concise. We may even change the old form to
448 allow omitting the name and not the type when only one identifier is
449 specified, if this is not too much of a breaking change. As an intermediate
450 step we could change the old form to always require both the type and the
451 name, such that no type expressions will silently change meaning.</em></p>
452 <p>There is a difference between declaring a generic function type and
453 declaring a typedef which takes a type argument. The former is a
454 declaration of a single type which describes a certain class of runtime
455 entities: Functions that are capable of accepting some type arguments as
456 well as some value arguments, both at runtime. The latter is a type-level
457 function: It accepts a type argument at compile time and returns a type,
458 which may be used, say, as a type annotation. Dart has had support for
459 parameterized typedefs for a while, and the new syntax supports
460 parameterized typedefs as well. Here is an example of a parameterized
461 typedef, and a usage thereof:</p>
462 <div class="highlight highlight-source-dart"><pre><span class="pl-k">typedef</sp an> I&lt;T&gt; = List&lt;T&gt; Function(T); <span class="pl-c">// New form.</spa n>
463 <span class="pl-k">typedef</span> List&lt;T&gt; J&lt;T&gt;(T t); <span class="pl -c">// Old form.</span>
464 I<span class="pl-k">&lt;</span><span class="pl-k">int</span><span class="pl-k">& gt;</span> myFunction(J<span class="pl-k">&lt;</span><span class="pl-k">int</spa n><span class="pl-k">&gt;</span> f) <span class="pl-k">=</span><span class="pl-k ">&gt;</span> f;</pre></div>
465 <p>Here, we have declared two equivalent parameterized typedefs <code>I</code> a nd <code>J</code>,
466 and we have used an instantiation of each of them in the type annotations
467 on <code>myFunction</code>. Note that the type of <code>myFunction</code> does n ot include <em>any</em>
468 generic types, it is just a function that accepts an argument and returns a
469 result, both of which have a non-generic function type that we have
470 obtained by instantiating a parameterized typedef. The argument type might
471 as well have been declared using the traditional function signature syntax,
472 and the return type (and the argument type, by the way) might as well have
473 been declared using a regular, non-parameterized typedef:</p>
474 <div class="highlight highlight-source-dart"><pre><span class="pl-k">typedef</sp an> List&lt;int&gt; K(<span class="pl-k">int</span> i); <span class="pl-c">// Ol d form, non-generic.</span>
475 K myFunction2(<span class="pl-k">List</span><span class="pl-k">&lt;</span><span class="pl-k">int</span><span class="pl-k">&gt;</span> f(<span class="pl-k">int</ span> i)) <span class="pl-k">=</span><span class="pl-k">&gt;</span> f; <span cla ss="pl-c">// Same as myFunction.</span></pre></div>
476 <p>The new syntax allows for using the two kinds of type parameters together:</p >
477 <div class="highlight highlight-source-dart"><pre><span class="pl-k">typedef</sp an> L&lt;T&gt; = List&lt;T&gt; Function&lt;S&gt;(S, {T Function(<span class="pl- k">int</span>, S) factory});</pre></div>
478 <p>This declares <code>L</code> to be a parameterized typedef; when instantiatin g <code>L</code>
479 with an actual type argument as in <code>L&lt;String&gt;</code>, it becomes the type of a
480 generic function that accepts a type argument <code>S</code> and two value argum ents:
481 one required positional argument of type <code>S</code>, and one named optional
482 argument with name <code>factory</code> and type <code>String Function(int, S)</ code>; finally,
483 it returns a value of type <code>List&lt;String&gt;</code>.</p>
484 <h2><a id="user-content-syntax" class="anchor" href="#syntax" aria-hidden="true" ><svg aria-hidden="true" class="octicon octicon-link" height="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3- 1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09 .53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></pat h></svg></a>Syntax</h2>
485 <p>The new form of <code>typedef</code> declaration uses the following syntax (t here are
486 no deletions from the grammar; addition of a new rule or a new alternative
487 in a rule is marked with NEW and modified rules are marked CHANGED):</p>
488 <pre><code>typeAlias:
489 metadata 'typedef' typeAliasBody |
490 metadata 'typedef' identifier typeParameters? '=' functionType ';' // NE W
491 functionType: // NEW
492 returnType? 'Function' typeParameters? parameterTypeList
493 parameterTypeList: // NEW
494 '(' ')' |
495 '(' normalParameterTypes ','? ')' |
496 '(' normalParameterTypes ',' optionalParameterTypes ')' |
497 '(' optionalParameterTypes ')'
498 normalParameterTypes: // NEW
499 normalParameterType (',' normalParameterType)*
500 normalParameterType: // NEW
501 type | typedIdentifier
502 optionalParameterTypes: // NEW
503 optionalPositionalParameterTypes | namedParameterTypes
504 optionalPositionalParameterTypes: // NEW
505 '[' normalParameterTypes ','? ']'
506 namedParameterTypes: // NEW
507 '{' typedIdentifier (',' typedIdentifier)* ','? '}'
508 typedIdentifier: // NEW
509 type identifier
510 type: // CHANGED
511 typeWithoutFunction |
512 functionType
513 typeWithoutFunction: // NEW
514 typeName typeArguments?
515 typeWithoutFunctionList: // NEW
516 typeWithoutFunction (',' typeWithoutFunction)*
517 mixins: // CHANGED
518 'with' typeWithoutFunctionList
519 interfaces: // CHANGED
520 'implements' typeWithoutFunctionList
521 superclass: // CHANGED
522 'extends' typeWithoutFunction
523 mixinApplication: // CHANGED
524 typeWithoutFunction mixins interfaces?
525 newExpression: // CHANGED
526 'new' typeWithoutFunction ('.' identifier)? arguments
527 constObjectExpression: // CHANGED
528 'const' typeWithoutFunction ('.' identifier)? arguments
529 redirectingFactoryConstructorSignature: // CHANGED
530 'const'? 'factory' identifier ('.' identifier)?
531 formalParameterList '=' typeWithoutFunction ('.' identifier)?
532 </code></pre>
533 <p>The syntax relies on treating <code>Function</code> as a fixed element in a f unction
534 type, similar to a keyword or a symbol (many languages use symbols like
535 <code>-&gt;</code> to mark function types).</p>
536 <p><em>The rationale for using this form is that it makes a function type very
537 similar to the header in a declaration of a function with that type: Just
538 replace <code>Function</code> by the name of the function, and add missing param eter
539 names and default values.</em></p>
540 <p><em>The syntax differs from the existing function type syntax
541 (<code>functionSignature</code>) in that the existing syntax allows the type of a
542 parameter to be omitted, but the new syntax allows parameter names to be
543 omitted. The rationale for this change is that a function type where a
544 parameter has a specified name and no type is very likely to be a
545 mistake. For instance, <code>int Function(int)</code> should not be the type of a
546 function that accepts an argument named "int" of type <code>dynamic</code>, it s hould
547 specify <code>int</code> as the parameter type and allow the name to be
548 unspecified. It is still possible to opt in and specify the parameter name,
549 which may be useful as documentation, e.g., if several arguments have the
550 same type.</em></p>
551 <p>The modification of the rule for the nonterminal <code>type</code> may cause parsing
552 ambiguities. We intend to handle them by the following disambiguation rule
553 in the parser: If the parser is at a location L where the tokens starting
554 at L may be a <code>type</code> or some other construct (e.g., in the body of a
555 method, when parsing something that may be a statement and may also be a
556 declaration), the parser can commit to parsing a type by detecting that it
557 is looking at the identifier <code>Function</code> followed by <code>&lt;</code> or <code>(</code>, or that it
558 is looking at a type followed by the identifier <code>Function</code> followed b y <code>&lt;</code>
559 or <code>(</code>.</p>
560 <p><em>Note that this disambiguation rule does require parsers to have unlimited
561 lookahead. However, if a "diet parsing" strategy is used where the token
562 stream already contains references from each opening bracket (such as <code>&lt; </code>
563 or <code>(</code>) to the corresponding closing bracket then the decision can be
564 taken in a fixed number of steps: If the current token is <code>Function</code> then
565 check the immediate successor (<code>&lt;</code> or <code>(</code> means yes, we are looking at
566 a <code>type</code>, everything else means no) and we're done; if the first toke n is
567 an <code>identifier</code> other than <code>Function</code> then we can check wh ether it is a
568 <code>qualified</code> by looking at no more than the two next tokens, and we ma y then
569 check whether the next token again is <code>&lt;</code>; if it is not then we lo ok for
570 <code>Function</code> and the token after that, and if it is <code>&lt;</code> t hen look for the
571 corresponding <code>&gt;</code> (we have now skipped a generic class type), and then
572 the successor to that token again must be <code>Function</code>, and we finally check
573 its successor (looking for <code>&lt;</code> or <code>(</code> again). This skip s over the
574 presumed type arguments to a generic class type without checking that they
575 are actually type arguments, but we conjecture that there are no
576 syntactically correct alternatives (for example, we conjecture that there
577 is no syntactically correct statement, not a declaration, starting with
578 <code>SomeIdentifier&lt;...&gt; Function(...</code> where the angle brackets are balanced).</em></p>
579 <p><em>Note that this disambiguation rule will prevent parsing some otherwise
580 correct programs. For instance, the declaration of an asynchronous function
581 named <code>Function</code> with an omitted return type (meaning <code>dynamic</ code>) and an
582 argument named <code>int</code> of type <code>dynamic</code> using <code>Functio n(int) async {}</code> will
583 be a parse error, because the parser will commit to parsing a type after
584 having seen "<code>Function(</code>" as a lookahead. However, we do not expect t hat it
585 will be a serious problem for developers to be unable to write such
586 programs.</em></p>
587 <h2><a id="user-content-scoping" class="anchor" href="#scoping" aria-hidden="tru e"><svg aria-hidden="true" class="octicon octicon-link" height="16" version="1.1 " viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0- 3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.4 5 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1. 09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></p ath></svg></a>Scoping</h2>
588 <p>Consider a typedef declaration as introduced by this feature, i.e., a
589 construct on the form</p>
590 <pre><code>metadata 'typedef' identifier typeParameters? '=' functionType ';'
591 </code></pre>
592 <p>This declaration introduces <code>identifier</code> into the enclosing librar y scope.</p>
593 <p>Consider a parameterized typedef, i.e., a construct on the form</p>
594 <pre><code>metadata 'typedef' identifier typeParameters '=' functionType ';'
595 </code></pre>
596 <p>Note that in this case the <code>typeParameters</code> are present, not optio nal. This
597 construct introduces a scope known as the <em>typedef scope</em>. Each typedef
598 scope is nested inside the library scope of the enclosing library. Every
599 formal type parameter declared by the <code>typeParameters</code> in this constr uct
600 introduces a type variable into its enclosing typedef scope. The typedef
601 scope is the current scope for the <code>typeParameters</code> themselves, and f or the
602 <code>functionType</code>.</p>
603 <p>Consider a <code>functionType</code> specifying a generic function type, i.e. , a
604 construct on the form</p>
605 <pre><code>returnType? 'Function' typeParameters parameterTypeList
606 </code></pre>
607 <p>Note again that <code>typeParameters</code> are present, not optional. This c onstruct
608 introduces a scope known as a <em>function type scope</em>. The function type
609 scope is nested inside the current scope for the associated <code>functionType</ code>.
610 Every formal type parameter declared by the <code>typeParameters</code> introduc es a
611 type variable into its enclosing function type scope. The function type
612 scope is the current scope for the entire <code>functionType</code>.</p>
613 <p><em>This implies that parameterized typedefs and function types are capable o f
614 specifying F-bounded type parameters, because the type parameters are in
615 scope in the type parameter list itself.</em></p>
616 <h2><a id="user-content-static-analysis" class="anchor" href="#static-analysis" aria-hidden="true"><svg aria-hidden="true" class="octicon octicon-link" height=" 16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9 zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S1 4.5 6 13 6z"></path></svg></a>Static Analysis</h2>
617 <p>Consider a typedef declaration as introduced by this feature, i.e., a
618 construct on the form</p>
619 <pre><code>metadata 'typedef' identifier typeParameters? '=' functionType ';'
620 </code></pre>
621 <p>It is a compile-time error if a name <em>N</em> introduced into a library sco pe by
622 a typedef has an associated <code>functionType</code> which depends directly or
623 indirectly on <em>N</em>. It is a compile-time error if a bound on a formal type
624 parameter in <code>typeParameters</code> is not a type. It is a compile-time err or if
625 a typedef has an associated <code>functionType</code> which is not a type when
626 analyzed under the assumption that every identifier resolving to a formal
627 type parameter in <code>typeParameters</code> is a type. It is a compile-time er ror if
628 an instantiation <em>F&lt;T1..Tk&gt;</em> of a parameterized typedef is mal-boun ded.</p>
629 <p><em>This implies that a typedef cannot be recursive. It can only introduce a
630 name as an alias for a type which is already expressible as a
631 <code>functionType</code>, or a name for a type-level function F where every
632 well-bounded invocation <code>F&lt;T1..Tk&gt;</code> denotes a type which could be expressed
633 as a <code>functionType</code>. Following
634 <a href="https://en.wikipedia.org/wiki/Kind_(type_theory)">common terminology</a >, we
635 could say that a typedef can define entities of kind <code>*</code> and of kind
636 <code>* -&gt; *</code>, and, when it is assumed that every formal type parameter of the
637 typedef (if any) has kind <code>*</code>, it is an error if the right hand side of the
638 declaration denotes an entity of any other kind than <code>*</code>; in particul ar,
639 declarations of entities of kind <code>* -&gt; *</code> cannot be curried.</em>< /p>
640 <p>It is a compile-time error if a name declared in a typedef, with or without
641 actual type arguments, is used as a superclass, superinterface, or mixin.</p>
642 <h2><a id="user-content-dynamic-semantics" class="anchor" href="#dynamic-semanti cs" aria-hidden="true"><svg aria-hidden="true" class="octicon octicon-link" heig ht="16" version="1.1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d ="M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.7 2-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42- 1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3 .5S14.5 6 13 6z"></path></svg></a>Dynamic Semantics</h2>
643 <p>The addition of this feature does not change the dynamic semantics of
644 Dart.</p>
645 <h2><a id="user-content-changes" class="anchor" href="#changes" aria-hidden="tru e"><svg aria-hidden="true" class="octicon octicon-link" height="16" version="1.1 " viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M4 9h1v1H4c-1.5 0- 3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.4 5 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1. 09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z"></p ath></svg></a>Changes</h2>
646 <p>2017-Jan-04: Adjusted the grammar to require named parameter types to have
647 a type (previously, the type was optional).</p>
648 <p>2016-Dec-21: Changed the grammar to prevent the new function type syntax
649 in several locations (for instance, as a super class or as a mixin). The
650 main change in the grammar is the introduction of <code>typeWithoutFunction</cod e>.</p>
651 <p>2016-Dec-15: Changed the grammar to prevent the old style function types
652 (derived from <code>functionSignature</code> in the grammar) from occurring insi de
653 the new style (<code>functionType</code>).</p>
654 </article>
655 </div>
656
657 </div>
658
659 </div>
660
661
662 <a name="comments"></a>
663 <div class="discussion-timeline gist-discussion-timeline js-quote-selection- container ">
664 <div class="js-discussion js-socket-channel" data-channel="marked-as-read: gist:42910666">
665
666
667
668
669
670 <!-- Rendered timeline since 2017-01-04 03:41:57 -->
671 <div id="partial-timeline-marker"
672 class="js-timeline-marker js-updatable-content"
673 data-url="/eernstg/ffc7bd281974e9018f10f0cb6cfee4aa/show_partial?partial=g ist%2Ftimeline_marker&amp;since=1483530117"
674 data-last-modified="Wed, 04 Jan 2017 11:41:57 GMT"
675 >
676 </div>
677
678
679 <div class="discussion-timeline-actions">
680 <div class="flash flash-warn mt-3">
681 <a href="/join?source=comment-gist" class="btn btn-primary" rel="nofollow">S ign up for free</a>
682 <strong>to join this conversation on GitHub</strong>.
683 Already have an account?
684 <a href="/login?return_to=https%3A%2F%2Fgist.github.com%2Feernstg%2Fffc7bd28 1974e9018f10f0cb6cfee4aa" rel="nofollow">Sign in to comment</a>
685 </div>
686
687 </div>
688 </div>
689 </div>
690 </div>
691 </div>
692
693 <div class="modal-backdrop js-touch-events"></div>
694 </div><!-- /.container -->
695
696 </div>
697 </div>
698
699 </div>
700
701 <div class="container site-footer-container">
702 <div class="site-footer" role="contentinfo">
703 <ul class="site-footer-links float-right">
704 <li><a href="https://github.com/contact" data-ga-click="Footer, go to co ntact, text:contact">Contact GitHub</a></li>
705 <li><a href="https://developer.github.com" data-ga-click="Footer, go to ap i, text:api">API</a></li>
706 <li><a href="https://training.github.com" data-ga-click="Footer, go to tra ining, text:training">Training</a></li>
707 <li><a href="https://shop.github.com" data-ga-click="Footer, go to shop, t ext:shop">Shop</a></li>
708 <li><a href="https://github.com/blog" data-ga-click="Footer, go to blog, text:blog">Blog</a></li>
709 <li><a href="https://github.com/about" data-ga-click="Footer, go to abou t, text:about">About</a></li>
710
711 </ul>
712
713 <a href="https://github.com" aria-label="Homepage" class="site-footer-mark" title="GitHub">
714 <svg aria-hidden="true" class="octicon octicon-mark-github" height="24" ve rsion="1.1" viewBox="0 0 16 16" width="24"><path fill-rule="evenodd" d="M8 0C3.5 8 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1 .49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.6 3-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64 -.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82. 64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.9 2.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0 0 16 8c0-4.42-3.58-8-8- 8z"/></svg>
715 </a>
716 <ul class="site-footer-links">
717 <li>&copy; 2017 <span title="0.21418s from github-fe134-cp1-prd.iad.github .net">GitHub</span>, Inc.</li>
718 <li><a href="https://github.com/site/terms" data-ga-click="Footer, go to terms, text:terms">Terms</a></li>
719 <li><a href="https://github.com/site/privacy" data-ga-click="Footer, go to privacy, text:privacy">Privacy</a></li>
720 <li><a href="https://github.com/security" data-ga-click="Footer, go to s ecurity, text:security">Security</a></li>
721 <li><a href="https://status.github.com/" data-ga-click="Footer, go to st atus, text:status">Status</a></li>
722 <li><a href="https://help.github.com" data-ga-click="Footer, go to help, text:help">Help</a></li>
723 </ul>
724 </div>
725 </div>
726
727
728
729
730
731 <div id="ajax-error-message" class="ajax-error-message flash flash-error">
732 <svg aria-hidden="true" class="octicon octicon-alert" height="16" version="1 .1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M8.865 1.52c-.18 -.31-.51-.5-.87-.5s-.69.19-.87.5L.275 13.5c-.18.31-.18.69 0 1 .19.31.52.5.87.5h1 3.7c.36 0 .69-.19.86-.5.17-.31.18-.69.01-1L8.865 1.52zM8.995 13h-2v-2h2v2zm0-3h- 2V6h2v4z"/></svg>
733 <button type="button" class="flash-close js-flash-close js-ajax-error-dismis s" aria-label="Dismiss error">
734 <svg aria-hidden="true" class="octicon octicon-x" height="16" version="1.1 " viewBox="0 0 12 16" width="12"><path fill-rule="evenodd" d="M7.48 8l3.75 3.75- 1.48 1.48L6 9.48l-3.75 3.75-1.48-1.48L4.52 8 .77 4.25l1.48-1.48L6 6.52l3.75-3.75 1.48 1.48z"/></svg>
735 </button>
736 You can't perform that action at this time.
737 </div>
738
739
740 <script crossorigin="anonymous" src="https://assets-cdn.github.com/assets/co mpat-8a4318ffea09a0cdb8214b76cf2926b9f6a0ced318a317bed419db19214c690d.js"></scri pt>
741 <script crossorigin="anonymous" src="https://assets-cdn.github.com/assets/fr ameworks-6d109e75ad8471ba415082726c00c35fb929ceab975082492835f11eca8c07d9.js"></ script>
742 <script async="async" crossorigin="anonymous" src="https://assets-cdn.github .com/assets/github-55316b70ec9eb5a4dd5cd168f8f8da4d5fe20c53564512dd5aace9898aed7 0c5.js"></script>
743
744
745
746
747 <div class="js-stale-session-flash stale-session-flash flash flash-warn flash- banner d-none">
748 <svg aria-hidden="true" class="octicon octicon-alert" height="16" version="1 .1" viewBox="0 0 16 16" width="16"><path fill-rule="evenodd" d="M8.865 1.52c-.18 -.31-.51-.5-.87-.5s-.69.19-.87.5L.275 13.5c-.18.31-.18.69 0 1 .19.31.52.5.87.5h1 3.7c.36 0 .69-.19.86-.5.17-.31.18-.69.01-1L8.865 1.52zM8.995 13h-2v-2h2v2zm0-3h- 2V6h2v4z"/></svg>
749 <span class="signed-in-tab-flash">You signed in with another tab or window. <a href="">Reload</a> to refresh your session.</span>
750 <span class="signed-out-tab-flash">You signed out in another tab or window. <a href="">Reload</a> to refresh your session.</span>
751 </div>
752 <div class="facebox" id="facebox" style="display:none;">
753 <div class="facebox-popup">
754 <div class="facebox-content" role="dialog" aria-labelledby="facebox-header" aria-describedby="facebox-description">
755 </div>
756 <button type="button" class="facebox-close js-facebox-close" aria-label="Clo se modal">
757 <svg aria-hidden="true" class="octicon octicon-x" height="16" version="1.1 " viewBox="0 0 12 16" width="12"><path fill-rule="evenodd" d="M7.48 8l3.75 3.75- 1.48 1.48L6 9.48l-3.75 3.75-1.48-1.48L4.52 8 .77 4.25l1.48-1.48L6 6.52l3.75-3.75 1.48 1.48z"/></svg>
758 </button>
759 </div>
760 </div>
761
762
763 </body>
764 </html>
765
OLDNEW
« no previous file with comments | « no previous file | docs/language/informal/generic-method-syntax.md » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698