diff --git a/doc/userdoc.org b/doc/userdoc.org index 0ed26f5d8c495ab9b839e7fdf131c6cdc2f764d9..8ae00fe166a89918af952366770a5be6bcf29521 100644 --- a/doc/userdoc.org +++ b/doc/userdoc.org @@ -1852,6 +1852,72 @@ The use case of tuples is to provide lists of data to the ~C++~ underlying methods. A classical example is to provide a set of boundary conditions to a method. +**** Tuple and other variables + +If one cannot access to specific values of tuple variables, one can +however dispatch their values to compound variable lists or to simple +variable. To do so the tuple content must be convertible to each of +the compound variable using the operator ~=~ rules (see the conversion +table in section [[implicit-conversion]]). The one to one matching is +checked at runtime. +#+NAME: tuple-to-compound +#+BEGIN_SRC pugs :exports both :results output + let t:(R), t = (1, 2, 3.4, -5); + + let (x, y, u, A):R*R*R^1*R^1x1, (x, y, u, A) = t; + + cout << "t = " << t << "\n"; + cout << "x = " << x << "\n"; + cout << "y = " << y << "\n"; + cout << "u = " << u << "\n"; + cout << "A = " << A << "\n"; +#+END_SRC +This code gives +#+results: tuple-to-compound + +#+BEGIN_note +One could have separate the declarations of ~x~, ~y~, ~u~ and ~A~ from the +affectation. Writing simply at some point + +#+BEGIN_SRC pugs :exports code + (x, y, u, A) = t; +#+END_SRC + +#+END_note + +If the tuple contains only one entry, one can assign its value to a +simple variable. +#+NAME: tuple-to-variable +#+BEGIN_SRC pugs :exports both :results output + let t:(R^3), t = [1, 2, 3]; + + let x:R^3, x = t; + + cout << "t = " << t << "\n"; + cout << "x = " << x << "\n"; +#+END_SRC +One gets +#+results: tuple-to-variable + +If the size of the tuple does not match the number of space defining +the compound type, one gets a runtime error. For instance +#+NAME: tuple-to-compound-wrong-size +#+BEGIN_SRC pugs-error :exports both :results output + let t:(Z), t = (1, 2); + let (a, b, c):R*R*R, (a, b, c) = t; +#+END_SRC +produces +#+results: tuple-to-compound-wrong-size +or +#+NAME: tuple-to-variable-wrong-size +#+BEGIN_SRC pugs-error :exports both :results output + let t:(Z), t = (1, 2); + let a:R, a = t; +#+END_SRC +which gives +#+results: tuple-to-variable-wrong-size + + ** Statements The ~pugs~ language supports classical statements to control the data