* Re: "accessibility check failed" on Node
2013-06-26 23:01 "accessibility check failed" on Node Thomas Schmidt
@ 2013-06-26 23:45 ` Shark8
2013-06-26 23:58 ` Jeffrey Carter
` (4 subsequent siblings)
5 siblings, 0 replies; 19+ messages in thread
From: Shark8 @ 2013-06-26 23:45 UTC (permalink / raw)
At first blush, it looks like aNode is Null.
(position : constant NodeSets.Cursor := graph.nodes.Find (aNode.all'Access);)
Try adding "not null" to the parameter... or you could restructure it a bit:
function findNode2
(graph : DirectedGraph;
aNode : access Node'Class)
return Node_Class_Access is
begin
declare
position : constant NodeSets.Cursor :=
graph.nodes.Find (aNode.all'Access);
begin
if position /= NodeSets.No_Element then
return Element (position);
else
raise NoElement;
end if;
exception
When PROGRAM_ERROR => raise NoElement;
end;
end findNode2;
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: "accessibility check failed" on Node
2013-06-26 23:01 "accessibility check failed" on Node Thomas Schmidt
2013-06-26 23:45 ` Shark8
@ 2013-06-26 23:58 ` Jeffrey Carter
2013-06-27 7:36 ` Georg Bauhaus
` (3 subsequent siblings)
5 siblings, 0 replies; 19+ messages in thread
From: Jeffrey Carter @ 2013-06-26 23:58 UTC (permalink / raw)
On 06/26/2013 04:01 PM, Thomas Schmidt wrote:
>
> I'm new to Ada. I'm trying to write some kind of neural net software. Therefore
> I've written a small library to implement the neural graph. All nodes are
> collected in a Hashed_Set. Neurons are specialized Nodes of the graph. To lookup
> a given Neuron/Node I need the following subprogram "findNode".
You'll probably continue to have trouble with Ada as long as you continue to use
anonymous types, unnecessary access types, and un-Ada-like names such as
Findnode (rather than Find_Node).
You could also save yourself a lot of work by using the package
PragmARC.REM_Neural_Network_Wrapper. The PragmAda Reusable Components are
available from pragmada.x10hosting.com.
--
Jeff Carter
"Unix and C are the ultimate computer viruses."
Richard Gabriel
99
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: "accessibility check failed" on Node
2013-06-26 23:01 "accessibility check failed" on Node Thomas Schmidt
2013-06-26 23:45 ` Shark8
2013-06-26 23:58 ` Jeffrey Carter
@ 2013-06-27 7:36 ` Georg Bauhaus
2013-06-27 7:49 ` Dmitry A. Kazakov
` (2 subsequent siblings)
5 siblings, 0 replies; 19+ messages in thread
From: Georg Bauhaus @ 2013-06-27 7:36 UTC (permalink / raw)
On 27.06.13 01:01, Thomas Schmidt wrote:
> Hi,
>
> I'm new to Ada. I'm trying to write some kind of neural net software. Therefore I've written a small library to implement the neural graph. All nodes are collected in a Hashed_Set. Neurons are specialized Nodes of the graph. To lookup a given Neuron/Node I need the following subprogram "findNode".
>
> Now what I don't understand: Why does "findNode1" work well while "findNode2" raises PROGRAM_ERROR at the line indicated below?
> position : constant NodeSets.Cursor :=
> graph.nodes.Find (Node (aNode.all)'Access); -- <<< Works well
> position : constant NodeSets.Cursor :=
> graph.nodes.Find (aNode.all'Access); -- <<< Raises PROGRAM_ERROR with "accessibility check failed"
The only written difference I see is that the type
of the object whose 'Access is taken in findNode1 is
Node, whereas the type of aNode.all in findNode2
is not necessarily Node. Node is the type used as target
type of what is in the container. If aNode is a pointer
to type that is not declared at the same level as type
Node, then this former type may no longer be
accessible. Therefore, anything specific to the type
is assumed to be gone, including any specific 'Address
operation.
(E.g., Node may be declared at library level, and
Some_Other_Node declared inside some procedure, or
in some generic instance not at library level.)
Some ways of identifying a node can be less troublesome
than using its address. Any identity less accidental
than addresses facilitates persistent identities.
Have you looked at the indefinite containers?
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: "accessibility check failed" on Node
2013-06-26 23:01 "accessibility check failed" on Node Thomas Schmidt
` (2 preceding siblings ...)
2013-06-27 7:36 ` Georg Bauhaus
@ 2013-06-27 7:49 ` Dmitry A. Kazakov
2013-06-27 8:24 ` Simon Wright
2013-06-27 10:46 ` Stephen Leake
5 siblings, 0 replies; 19+ messages in thread
From: Dmitry A. Kazakov @ 2013-06-27 7:49 UTC (permalink / raw)
On Thu, 27 Jun 2013 01:01:19 +0200, Thomas Schmidt wrote:
> I'm new to Ada. I'm trying to write some kind of neural net software.
> Therefore I've written a small library to implement the neural graph.
> All nodes are collected in a Hashed_Set. Neurons are specialized Nodes
> of the graph.
I don't think that is a good approach. I have a comparable project which
deployed fuzzy decision trees. DT's are not really trees but rather
directed graphs. The properties of such graphs are much alike to ones of
NN's. E.g. layers, waterfall navigation upon classification etc.
Building a hash function for nodes of such a graph is a problem. Especially
if you want to factor out repeating subgraphs, which I did because I had a
huge number of nodes. If the hash function takes into account the edges and
weights, and it should, any modification of the graph will kill it.
As others have pointed out, do not use anonymous access types.
On top of that. You should carefully design the strategy of memory
collection. It will have a great impact on how easy or difficult would be
to implement graph management operations, especially in a concurrent
environment when many tasks access the graph, e.g. one does training,
another pulls the MVC's model of the GUI, third does storing it into the
persistent storage.
For my project I used reference counting with weak and strong references
and cloning shared nodes upon update.
P.S. I am afraid one cannot do it in a simple way without much upfront
design, and then gradually evolve it to deal with complicated issues like
above.
--
Regards,
Dmitry A. Kazakov
http://www.dmitry-kazakov.de
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: "accessibility check failed" on Node
2013-06-26 23:01 "accessibility check failed" on Node Thomas Schmidt
` (3 preceding siblings ...)
2013-06-27 7:49 ` Dmitry A. Kazakov
@ 2013-06-27 8:24 ` Simon Wright
2013-06-27 11:19 ` Thomas Schmidt
2013-06-27 10:46 ` Stephen Leake
5 siblings, 1 reply; 19+ messages in thread
From: Simon Wright @ 2013-06-27 8:24 UTC (permalink / raw)
Thomas Schmidt <TC.Schmidt@gmx.net> writes:
> function findNode2
> (graph : DirectedGraph;
> aNode : access Node'Class)
> return Node_Class_Access is
I spent quite some time making a compilable example. It would have been
kind of you to have done the same!
The call in
position : constant NodeSets.Cursor :=
graph.nodes.Find (aNode.all'Access);
seemed a bit magical (a respected colleague said that he found himself
using ".all.Access" as a band-aid for shutting up the compiler's
complaints about type mismatches without bothering to understand
them). So I tried
N : constant Node_Class_Access := Node_Class_Access (aNode);
position : constant NodeSets.Cursor := graph.nodes.Find (N);
which moved the "accessibility check failed" to the "N :=" line.
I made a findNode3 with the type of aNode changed to Node_Class_Access:
function findNode3
(graph : DirectedGraph;
aNode : Node_Class_Access)
return Node_Class_Access is
position : constant NodeSets.Cursor := graph.nodes.Find (aNode);
begin
if position /= NodeSets.No_Element then
return Nodesets.Element (position);
else
raise No_Element with "failed in Findnode3";
end if;
end findNode3;
Calling findNode3 with an aliased local Neuron now requires me to use
'Unchecked_Access, or I get the compilation error "non-local pointer
cannot point to local object".
As to your original question, why "Node (aNode.all)'Access" should be OK
while "aNode.all'Access" isn't .. I expect the answer is something deep,
and I'd go along with Jeff Carter about avoiding the use of anonymous
access types.
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: "accessibility check failed" on Node
2013-06-27 8:24 ` Simon Wright
@ 2013-06-27 11:19 ` Thomas Schmidt
2013-06-27 12:49 ` Frédéric Praca
` (3 more replies)
0 siblings, 4 replies; 19+ messages in thread
From: Thomas Schmidt @ 2013-06-27 11:19 UTC (permalink / raw)
Hi all,
thank you for your tips
On 2013-06-27 08:24:52 +0000, Simon Wright said:
> spent quite some time making a compilable example. It would have been
> kind of you to have done the same!
Sorry, next time I'll offer a complete compilable example.
> The call in
>
> position : constant NodeSets.Cursor :=
> graph.nodes.Find (aNode.all'Access);
>
> seemed a bit magical (a respected colleague said that he found himself
> using ".all.Access" as a band-aid for shutting up the compiler's
> complaints about type mismatches without bothering to understand
> them).
Exactly my way: "without bothering to understand them". But it solved
my problem.
But thank you to your hints. I'll try
- to avoid anonymous types,
- unnecessary access types,
- declare access parameters to exclude null (if usefull).
- (I'm not really a friend of those Ada naming conventions using
undersore between name components).
- I'm looking for some tutorial describing the most important
differences between C++ and Ada.
I like Ada being a really type safe and straight forward language
offering a lot aspects (like the task concept, …) I'm missing in C/C++.
But as coming from C/C++ its sometimes difficult to really understand
Adas concepts. So I had to learn that Adas in-parameter mode doesn't
match C++s call by value. That's one way to avoid access parameter, I
think. I'm not really familiar with Adas accessibility levels. And last
but not least I'm currently on the way to understand the differences
between extensible tagged types and class-wide types.
Some of you mentioned that I could use some publically accesible
libraries to build up my neural network. That's ok, I'm not really a
friend of reinventing the wheel. But my goals are not only those neural
networks but also the Ada language. Otherwise I would use C++ (which is
really a mess but I'm familiar with it) or use some publically
available NN simulators. I think the best way to learn is in using
"real" jobs than examples simplifying the world. It would be a great
deal to write my own neural net simulator in Ada!
Thanks
Thomas
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: "accessibility check failed" on Node
2013-06-27 11:19 ` Thomas Schmidt
@ 2013-06-27 12:49 ` Frédéric Praca
2013-06-27 14:36 ` Eryndlia Mavourneen
` (2 subsequent siblings)
3 siblings, 0 replies; 19+ messages in thread
From: Frédéric Praca @ 2013-06-27 12:49 UTC (permalink / raw)
On Thu, 27 Jun 2013 13:19:18 +0200, Thomas Schmidt wrote:
> Hi all,
>
> [snipped]
>
> - I'm looking for some tutorial describing the most important
> differences between C++ and Ada.
Hello Thomas,
first, Welcome ;)
I would recommend you to read this
http://www.cs.uni.edu/~mccormic/4740/guide-c2ada.pdf
it is quite old but still accurate for a "beginner" to understand why Ada
is different from C/C++.
Regards
Fred
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: "accessibility check failed" on Node
2013-06-27 11:19 ` Thomas Schmidt
2013-06-27 12:49 ` Frédéric Praca
@ 2013-06-27 14:36 ` Eryndlia Mavourneen
2013-06-27 17:31 ` Jeffrey Carter
2013-06-27 14:51 ` Shark8
2013-06-27 17:29 ` Jeffrey Carter
3 siblings, 1 reply; 19+ messages in thread
From: Eryndlia Mavourneen @ 2013-06-27 14:36 UTC (permalink / raw)
On Thursday, June 27, 2013 6:19:18 AM UTC-5, Thomas Schmidt wrote:
> Hi all,
> . . .
> I think the best way to learn is in using
> "real" jobs than examples simplifying the world. It would be a great
> deal to write my own neural net simulator in Ada!
>
> Thanks
> Thomas
Agreed! This is how I learned Ada back in the early '80s after having read the LRM (that funny, green paperback with nothing printed on the spine). I wrote an application in VAX Ada (became DEC Ada later) which had to access kernel-memory lists and be multi-tasking. I wrote it 3 different ways in order to learn different aspects of Ada. I was pleased with the 3rd way and sold it.
-- Eryndlia Mavourneen
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: "accessibility check failed" on Node
2013-06-27 14:36 ` Eryndlia Mavourneen
@ 2013-06-27 17:31 ` Jeffrey Carter
2013-06-27 17:45 ` Simon Wright
2013-06-27 18:33 ` Eryndlia Mavourneen
0 siblings, 2 replies; 19+ messages in thread
From: Jeffrey Carter @ 2013-06-27 17:31 UTC (permalink / raw)
On 06/27/2013 07:36 AM, Eryndlia Mavourneen wrote:
>
> This is how I learned Ada back in the early '80s after having read the LRM (that funny, green paperback with nothing printed on the spine).
Funny, my copy of the ARM-83 has "REFERENCE MANUAL FOR THE ADA PROGRAMMING
LANGUAGE" on the spine.
--
Jeff Carter
"I didn't squawk about the steak, dear. I
merely said I didn't see that old horse
that used to be tethered outside here."
Never Give a Sucker an Even Break
103
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: "accessibility check failed" on Node
2013-06-27 17:31 ` Jeffrey Carter
@ 2013-06-27 17:45 ` Simon Wright
2013-06-27 23:26 ` Randy Brukardt
2013-06-27 18:33 ` Eryndlia Mavourneen
1 sibling, 1 reply; 19+ messages in thread
From: Simon Wright @ 2013-06-27 17:45 UTC (permalink / raw)
Jeffrey Carter <spam.jrcarter.not@spam.not.acm.org> writes:
> On 06/27/2013 07:36 AM, Eryndlia Mavourneen wrote:
>>
>> This is how I learned Ada back in the early '80s after having read
>> the LRM (that funny, green paperback with nothing printed on the
>> spine).
>
> Funny, my copy of the ARM-83 has "REFERENCE MANUAL FOR THE ADA
> PROGRAMMING LANGUAGE" on the spine.
So does mine (blue, fake 7-segment LED lettering in white). I think it
came with the Telesoft compiler.
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: "accessibility check failed" on Node
2013-06-27 17:45 ` Simon Wright
@ 2013-06-27 23:26 ` Randy Brukardt
2013-06-28 0:52 ` Jeffrey Carter
0 siblings, 1 reply; 19+ messages in thread
From: Randy Brukardt @ 2013-06-27 23:26 UTC (permalink / raw)
"Simon Wright" <simon@pushface.org> wrote in message
news:ly4ncjla6i.fsf@pushface.org...
> Jeffrey Carter <spam.jrcarter.not@spam.not.acm.org> writes:
>
>> On 06/27/2013 07:36 AM, Eryndlia Mavourneen wrote:
>>>
>>> This is how I learned Ada back in the early '80s after having read
>>> the LRM (that funny, green paperback with nothing printed on the
>>> spine).
>>
>> Funny, my copy of the ARM-83 has "REFERENCE MANUAL FOR THE ADA
>> PROGRAMMING LANGUAGE" on the spine.
>
> So does mine (blue, fake 7-segment LED lettering in white). I think it
> came with the Telesoft compiler.
Ours came from the government printing office (I think), and have nothing on
a spine except a hand-written "Ada Reference Manual 1983" in red marker. I
suspect that I added those relatively recently to keep them straight from
the similar "Ada Reference Manual 1980" which is next to it on the library
shelf.
There were other versions that I remember seeing, but I think most people
had the "government" version.
Randy.
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: "accessibility check failed" on Node
2013-06-27 23:26 ` Randy Brukardt
@ 2013-06-28 0:52 ` Jeffrey Carter
0 siblings, 0 replies; 19+ messages in thread
From: Jeffrey Carter @ 2013-06-28 0:52 UTC (permalink / raw)
On 06/27/2013 04:26 PM, Randy Brukardt wrote:
> "Simon Wright" <simon@pushface.org> wrote in message
> news:ly4ncjla6i.fsf@pushface.org...
>> Jeffrey Carter <spam.jrcarter.not@spam.not.acm.org> writes:
>>>
>>> Funny, my copy of the ARM-83 has "REFERENCE MANUAL FOR THE ADA
>>>
>>
>> So does mine (blue, fake 7-segment LED lettering in white). I think it
>> came with the Telesoft compiler.
>
> Ours came from the government printing office (I think), and have nothing on
> a spine except a hand-written "Ada Reference Manual 1983" in red marker. I
> suspect that I added those relatively recently to keep them straight from
> the similar "Ada Reference Manual 1980" which is next to it on the library
> shelf.
Now that I look at it more closely, it actually has "REFERENCE MANUAL FOR THE
Ada® PROGRAMMING LANGUAGE" on the spine. Inside it says "For sale by the
Superintendent of Documents, U.S. Government Printing Office, Washington, D.C.
20402". I probably got it in 1984, from Martin Marietta.
--
Jeff Carter
"I didn't squawk about the steak, dear. I
merely said I didn't see that old horse
that used to be tethered outside here."
Never Give a Sucker an Even Break
103
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: "accessibility check failed" on Node
2013-06-27 17:31 ` Jeffrey Carter
2013-06-27 17:45 ` Simon Wright
@ 2013-06-27 18:33 ` Eryndlia Mavourneen
2013-06-27 20:31 ` Jeffrey Carter
1 sibling, 1 reply; 19+ messages in thread
From: Eryndlia Mavourneen @ 2013-06-27 18:33 UTC (permalink / raw)
On Thursday, June 27, 2013 12:31:42 PM UTC-5, Jeffrey Carter wrote:
> On 06/27/2013 07:36 AM, Eryndlia Mavourneen wrote:
>
> > This is how I learned Ada back in the early '80s after having read the LRM (that funny, green paperback with nothing printed on the spine).
>
> Funny, my copy of the ARM-83 has "REFERENCE MANUAL FOR THE ADA PROGRAMMING
> LANGUAGE" on the spine.
That is funny. The copy I bought was from a government bookstore in the Federal Reserve Bank of Boston building, and I believe this was circa 1981-82, as I was there on business for a particular company. Perhaps they got their act together on this at a later date.
-- Eryndlia Mavourneen
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: "accessibility check failed" on Node
2013-06-27 18:33 ` Eryndlia Mavourneen
@ 2013-06-27 20:31 ` Jeffrey Carter
2013-06-27 23:29 ` Randy Brukardt
0 siblings, 1 reply; 19+ messages in thread
From: Jeffrey Carter @ 2013-06-27 20:31 UTC (permalink / raw)
On 06/27/2013 11:33 AM, Eryndlia Mavourneen wrote:
>
> That is funny. The copy I bought was from a government bookstore in the
> Federal Reserve Bank of Boston building, and I believe this was circa
> 1981-82, as I was there on business for a particular company. Perhaps they
> got their act together on this at a later date.
That would be ARM-80, a different animal altogether from my ARM-83.
--
Jeff Carter
"I didn't squawk about the steak, dear. I
merely said I didn't see that old horse
that used to be tethered outside here."
Never Give a Sucker an Even Break
103
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: "accessibility check failed" on Node
2013-06-27 20:31 ` Jeffrey Carter
@ 2013-06-27 23:29 ` Randy Brukardt
0 siblings, 0 replies; 19+ messages in thread
From: Randy Brukardt @ 2013-06-27 23:29 UTC (permalink / raw)
"Jeffrey Carter" <spam.jrcarter.not@spam.not.acm.org> wrote in message
news:kqi760$3vu$1@dont-email.me...
> On 06/27/2013 11:33 AM, Eryndlia Mavourneen wrote:
>>
>> That is funny. The copy I bought was from a government bookstore in the
>> Federal Reserve Bank of Boston building, and I believe this was circa
>> 1981-82, as I was there on business for a particular company. Perhaps
>> they
>> got their act together on this at a later date.
>
> That would be ARM-80, a different animal altogether from my ARM-83.
The 1980 version also has a green wrapper (a slightly deeper green today,
although I think its the 1983 versions that have faded more). Neither the
1980 nor the 1983 versions have anything on the spine other than the text I
hand-wrote at some point (relatively recently, I think, as I recall having
trouble finding the right document when answering some Adam B. question, and
I then decided to label them. I think the red marker is one that RRS gave
away at tradeshows in the late 1990s, so it couldn't have been labeled until
then).
Randy.
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: "accessibility check failed" on Node
2013-06-27 11:19 ` Thomas Schmidt
2013-06-27 12:49 ` Frédéric Praca
2013-06-27 14:36 ` Eryndlia Mavourneen
@ 2013-06-27 14:51 ` Shark8
2013-06-27 17:29 ` Jeffrey Carter
3 siblings, 0 replies; 19+ messages in thread
From: Shark8 @ 2013-06-27 14:51 UTC (permalink / raw)
On Thursday, June 27, 2013 5:19:18 AM UTC-6, Thomas Schmidt wrote:
> - I'm looking for some tutorial describing the most important
> differences between C++ and Ada.
For a high-level/managerial comparison there's this study:
http://archive.adaic.com/intro/ada-vs-c/cada_art.pdf
For a more general-feature/approach comparison:
http://archive.adaic.com/intro/ada-vs-c/ada-vs-c.html
Then there's the tail-end of a tutorial I wrote (just skip the rest) for some of the basics:
http://blog.projectpolymath.org/ada-2012-tutorial_01/
There's some other comparisons here (though I don't know how recent/relevant they are to your particular need):
http://archive.adaic.com/intro/c.html
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: "accessibility check failed" on Node
2013-06-27 11:19 ` Thomas Schmidt
` (2 preceding siblings ...)
2013-06-27 14:51 ` Shark8
@ 2013-06-27 17:29 ` Jeffrey Carter
3 siblings, 0 replies; 19+ messages in thread
From: Jeffrey Carter @ 2013-06-27 17:29 UTC (permalink / raw)
On 06/27/2013 04:19 AM, Thomas Schmidt wrote:
>
> - I'm looking for some tutorial describing the most important differences
> between C++ and Ada.
An excellent tutorial for experienced programmers is Riehle's "Ada Distilled":
http://www.adaic.org/wp-content/uploads/2010/05/Ada-Distilled-24-January-2011-Ada-2005-Version.pdf
--
Jeff Carter
"I didn't squawk about the steak, dear. I
merely said I didn't see that old horse
that used to be tethered outside here."
Never Give a Sucker an Even Break
103
^ permalink raw reply [flat|nested] 19+ messages in thread
* Re: "accessibility check failed" on Node
2013-06-26 23:01 "accessibility check failed" on Node Thomas Schmidt
` (4 preceding siblings ...)
2013-06-27 8:24 ` Simon Wright
@ 2013-06-27 10:46 ` Stephen Leake
5 siblings, 0 replies; 19+ messages in thread
From: Stephen Leake @ 2013-06-27 10:46 UTC (permalink / raw)
Thomas Schmidt <TC.Schmidt@gmx.net> writes:
> I'm new to Ada.
Welcome!
> Now what I don't understand: Why does "findNode1" work well while
> "findNode2" raises PROGRAM_ERROR at the line indicated below?
Accessibility refers to where an object is declared, relative to where
its type is declared.
> Given the following declarations:
It's better if you post a complete compilable example, so we can compile
it, and maybe fix the bug.
> function findNode2
> (graph : DirectedGraph;
> aNode : access Node'Class)
> return Node_Class_Access is
>
> position : constant NodeSets.Cursor :=
> graph.nodes.Find (aNode.all'Access); -- <<< Raises
> PROGRAM_ERROR with "accessibility check failed"
First, a style note: since aNode is already an access, aNode.all'Access
is just aNode. Is there some reason you wrote it this way?
The accessiblity check applies to the object that aNode designates. If
the type Node is declared at library level, but the object is at some
lower level in a subprogram, then when that subprogram returns, the
object will disappear, and the access value will become invalid. Ada
forbids this.
If you post a complete example, we can give more precise help.
--
-- Stephe
^ permalink raw reply [flat|nested] 19+ messages in thread