 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
John Torjo Guest
|
Posted: Tue Sep 07, 2004 2:38 pm Post subject: tempate new syntax [was: Re: Evolution of C++ : Thinking ahe |
|
|
Following this thread, I completely agree with Andrei.
I guess parsing would be quite faster, language become cleaner, if we
used a new syntax.
Since we're all used to <>, how about using </ and />
(or, somebody else suggested <| and |> - although I think </ and />
are much faster to type)
I think it's not possible to have </ and /> in the current language,
so this wouldn't break anything.
Using it in code seems quite cute (to me):
template</class value_type/> struct test {
...
};
test</int/> t;
| Quote: |
Thinking ahead of what's to come - it would be great if a new notation for
templates were introduced by the next C++ standard, and the old one would be
deprecated (along with its camarilla of syntactic fixes for the problems
that it caused).
A nice compiler feature would be to issue warning for the old syntax or not,
depending on the creation date of the files being compiled. So if there's
legacy code, no warning. New code will have warnings if using the old
syntax.
I'll venture to note that there is no experimental data (such as user
studies) backing up the conjecture made by D&E, while there's quite some
hard evidence backing up Pennello's statement ).
Andrei
|
Going futher, I guess we could even have automation tools to convert
old code to this syntax.
Best,
John
John Torjo
Freelancer
-- [email]john (AT) torjo (DOT) com[/email]
Contributing editor, C/C++ Users Journal
-- "Win32 GUI Generics" -- generics & GUI do mix, after all
-- http://www.torjo.com/win32gui/
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]
[ comp.std.c++ is moderated. To submit articles, try just posting with ]
[ your news-reader. If that fails, use mailto:std-c++@ncar.ucar.edu ]
[ --- Please see the FAQ before posting. --- ]
[ FAQ: http://www.jamesd.demon.co.uk/csc/faq.html ]
|
|
| Back to top |
|
 |
Steve Clamage Guest
|
Posted: Tue Sep 07, 2004 10:42 pm Post subject: Re: tempate new syntax [was: Re: Evolution of C++ : Thinking |
|
|
I had not followed the previous thread, so please forgive me if the
following discussion is not new.
At the November 1992 meeting of the C++ Committee, some syntax
ambiguities of the <...> notation for template parameters and
arguments were discussed, and some alternatives were presented.
If I remember correctly, two suggestions that introduced no
ambiguities were {...} and two new digraphs <|...|> (similar to your
suggested </.../>). Tom Pennello, sitting in the back of the room, had
a table-driven C++ parser on his laptop computer, and tested the
suitability of suggested syntax modifications in real time. The {...}
notation was considerd visually confusing, but the <|...|> notation
had some support.
At that time, explicit template arguments on function calls, such as
foo<A,B>(), were not in the language. The arguments that won the day
against any change were that the ambiguities were minor, and that "too
many books and articles and too much code" already existed.
Today we have more serious problems with template syntax than we did
in 1992. I think that if explicit template arguments on function calls
had been part of C++ in 1992, we would have changed the notation then.
---
Steve Clamage, [email]stephen.clamage (AT) sun (DOT) com[/email]
John Torjo wrote:
| Quote: | Following this thread, I completely agree with Andrei.
I guess parsing would be quite faster, language become cleaner, if we
used a new syntax.
Since we're all used to <>, how about using </ and /
(or, somebody else suggested <| and |> - although I think </ and /
are much faster to type)
I think it's not possible to have and /> in the current language,
so this wouldn't break anything.
Using it in code seems quite cute (to me):
template</class value_type/> struct test {
...
};
test</int/> t;
Thinking ahead of what's to come - it would be great if a new notation for
templates were introduced by the next C++ standard, and the old one would be
deprecated (along with its camarilla of syntactic fixes for the problems
that it caused).
A nice compiler feature would be to issue warning for the old syntax or not,
depending on the creation date of the files being compiled. So if there's
legacy code, no warning. New code will have warnings if using the old
syntax.
I'll venture to note that there is no experimental data (such as user
studies) backing up the conjecture made by D&E, while there's quite some
hard evidence backing up Pennello's statement ).
Andrei
Going futher, I guess we could even have automation tools to convert
old code to this syntax.
Best,
John
John Torjo
Freelancer
-- [email]john (AT) torjo (DOT) com[/email]
Contributing editor, C/C++ Users Journal
-- "Win32 GUI Generics" -- generics & GUI do mix, after all
-- http://www.torjo.com/win32gui/
|
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]
[ comp.std.c++ is moderated. To submit articles, try just posting with ]
[ your news-reader. If that fails, use mailto:std-c++@ncar.ucar.edu ]
[ --- Please see the FAQ before posting. --- ]
[ FAQ: http://www.jamesd.demon.co.uk/csc/faq.html ]
|
|
| Back to top |
|
 |
Eric Backus Guest
|
Posted: Tue Sep 07, 2004 11:23 pm Post subject: Re: tempate new syntax [was: Re: Evolution of C++ : Thinking |
|
|
"John Torjo" <jtorjo (AT) yahoo (DOT) com> wrote
| Quote: | Since we're all used to <>, how about using </ and /
(or, somebody else suggested <| and |> - although I think </ and /
are much faster to type)
I think it's not possible to have and /> in the current language,
so this wouldn't break anything.
|
How about an explicit specialization:
template</*intentionally_empty*/> int my_max<int>(int x1, int x2) {
return (x1 > x2) ? x1 : x2; }
Or, possibly some case of template deduction?:
x = func</*intentionally_empty*/>(arg1, arg2);
--
Eric Backus
R&D Design Engineer
Agilent Technologies, Inc.
425-356-6010 Tel
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]
[ comp.std.c++ is moderated. To submit articles, try just posting with ]
[ your news-reader. If that fails, use mailto:std-c++@ncar.ucar.edu ]
[ --- Please see the FAQ before posting. --- ]
[ FAQ: http://www.jamesd.demon.co.uk/csc/faq.html ]
|
|
| Back to top |
|
 |
John Torjo Guest
|
Posted: Thu Sep 09, 2004 4:40 pm Post subject: Re: tempate new syntax [was: Re: Evolution of C++ : Thinking |
|
|
Steve Clamage <Stephen.Clamage (AT) Sun (DOT) COM> wrote
| Quote: | I had not followed the previous thread, so please forgive me if the
following discussion is not new.
At the November 1992 meeting of the C++ Committee, some syntax
ambiguities of the <...> notation for template parameters and
arguments were discussed, and some alternatives were presented.
If I remember correctly, two suggestions that introduced no
ambiguities were {...} and two new digraphs <|...|> (similar to your
suggested </.../>). Tom Pennello, sitting in the back of the room, had
|
His name came up on the other discussion ;)
| Quote: | a table-driven C++ parser on his laptop computer, and tested the
suitability of suggested syntax modifications in real time. The {...}
notation was considerd visually confusing, but the <|...|> notation
had some support.
At that time, explicit template arguments on function calls, such as
foo<A,B>(), were not in the language. The arguments that won the day
against any change were that the ambiguities were minor, and that "too
many books and articles and too much code" already existed.
Today we have more serious problems with template syntax than we did
in 1992. I think that if explicit template arguments on function calls
had been part of C++ in 1992, we would have changed the notation then.
|
That's why I (and probably Andrei) think it's quite imperative to
change this.
We could still allow for the old syntax (with a warning), create some
automation tools (for updating files from old to new syntax) and allow
for a newer/cleaner/easier to parse solution.
(as a side-note, I think the best people to build those automation
tools would be the compiler writers )
Best,
John
John Torjo
Contributing editor, C/C++ Users Journal
-- "Win32 GUI Generics" -- generics & GUI do mix, after all
-- http://www.torjo.com/win32gui/
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]
[ comp.std.c++ is moderated. To submit articles, try just posting with ]
[ your news-reader. If that fails, use mailto:std-c++@ncar.ucar.edu ]
[ --- Please see the FAQ before posting. --- ]
[ FAQ: http://www.jamesd.demon.co.uk/csc/faq.html ]
|
|
| Back to top |
|
 |
kanze@gabi-soft.fr Guest
|
Posted: Thu Sep 09, 2004 4:40 pm Post subject: Re: tempate new syntax [was: Re: Evolution of C++ : Thinking |
|
|
[email]jtorjo (AT) yahoo (DOT) com[/email] (John Torjo) wrote in message
news:<c638aac5.0409062202.5ef631b2 (AT) posting (DOT) google.com>...
| Quote: | Following this thread, I completely agree with Andrei. I guess
parsing would be quite faster, language become cleaner, if we used a
new syntax.
Since we're all used to <>, how about using </ and /
(or, somebody else suggested <| and |> - although I think </ and /
are much faster to type)
I think it's not possible to have and /> in the current language,
so this wouldn't break anything.
|
bool b = a / Compare a and b
b ;
That's a perfectly legal statement today.
--
James Kanze GABI Software http://www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]
[ comp.std.c++ is moderated. To submit articles, try just posting with ]
[ your news-reader. If that fails, use mailto:std-c++@ncar.ucar.edu ]
[ --- Please see the FAQ before posting. --- ]
[ FAQ: http://www.jamesd.demon.co.uk/csc/faq.html ]
|
|
| Back to top |
|
 |
bone bag Guest
|
Posted: Thu Sep 09, 2004 4:40 pm Post subject: Re: tempate new syntax [was: Re: Evolution of C++ : Thinking |
|
|
[email]jtorjo (AT) yahoo (DOT) com[/email] (John Torjo) wrote in message news:<c638aac5.0409062202.5ef631b2 (AT) posting (DOT) google.com>...
| Quote: | Following this thread, I completely agree with Andrei.
I guess parsing would be quite faster, language become cleaner, if we
used a new syntax.
Since we're all used to <>, how about using </ and /
(or, somebody else suggested <| and |> - although I think </ and /
are much faster to type)
[snip] |
Not on my German keyboard! In fact, the symbols <,>,| are all on one
key, making <| and |> seem most natural.
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]
[ comp.std.c++ is moderated. To submit articles, try just posting with ]
[ your news-reader. If that fails, use mailto:std-c++@ncar.ucar.edu ]
[ --- Please see the FAQ before posting. --- ]
[ FAQ: http://www.jamesd.demon.co.uk/csc/faq.html ]
|
|
| Back to top |
|
 |
John Torjo Guest
|
Posted: Fri Sep 10, 2004 3:12 pm Post subject: Re: tempate new syntax [was: Re: Evolution of C++ : Thinking |
|
|
Eric Backus <eric_backus (AT) alum (DOT) mit.edu> wrote
| Quote: | "John Torjo" <jtorjo (AT) yahoo (DOT) com> wrote in message
news:c638aac5.0409062202.5ef631b2 (AT) posting (DOT) google.com...
Since we're all used to <>, how about using </ and /
(or, somebody else suggested <| and |> - although I think </ and /
are much faster to type)
I think it's not possible to have and /> in the current language,
so this wouldn't break anything.
How about an explicit specialization:
template</*intentionally_empty*/> int my_max<int>(int x1, int x2) {
return (x1 > x2) ? x1 : x2; }
Or, possibly some case of template deduction?:
x = func</*intentionally_empty*/>(arg1, arg2);
|
Man, you got me here.
Although probably noone wrote such a thing, you're right.
Of course, the compiler can be smart and see if it encounters </* or
*/> and treat /* as comments.
Or, we can use <| and |>
Now, find a broken construct using <| |> !
(although, again, I'm pretty against this, since | is very complicated
to type - for me)
Best,
John
John Torjo
Contributing editor, C/C++ Users Journal
-- "Win32 GUI Generics" -- generics & GUI do mix, after all
-- http://www.torjo.com/win32gui/
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]
[ comp.std.c++ is moderated. To submit articles, try just posting with ]
[ your news-reader. If that fails, use mailto:std-c++@ncar.ucar.edu ]
[ --- Please see the FAQ before posting. --- ]
[ FAQ: http://www.jamesd.demon.co.uk/csc/faq.html ]
|
|
| Back to top |
|
 |
Thorsten Ottosen Guest
|
Posted: Fri Sep 10, 2004 3:12 pm Post subject: Re: tempate new syntax [was: Re: Evolution of C++ : Thinking |
|
|
"John Torjo" <jtorjo (AT) yahoo (DOT) com> wrote
| Quote: |
Steve Clamage <Stephen.Clamage (AT) Sun (DOT) COM> wrote
|
| Quote: | Today we have more serious problems with template syntax than we did
in 1992. I think that if explicit template arguments on function calls
had been part of C++ in 1992, we would have changed the notation then.
That's why I (and probably Andrei) think it's quite imperative to
change this.
We could still allow for the old syntax (with a warning), create some
automation tools (for updating files from old to new syntax) and allow
for a newer/cleaner/easier to parse solution.
|
If the only reason is faster parsing speed, then I don't see why one should
change anything. Time
is working to our advantage...the next time I buy a lap-top it will be 4 times
as fast; even for many years
good compilers with pre-compiled headers have been quite fast at compiling
stuff.
br
Thorsten
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]
[ comp.std.c++ is moderated. To submit articles, try just posting with ]
[ your news-reader. If that fails, use mailto:std-c++@ncar.ucar.edu ]
[ --- Please see the FAQ before posting. --- ]
[ FAQ: http://www.jamesd.demon.co.uk/csc/faq.html ]
|
|
| Back to top |
|
 |
Andrei Alexandrescu (See Guest
|
Posted: Fri Sep 10, 2004 3:13 pm Post subject: Re: tempate new syntax [was: Re: Evolution of C++ : Thinking |
|
|
"John Torjo" <jtorjo (AT) yahoo (DOT) com> wrote
| Quote: | That's why I (and probably Andrei) think it's quite imperative to
change this.
|
Indeed, I second that.
| Quote: | We could still allow for the old syntax (with a warning), create some
automation tools (for updating files from old to new syntax) and allow
for a newer/cleaner/easier to parse solution.
(as a side-note, I think the best people to build those automation
tools would be the compiler writers )
|
C++ is a wonderful language, and it has made some pioneering breakthroughs
in areas where other languages either didn't try, didn't succeed, or
succeeded but nobody cared ). In doing so, it inevitably accumulated some
scars.
I now believe it is very important now for C++ to provide a coherent means
to close those wounds.
Andrei
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]
[ comp.std.c++ is moderated. To submit articles, try just posting with ]
[ your news-reader. If that fails, use mailto:std-c++@ncar.ucar.edu ]
[ --- Please see the FAQ before posting. --- ]
[ FAQ: http://www.jamesd.demon.co.uk/csc/faq.html ]
|
|
| Back to top |
|
 |
kanze@gabi-soft.fr Guest
|
Posted: Sat Sep 11, 2004 3:06 pm Post subject: Re: tempate new syntax [was: Re: Evolution of C++ : Thinking |
|
|
[email]paul_evans7 (AT) hotmail (DOT) com[/email] (bone bag) wrote in message
news:<4374f570.0409080443.6cd7f12a (AT) posting (DOT) google.com>...
| Quote: | jtorjo (AT) yahoo (DOT) com (John Torjo) wrote in message
news:<c638aac5.0409062202.5ef631b2 (AT) posting (DOT) google.com>...
Following this thread, I completely agree with Andrei. I guess
parsing would be quite faster, language become cleaner, if we used a
new syntax.
Since we're all used to <>, how about using </ and /> (or, somebody
else suggested <| and |> - although I think </ and /> are much
faster to type)
[snip]
Not on my German keyboard! In fact, the symbols <,>,| are all on one
key, making <| and |> seem most natural.
|
On your German keyboard. The position of | on German keyboards is not
standardized -- according to DIN, German keyboards don't even have a |.
(In practice, it would be a silly keyboard driver which put it anywhere
else but where the Windows keyboard driver puts it. Which is on the
same key as < and >.)
But I consider this a disadvantage -- I find it far easier to type
successive characters if they are on different keys. Or rather, if I
don't have to play with shift, control or alt in the middle of the
sequence. I find the placement of < and > on the same key (differing
only by the shift) a pain on German and French keyboards. Of course,
the fact that you need to use alt to get some pretty common characters
in C++ (like { and }) means that I avoid such keyboards for entering C++
anyway:-). (On a French keyboard, you have to shift to get numbers,
which makes it more or less awkward for many technical jobs.)
--
James Kanze GABI Software http://www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]
[ comp.std.c++ is moderated. To submit articles, try just posting with ]
[ your news-reader. If that fails, use mailto:std-c++@ncar.ucar.edu ]
[ --- Please see the FAQ before posting. --- ]
[ FAQ: http://www.jamesd.demon.co.uk/csc/faq.html ]
|
|
| Back to top |
|
 |
Andrei Alexandrescu (See Guest
|
Posted: Sat Sep 11, 2004 3:06 pm Post subject: Re: tempate new syntax [was: Re: Evolution of C++ : Thinking |
|
|
"John Torjo" <jtorjo (AT) yahoo (DOT) com> wrote
| Quote: | Or, we can use <| and |
Now, find a broken construct using <| |> !
(although, again, I'm pretty against this, since | is very complicated
to type - for me)
|
There's no problem with <| and |>. I use them for generics in a little
language for hardware specification, and people like them a lot.
On an unrelated vein, I use "!" for passing-in default arguments to
function, and people say it looks great:
void Foo(int = 0, string = "wyda", double = 0);
can be called:
Foo(2, !, 1); // calls Foo(2, "wyda", 1);
Andrei
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]
[ comp.std.c++ is moderated. To submit articles, try just posting with ]
[ your news-reader. If that fails, use mailto:std-c++@ncar.ucar.edu ]
[ --- Please see the FAQ before posting. --- ]
[ FAQ: http://www.jamesd.demon.co.uk/csc/faq.html ]
|
|
| Back to top |
|
 |
Steven T. Hatton Guest
|
Posted: Sun Sep 12, 2004 3:16 pm Post subject: Re: tempate new syntax [was: Re: Evolution of C++ : Thinking |
|
|
Thorsten Ottosen wrote:
| Quote: | If the only reason is faster parsing speed, then I don't see why one
should change anything. Time
is working to our advantage...the next time I buy a lap-top it will be 4
times as fast; even for many years
good compilers with pre-compiled headers have been quite fast at
compiling stuff.
|
What about parsing/compiling portable code on the fly in situations where
you want virtually immediate results? I don't believe that is beyond the
realm of foreseeable requirements.
--
Regards,
Steven
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]
[ comp.std.c++ is moderated. To submit articles, try just posting with ]
[ your news-reader. If that fails, use mailto:std-c++@ncar.ucar.edu ]
[ --- Please see the FAQ before posting. --- ]
[ FAQ: http://www.jamesd.demon.co.uk/csc/faq.html ]
|
|
| Back to top |
|
 |
Thorsten Ottosen Guest
|
Posted: Sun Sep 12, 2004 4:51 pm Post subject: Re: tempate new syntax [was: Re: Evolution of C++ : Thinking |
|
|
"Steven T. Hatton" <hattons (AT) globalsymmetry (DOT) com> wrote
| Quote: |
Thorsten Ottosen wrote:
If the only reason is faster parsing speed, then I don't see why one
should change anything. Time
is working to our advantage...the next time I buy a lap-top it will be 4
times as fast; even for many years
good compilers with pre-compiled headers have been quite fast at
compiling stuff.
What about parsing/compiling portable code on the fly in situations where
you want virtually immediate results? I don't believe that is beyond the
realm of foreseeable requirements.
|
yeah, It's always nice with faster builds, but the confusion that two
different syntaxes
can bring is also worth considering.
Another template syntax will probably hurt portability.
For programs with heavy use of templates, I vaguely recall that Daveed V. said
that
something like his metacode would improve compilation speed. By how much I
don't know.
br
Thorsten
---
[ comp.std.c++ is moderated. To submit articles, try just posting with ]
[ your news-reader. If that fails, use mailto:std-c++@ncar.ucar.edu ]
[ --- Please see the FAQ before posting. --- ]
[ FAQ: http://www.jamesd.demon.co.uk/csc/faq.html ]
|
|
| Back to top |
|
 |
Lothar Werzinger Guest
|
Posted: Mon Sep 13, 2004 3:39 am Post subject: Re: tempate new syntax [was: Re: Evolution of C++ : Thinking |
|
|
Re: tempate new syntax [was: Re: Evolution of C++ : Thinking ahead of what's
to come]
From:
Lothar Werzinger <lothar (AT) xcerla (DOT) com>
Date:
Sunday 12 September 2004 10:57:32
Groups:
comp.std.c++,comp.lang.c++.moderated
Followup-To:
comp.std.c++
no references
Andrei Alexandrescu (See Website for Email) wrote:
| Quote: | On an unrelated vein, I use "!" for passing-in default arguments to
function, and people say it looks great:
void Foo(int = 0, string = "wyda", double = 0);
can be called:
Foo(2, !, 1); // calls Foo(2, "wyda", 1);
Andrei
|
When it comes to default arguments I would muh more like the Python way by
naming the variables. With that you can specify them in any order and omit
all that you do not want to use. Of course that would REQUIRE to have names
in the declaration of methods/functions with default parameters.
void Foo(int number = 0, string text = "wyda", double amount = 0);
can be called:
// calls Foo(0, "hello andrei", 3.14);
Foo(amount = 3.14, text = "hello andrei");
Lothar
---
[ comp.std.c++ is moderated. To submit articles, try just posting with ]
[ your news-reader. If that fails, use mailto:std-c++@ncar.ucar.edu ]
[ --- Please see the FAQ before posting. --- ]
[ FAQ: http://www.jamesd.demon.co.uk/csc/faq.html ]
|
|
| Back to top |
|
 |
Francis Glassborow Guest
|
Posted: Mon Sep 13, 2004 10:29 am Post subject: Re: tempate new syntax [was: Re: Evolution of C++ : Thinking |
|
|
In article <20040912140835.GA5789 (AT) mail19g (DOT) g19.rapidsite.net>, Lothar
Werzinger <lothar (AT) xcerla (DOT) com> writes
| Quote: | When it comes to default arguments I would muh more like the Python way by
naming the variables. With that you can specify them in any order and omit
all that you do not want to use. Of course that would REQUIRE to have names
in the declaration of methods/functions with default parameters.
|
It would also require that those names have some form of extended scope,
and that is a little less trivial.
--
Francis Glassborow ACCU
Author of 'You Can Do It!' see http://www.spellen.org/youcandoit
For project ideas and contributions: http://www.spellen.org/youcandoit/projects
---
[ comp.std.c++ is moderated. To submit articles, try just posting with ]
[ your news-reader. If that fails, use mailto:std-c++@ncar.ucar.edu ]
[ --- Please see the FAQ before posting. --- ]
[ FAQ: http://www.jamesd.demon.co.uk/csc/faq.html ]
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|