File: indexops.html

package info (click to toggle)
ocaml-doc 4.11-2
  • links: PTS, VCS
  • area: non-free
  • in suites: bookworm, bullseye, forky, sid, trixie
  • size: 20,580 kB
  • sloc: sh: 37; makefile: 11
file content (158 lines) | stat: -rw-r--r-- 10,444 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
<!DOCTYPE html>
<html>
<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="generator" content="hevea 2.32">

  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1">
<link rel="stylesheet" type="text/css" href="manual.css">
<title>8.19  Extended indexing operators </title>
</head>
<body>
<a href="doccomments.html"><img src="previous_motif.svg" alt="Previous"></a>
<a href="extn.html"><img src="contents_motif.svg" alt="Up"></a>
<a href="emptyvariants.html"><img src="next_motif.svg" alt="Next"></a>
<hr>
<h2 class="section" id="s:index-operators"><a class="section-anchor" href="#s:index-operators" aria-hidden="true"></a>8.19  Extended indexing operators </h2>
<ul>
<li><a href="indexops.html#ss%3Amultiindexing">8.19.1  Multi-index notation</a>
</li></ul>
<p>
(Introduced in 4.06)</p><div class="syntax"><table class="display dcenter"><tr class="c019"><td class="dcell"><table class="c001 cellpading0"><tr><td class="c018"><a class="syntax" id="dot-ext"><span class="c010">dot-ext</span></a></td><td class="c015">::=</td><td class="c017">
 </td></tr>
<tr><td class="c018">&nbsp;</td><td class="c015">∣</td><td class="c017"> <a class="syntax" href="#dot-operator-char"><span class="c010">dot-operator-char</span></a>  { <a class="syntax" href="lex.html#operator-char"><span class="c010">operator-char</span></a> }
 </td></tr>
<tr><td class="c018">&nbsp;</td></tr>
<tr><td class="c018">
<a class="syntax" id="dot-operator-char"><span class="c010">dot-operator-char</span></a></td><td class="c015">::=</td><td class="c017">
<span class="c004">!</span> ∣   <span class="c004">?</span> ∣  <a class="syntax" href="lex.html#core-operator-char"><span class="c010">core-operator-char</span></a> ∣  <span class="c004">%</span> ∣  <span class="c004">:</span>
 </td></tr>
<tr><td class="c018">&nbsp;</td></tr>
<tr><td class="c018">
<a class="syntax" href="expr.html#expr"><span class="c010">expr</span></a></td><td class="c015">::=</td><td class="c017">
...
 </td></tr>
<tr><td class="c018">&nbsp;</td><td class="c015">∣</td><td class="c017"> <a class="syntax" href="expr.html#expr"><span class="c010">expr</span></a> <span class="c004">.</span>  [<a class="syntax" href="names.html#module-path"><span class="c010">module-path</span></a> <span class="c004">.</span>]  <a class="syntax" href="#dot-ext"><span class="c010">dot-ext</span></a>  ( <span class="c004">(</span> <a class="syntax" href="expr.html#expr"><span class="c010">expr</span></a> <span class="c004">)</span> ∣  <span class="c004">[</span> <a class="syntax" href="expr.html#expr"><span class="c010">expr</span></a> <span class="c004">]</span> ∣  <span class="c004">{</span> <a class="syntax" href="expr.html#expr"><span class="c010">expr</span></a> <span class="c004">}</span> )  [ <span class="c004">&lt;-</span> <a class="syntax" href="expr.html#expr"><span class="c010">expr</span></a> ]
 </td></tr>
<tr><td class="c018">&nbsp;</td></tr>
<tr><td class="c018">
<span class="c010">operator-name</span></td><td class="c015">::=</td><td class="c017">
...
 </td></tr>
<tr><td class="c018">&nbsp;</td><td class="c015">∣</td><td class="c017"> <span class="c004">.</span> <a class="syntax" href="#dot-ext"><span class="c010">dot-ext</span></a>  (<span class="c004">()</span> ∣  <span class="c004">[]</span> ∣  <span class="c004">{}</span>) [<span class="c004">&lt;-</span>]
 </td></tr>
<tr><td class="c018">&nbsp;</td></tr>
</table></td></tr>
</table></div><p>This extension provides syntactic sugar for getting and setting elements
for user-defined indexed types. For instance, we can define python-like
dictionaries with


</p><div class="caml-example verbatim">

<div class="ocaml">



<div class="pre caml-input"> <span class="ocamlkeyword">module</span> Dict = <span class="ocamlkeyword">struct</span>
 <span class="ocamlkeyword">include</span> Hashtbl
 <span class="ocamlkeyword">let</span> ( .%{} ) tabl index = find tabl index
 <span class="ocamlkeyword">let</span> ( .%{}&lt;- ) tabl index value = add tabl index value
 <span class="ocamlkeyword">end</span>
 <span class="ocamlkeyword">let</span> dict =
   <span class="ocamlkeyword">let</span> dict = Dict.create 10 <span class="ocamlkeyword">in</span>
   <span class="ocamlkeyword">let</span> () =
     dict.Dict.%{<span class="ocamlstring">"one"</span>} &lt;- 1;
     <span class="ocamlkeyword">let</span> <span class="ocamlkeyword">open</span> Dict <span class="ocamlkeyword">in</span>
     dict.%{<span class="ocamlstring">"two"</span>} &lt;- 2 <span class="ocamlkeyword">in</span>
   dict</div></div>

</div><div class="caml-example toplevel">

<div class="ocaml">



<div class="pre caml-input"> dict.Dict.%{<span class="ocamlstring">"one"</span>};;</div>



<div class="pre caml-output ok">- : int = 1</div></div>
<div class="ocaml">



<div class="pre caml-input"> <span class="ocamlkeyword">let</span> <span class="ocamlkeyword">open</span> Dict <span class="ocamlkeyword">in</span> dict.%{<span class="ocamlstring">"two"</span>};;</div>



<div class="pre caml-output ok">- : int = 2</div></div>

</div>
<h3 class="subsection" id="ss:multiindexing"><a class="section-anchor" href="#ss:multiindexing" aria-hidden="true"></a>8.19.1  Multi-index notation</h3>
<div class="syntax"><table class="display dcenter"><tr class="c019"><td class="dcell"><table class="c001 cellpading0"><tr><td class="c018">
<a class="syntax" href="expr.html#expr"><span class="c010">expr</span></a></td><td class="c015">::=</td><td class="c017">
...
 </td></tr>
<tr><td class="c018">&nbsp;</td><td class="c015">∣</td><td class="c017"> <a class="syntax" href="expr.html#expr"><span class="c010">expr</span></a> <span class="c004">.</span>  [<a class="syntax" href="names.html#module-path"><span class="c010">module-path</span></a> <span class="c004">.</span>]  <a class="syntax" href="#dot-ext"><span class="c010">dot-ext</span></a> <span class="c004">(</span>  <a class="syntax" href="expr.html#expr"><span class="c010">expr</span></a>  {<span class="c004">;</span> <a class="syntax" href="expr.html#expr"><span class="c010">expr</span></a> }<sup>+</sup> <span class="c004">)</span>  [ <span class="c004">&lt;-</span> <a class="syntax" href="expr.html#expr"><span class="c010">expr</span></a> ]
 </td></tr>
<tr><td class="c018">&nbsp;</td><td class="c015">∣</td><td class="c017"> <a class="syntax" href="expr.html#expr"><span class="c010">expr</span></a> <span class="c004">.</span>  [<a class="syntax" href="names.html#module-path"><span class="c010">module-path</span></a> <span class="c004">.</span>]  <a class="syntax" href="#dot-ext"><span class="c010">dot-ext</span></a> <span class="c004">[</span>  <a class="syntax" href="expr.html#expr"><span class="c010">expr</span></a>  {<span class="c004">;</span> <a class="syntax" href="expr.html#expr"><span class="c010">expr</span></a> }<sup>+</sup> <span class="c004">]</span>  [ <span class="c004">&lt;-</span> <a class="syntax" href="expr.html#expr"><span class="c010">expr</span></a> ]
 </td></tr>
<tr><td class="c018">&nbsp;</td><td class="c015">∣</td><td class="c017"> <a class="syntax" href="expr.html#expr"><span class="c010">expr</span></a> <span class="c004">.</span>  [<a class="syntax" href="names.html#module-path"><span class="c010">module-path</span></a> <span class="c004">.</span>]  <a class="syntax" href="#dot-ext"><span class="c010">dot-ext</span></a> <span class="c004">{</span>  <a class="syntax" href="expr.html#expr"><span class="c010">expr</span></a>  {<span class="c004">;</span> <a class="syntax" href="expr.html#expr"><span class="c010">expr</span></a> }<sup>+</sup> <span class="c004">}</span>  [ <span class="c004">&lt;-</span> <a class="syntax" href="expr.html#expr"><span class="c010">expr</span></a> ]
 </td></tr>
<tr><td class="c018">&nbsp;</td></tr>
<tr><td class="c018">
<span class="c010">operator-name</span></td><td class="c015">::=</td><td class="c017">
...
 </td></tr>
<tr><td class="c018">&nbsp;</td><td class="c015">∣</td><td class="c017"> <span class="c004">.</span> <a class="syntax" href="#dot-ext"><span class="c010">dot-ext</span></a>  (<span class="c004">(;..)</span> ∣  <span class="c004">[;..]</span> ∣  <span class="c004">{;..}</span>) [<span class="c004">&lt;-</span>]
 </td></tr>
<tr><td class="c018">&nbsp;</td></tr>
</table></td></tr>
</table></div><p>Multi-index are also supported through a second variant of indexing operators</p><div class="caml-example verbatim">

<div class="ocaml">



<div class="pre caml-input"> <span class="ocamlkeyword">let</span> (.%[;..]) = Bigarray.Genarray.get
 <span class="ocamlkeyword">let</span> (.%{;..}) = Bigarray.Genarray.get
 <span class="ocamlkeyword">let</span> (.%(;..)) = Bigarray.Genarray.get</div></div>

</div><p>which is called when an index literals contain a semicolon separated list
of expressions with two and more elements:</p><div class="caml-example verbatim">

<div class="ocaml">



<div class="pre caml-input"> <span class="ocamlkeyword">let</span> sum x y = x.%[1;2;3] + y.%[1;2]
 <span class="ocamlcomment">(* is equivalent to *)</span>
 <span class="ocamlkeyword">let</span> sum x y = (.%[;..]) x [|1;2;3|] + (.%[;..]) y [|1;2|]</div></div>

</div><p>In particular this multi-index notation makes it possible to uniformly handle
indexing Genarray and other implementations of multidimensional arrays.</p><div class="caml-example verbatim">

<div class="ocaml">



<div class="pre caml-input"> <span class="ocamlkeyword">module</span> A = Bigarray.Genarray
 <span class="ocamlkeyword">let</span> (.%{;..}) = A.get
 <span class="ocamlkeyword">let</span> (.%{;..}&lt;- ) = A.set
 <span class="ocamlkeyword">let</span> (.%{ }) a k = A.get a [|k|]
 <span class="ocamlkeyword">let</span> (.%{ }&lt;-) a k x = A.set a [|k|] x
 <span class="ocamlkeyword">let</span> syntax_compare vec mat t3 t4 =
           vec.%{0} = A.get vec [|0|]
    &amp;&amp;   mat.%{0;0} = A.get mat [|0;0|]
    &amp;&amp;   t3.%{0;0;0} = A.get t3 [|0;0;0|]
    &amp;&amp; t4.%{0;0;0;0} = t4.{0,0,0,0}</div></div>

</div>
<hr>
<a href="doccomments.html"><img src="previous_motif.svg" alt="Previous"></a>
<a href="extn.html"><img src="contents_motif.svg" alt="Up"></a>
<a href="emptyvariants.html"><img src="next_motif.svg" alt="Next"></a>
</body>
</html>