12.19 Расширенные операторы индексирования
(Введено в версии 4.06)
|
Это расширение предоставляет синтаксический сахар для получения и установки элементов для пользовательских индексированных типов. Например, мы можем определить словари, подобные python, с
module Dict = struct
include Hashtbl
let ( .%{} ) tabl index = find tabl index
let ( .%{}<- ) tabl index value = add tabl index value
end
let dict =
let dict = Dict.create 10 in
let () =
dict.Dict.%{"one"} <- 1;
let open Dict in
dict.%{"two"} <- 2 in
dict
# dict.Dict.%{"one"};;
- : int = 1 # let open Dict in dict.%{"two"};;
- : int = 2 12.19.1 Многомерная нотация индексов
|
Также поддерживаются многомерные индексы с помощью второго варианта операторов индексирования
let (.%[;..]) = Bigarray.Genarray.get
let (.%{;..}) = Bigarray.Genarray.get
let (.%(;..)) = Bigarray.Genarray.get
который вызывается, когда литералы индексов содержат список выражений, разделенных точкой с запятой, с двумя и более элементами:
let sum x y = x.%[1;2;3] + y.%[1;2] (* is equivalent to *) let sum x y = (.%[;..]) x [|1;2;3|] + (.%[;..]) y [|1;2|]
В частности, эта многомерная нотация индексов позволяет единообразно обрабатывать индексирование Genarray и других реализаций многомерных массивов.
module A = Bigarray.Genarray
let (.%{;..}) = A.get
let (.%{;..}<- ) = A.set
let (.%{ }) a k = A.get a [|k|]
let (.%{ }<-) a k x = A.set a [|k|] x
let syntax_compare vec mat t3 t4 =
vec.%{0} = A.get vec [|0|]
&& mat.%{0;0} = A.get mat [|0;0|]
&& t3.%{0;0;0} = A.get t3 [|0;0;0|]
&& t4.%{0;0;0;0} = t4.{0,0,0,0}
Обратите внимание, что различие между операторами многомерного и одномерного индексирования чисто синтаксическое: операторы многомерного индексирования ограничены выражениями индексов, которые содержат одну или более точек с запятой ;. Например,
let pair vec mat = vec.%{0}, mat.%{0;0}
эквивалентно
let pair vec mat = (.%{ }) vec 0, (.%{;..}) mat [|0;0|]
Обратите внимание, что в случае vec мы вызываем оператор одномерного индексирования (.%{}), а не вариант многомерного индексирования (.{;..}). По этой причине ожидается, что большинству пользователей операторов многомерного индексирования потребуется определить вариант одномерного индексирования
let (.%{;..}) = A.get
let (.%{ }) a k = A.get a [|k|]
для единообразной обработки обоих случаев.
© 1995-2022 INRIA.
https://v2.ocaml.org/releases/5.0/htmlman/indexops.html