diff --git a/doc/userdoc.org b/doc/userdoc.org index dcc8742d1e735a165ed4af818a4d65cf464d669d..cec01a86d2a07b30bcdd53d4bb7c3b8299004576 100644 --- a/doc/userdoc.org +++ b/doc/userdoc.org @@ -727,11 +727,12 @@ In order to avoid ambiguities, in ~pugs~, there is *no implicit* conversion in general. #+BEGIN_note -Actually, there are only two situations for which implicit type +Actually, there are only three situations for which implicit type conversion can occur - when the value is given as a parameter of a function, or - when the value is used as the returned value of a function. -This will be detailed in section [[functions]]. +- when the value is used to define a tuple +This will be detailed in section [[functions]] and [[tuples]] #+END_note This means that all affectation, unary and binary operators are @@ -1613,6 +1614,33 @@ types. This is transparent to the user and provides the intuitive (similar) behavior since data of high-level variables are constant. To illustrate this, let us consider the following example. +#+BEGIN_SRC pugs :exports both + import mesh; + + let m1:mesh, m1 = cartesian2dMesh(0, (1,1), (10,10)); + let m2:mesh, m2 = m1; + let m3:mesh, m3 = cartesian2dMesh(0, (1,1), (10,10)); + + m3 = m1; +#+END_SRC + +In this example, we are dealing with 3 ~mesh~ variables. +- First ~m1~ is defined as a uniform cartesian mesh in dimension 2 of + $]0,1[^2$ made of $10\times10$ identical square cells. +- Then ~m2~ is a copy of the variable ~m1~. It is a copy of the variable, + but the underlying mesh is *the same*! There is no duplication of the + mesh in memory. +- Then the mesh variable ~m3~ is *defined* to refer to a *new* mesh. It is + /similar/ to the mesh contained in ~m1~ and ~m2~, but it is *not* the same + one! When ~m3~ is defined two meshes, (and two connectivities) are + resident in memory. One of the mesh is referred by either ~m1~ or ~m2~ + and the other one is referred by ~m3~. +- Finally, the last instruction (~m3 = m1;~) sets ~m3~ to also refer the + mesh referred by ~m1~ and ~m2~. Since no other variable refers to its + former mesh, it is destroyed (memory is freed). At the end of the + program, all the variables ~m1~, ~m2~ and ~m3~ are referring to the same + mesh, and there is only one mesh that resides in memory. + *** Compound types The ~pugs~ language allow to deal with compound types. The idea is to @@ -1638,6 +1666,12 @@ the output is This is completely equivalent to declaring the variables one after the other. +#+BEGIN_note +Observe that there is no implicit conversion when dealing with +compound types. The ~=~ operators are used sequentially to set the +different variables. +#+END_note + **** Compound definition One can also use the following definition instruction @@ -1708,7 +1742,53 @@ section [[functions]], functions can return compound values, thus compound affectations (or definitions) are needed to get returned values in that case. -*** TODO Tuples types +*** TODO Tuple types<<tuples>> + +The last special type construction is the ability to deal with tuples +in the ~pugs~ language. The tuples we are describing here are lists of +data of a *unique* and *simple* type (one cannot use compound types to +define tuples). + +The list of values given to the tuple must be *implicitly* convertible +to the type of tuple elements. There is no ambiguity, the implicit +conversions follow the rules of operator ~=~. + +**** Tuple declaration and affectation + +For instance, one may write +#+NAME: tuple-declaration-affectation +#+BEGIN_SRC pugs :exports both :results output + let x:(R); + x = (1,2,3.4,2); + cout << x << "\n"; +#+END_SRC +Executing this code, one gets +#+results: tuple-declaration-affectation + +**** Tuple definition + +The definition syntax is also possible. +#+NAME: tuple-definition +#+BEGIN_SRC pugs :exports both :results output + let x:(R^2), x = ((1,2),(3.4,2), 0, (2,3)); + cout << x << "\n"; +#+END_SRC +This code gives +#+results: tuple-definition + +Observe that the special value ~0~ is used there. + +**** Tuple purpose + +Tuples variables are just lists of data of the same type. In the ~pugs~ +language, one cannot access to a specific value of the list nor alter +one of them. This is not something that should ever change. Tuples are +not arrays! The ~pugs~ language is not meant to allow low-level +instructions. + + 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. ** TODO Statements