Discussion:
Syntax of function calls without arguments?
(too old to reply)
Janis Papanagnou
2023-05-11 02:19:16 UTC
Permalink
In an old paper "Awk - A Pattern Scanning and Processing Language"[*]
from the authors of Awk I read:

"Awk also provides the arithmetic functions sqrt, log, exp, and
int, for square root, base e logarithm, exponential, and integer
part of their respective arguments.
The name of one of these built-in functions, _without argument or
parentheses_, stands for the value of the function on the whole
record."

POSIX[**] says:

"Although the grammar (see Grammar) permits built-in functions to
appear _with no arguments or parentheses_, [...], such use is
undefined."

(_emphasis_ in the quotes added by me).

GNU Awk (for example) typically[***] returns errors:

$ awk '{print sqrt}'
awk: cmd. line:1: {print sqrt}
awk: cmd. line:1: ^ syntax error
$ awk '{print sqrt()}'
awk: cmd. line:1: {print sqrt()}
awk: cmd. line:1: ^ 0 is invalid as number of arguments for sqrt

How do other Awks behave? - I'd assume that "oawk" and "nawk" might
support that feature, but does any other awk implementation support
that?

Janis

[*] https://people.eecs.berkeley.edu/~clancy/sp.unix.stuff/awk
[**] https://pubs.opengroup.org/onlinepubs/9699919799/utilities/awk.html
[***] With length($0), length(), length as a singular(?) exception.
Keith Thompson
2023-05-11 02:34:47 UTC
Permalink
Post by Janis Papanagnou
In an old paper "Awk - A Pattern Scanning and Processing Language"[*]
"Awk also provides the arithmetic functions sqrt, log, exp, and
int, for square root, base e logarithm, exponential, and integer
part of their respective arguments.
The name of one of these built-in functions, _without argument or
parentheses_, stands for the value of the function on the whole
record."
"Although the grammar (see Grammar) permits built-in functions to
appear _with no arguments or parentheses_, [...], such use is
undefined."
(_emphasis_ in the quotes added by me).
$ awk '{print sqrt}'
awk: cmd. line:1: {print sqrt}
awk: cmd. line:1: ^ syntax error
$ awk '{print sqrt()}'
awk: cmd. line:1: {print sqrt()}
awk: cmd. line:1: ^ 0 is invalid as number of arguments for sqrt
How do other Awks behave? - I'd assume that "oawk" and "nawk" might
support that feature, but does any other awk implementation support
that?
Janis
[*] https://people.eecs.berkeley.edu/~clancy/sp.unix.stuff/awk
[**] https://pubs.opengroup.org/onlinepubs/9699919799/utilities/awk.html
[***] With length($0), length(), length as a singular(?) exception.
gawk and mawk report a syntax error.

original-awk on Ubuntu accepts it:

$ original-awk --version
awk version 20180827
$ echo 2 | original-awk '{print sqrt}'
1.41421
$
--
Keith Thompson (The_Other_Keith) Keith.S.Thompson+***@gmail.com
Working, but not speaking, for XCOM Labs
void Void(void) { Void(); } /* The recursive call of the void */
Ivan Shmakov
2023-05-11 18:10:56 UTC
Permalink
Post by Janis Papanagnou
$ awk '{print sqrt}'
awk: cmd. line:1: {print sqrt}
awk: cmd. line:1: ^ syntax error
$ awk '{print sqrt()}'
awk: cmd. line:1: {print sqrt()}
awk: cmd. line:1: ^ 0 is invalid as number of arguments for sqrt
How do other Awks behave? - I'd assume that "oawk" and "nawk" might
support that feature, but does any other awk implementation support
that?
The one included in BusyBox 1.35.0 doesn't seem to accept it:

$ busybox awk '1 { print sqrt }'
awk: cmd. line:1: Unexpected token
$

The one from NetBSD, http://man.netbsd.org/awk.1 , does:

$ printf 2\\n | awk '1 { print sqrt }'
1.41421
$
Post by Janis Papanagnou
[*] https://people.eecs.berkeley.edu/~clancy/sp.unix.stuff/awk
[**] https://pubs.opengroup.org/onlinepubs/9699919799/utilities/awk.html
[***] With length($0), length(), length as a singular(?) exception.
--
FSF associate member #7257 http://am-1.org/~ivan/
Ben Bacarisse
2023-05-11 19:54:57 UTC
Permalink
Post by Ivan Shmakov
Post by Janis Papanagnou
$ awk '{print sqrt}'
awk: cmd. line:1: {print sqrt}
awk: cmd. line:1: ^ syntax error
$ awk '{print sqrt()}'
awk: cmd. line:1: {print sqrt()}
awk: cmd. line:1: ^ 0 is invalid as number of arguments for sqrt
How do other Awks behave? - I'd assume that "oawk" and "nawk" might
support that feature, but does any other awk implementation support
that?
$ busybox awk '1 { print sqrt }'
awk: cmd. line:1: Unexpected token
$
$ printf 2\\n | awk '1 { print sqrt }'
1.41421
$
As does a version of Unix V7 awk running on a PDP11 simulator. It's
obviously an old feature:

$ echo 2 | awk '{print sqrt}'
1.41421

Curiously, it's only documented to apply to the length function. man
awk says

The built-in function length returns the length of its argu-
ment taken as a string, or of the whole line if no argument.
There are also built-in functions exp, log, sqrt, and int.
--
Ben.
Keith Thompson
2023-05-11 21:40:06 UTC
Permalink
Post by Ben Bacarisse
Post by Ivan Shmakov
Post by Janis Papanagnou
$ awk '{print sqrt}'
awk: cmd. line:1: {print sqrt}
awk: cmd. line:1: ^ syntax error
$ awk '{print sqrt()}'
awk: cmd. line:1: {print sqrt()}
awk: cmd. line:1: ^ 0 is invalid as number of arguments for sqrt
How do other Awks behave? - I'd assume that "oawk" and "nawk" might
support that feature, but does any other awk implementation support
that?
$ busybox awk '1 { print sqrt }'
awk: cmd. line:1: Unexpected token
$
$ printf 2\\n | awk '1 { print sqrt }'
1.41421
$
As does a version of Unix V7 awk running on a PDP11 simulator. It's
$ echo 2 | awk '{print sqrt}'
1.41421
Curiously, it's only documented to apply to the length function. man
awk says
The built-in function length returns the length of its argu-
ment taken as a string, or of the whole line if no argument.
There are also built-in functions exp, log, sqrt, and int.
Just from that description, it's not clear that `length()` and `length`
are both valid.
--
Keith Thompson (The_Other_Keith) Keith.S.Thompson+***@gmail.com
Working, but not speaking, for XCOM Labs
void Void(void) { Void(); } /* The recursive call of the void */
Ben Bacarisse
2023-05-12 00:46:38 UTC
Permalink
Post by Keith Thompson
Post by Ben Bacarisse
Post by Ivan Shmakov
Post by Janis Papanagnou
$ awk '{print sqrt}'
awk: cmd. line:1: {print sqrt}
awk: cmd. line:1: ^ syntax error
$ awk '{print sqrt()}'
awk: cmd. line:1: {print sqrt()}
awk: cmd. line:1: ^ 0 is invalid as number of arguments for sqrt
How do other Awks behave? - I'd assume that "oawk" and "nawk" might
support that feature, but does any other awk implementation support
that?
$ busybox awk '1 { print sqrt }'
awk: cmd. line:1: Unexpected token
$
$ printf 2\\n | awk '1 { print sqrt }'
1.41421
$
As does a version of Unix V7 awk running on a PDP11 simulator. It's
$ echo 2 | awk '{print sqrt}'
1.41421
Curiously, it's only documented to apply to the length function. man
awk says
The built-in function length returns the length of its argu-
ment taken as a string, or of the whole line if no argument.
There are also built-in functions exp, log, sqrt, and int.
Just from that description, it's not clear that `length()` and `length`
are both valid.
Indeed. The POSIX specification makes it clearer with

length[([s])] and "... if there is no argument"

The gawk man page writes length([s]) so its "if s is not supplied" is
not quite so clear. mawk's man page make no reference to the special
case at all.

I find it interesting that the special case of length applying to $0 has
been retained in modern AWKs, but not the general case. I'd have
thought it would have been simpler to do what the old AWK did. Maybe
too many bugs occurred from writing 'exp', but 'length' was too useful a
shorthand to outlaw.
--
Ben.
Loading...