On Sun, Apr 21, 2013 at 3:21 PM, Roland Mainz <[email protected]> wrote:
> Another "typeset -m" issue... the following example doesn't work if
> function "sortar" is declared using "function sortar" instead of
> "sortar():
> -- snip --
> compound c=(
>         compound -a ar=(
>                 ( float i=4 )
>                 ( float i=7 )
>                 ( float i=2 )
>                 ( float i=1 )
>                 ( float i=24 )
>                 ( float i=-1 )
>         )
> )
>
> function sortar
> #sortar()
> {
>         nameref ar=$1
>         integer i
>         integer -r i_max=${#ar[@]}
>
>         bool swapped=true
>
>         while $swapped ; do
>                 swapped=false
>                 for (( i=1 ; i < i_max ; i++ )) ; do
>                         if (( ar[i].i > ar[i-1].i )) ; then
>                                 typeset -m "tmp=ar[i-1]"
>                                 typeset -m "ar[i-1]=ar[i]"
>                                 typeset -m "ar[i]=tmp"
>                                 swapped=true
>                         fi
>                 done
>         done
>         return 0
> }
>
> # main
> set -o nounset
>
> sortar c.ar
>
> print -v c
> -- snip --
>
> AFAIK the demo should print...
> -- snip --
> (
>         typeset -C -a ar=(
>                 [0]=(
>                         typeset -l -E i=24
>                 )
>                 [1]=(
>                         typeset -l -E i=7
>                 )
>                 [2]=(
>                         typeset -l -E i=4
>                 )
>                 [3]=(
>                         typeset -l -E i=2
>                 )
>                 [4]=(
>                         typeset -l -E i=1
>                 )
>                 [5]=(
>                         typeset -l -E i=-1
>                 )
>         )
> )
> -- snip --
> ... but ast-ksh.2013-04-09 on SuSE 12.2/AMD64/64bit prints this:
> -- snip --
> $ ksh sortc.sh
> sortc.sh[38]: sortar: line 24: ar[i-1].i : parameter not set
> (
>         typeset -C -a ar=(
>                 [0]=(
>                         typeset -l -E i=7
>                 )
>                 [2]=(
>                         typeset -l -E i=2
>                 )
>                 [3]=(
>                         typeset -l -E i=1
>                 )
>                 [4]=(
>                         typeset -l -E i=24
>                 )
>                 [5]=(
>                         typeset -l -E i=-1
>                 )
>         )
> )
> -- snip --

Here's an updated version of the testcase which handles the
floating-point corner issues of { -nan/+nan, -inf, +inf }:
-- snip --
function sortar
#sortar()
{
        nameref         ar=$1
        bool            direction=$2
        integer         i
        integer -r      i_max=${#ar[@]}
        float           d
        bool            swapped=true
        (( d=direction?+1.:-1. ))

        while $swapped ; do
                swapped=false
                for (( i=1 ; i < i_max ; i++ )) ; do
                        if (( isnan(ar[i].i) ||
                                isgreater((ar[i].i - ar[i-1].i)*d, 0.)
                                )) ; then
                                typeset -m "tmp=ar[i-1]"
                                typeset -m "ar[i-1]=ar[i]"
                                typeset -m "ar[i]=tmp"
                                swapped=true
                        fi
                done
        done
        return 0
}

function main
{
        compound c=(
                compound -a ar=(
                        ( float i=4 )
                        ( float i=2 )
                        ( float i=-nan )
                        ( float i=2 )
                        ( float i=-inf )
                        ( float i=1 )
                        ( float i=24 )
                        ( float i=+inf )
                        ( float i=-1 )
                )
        )

        sortar c.ar true

        print -v c
}

# main
set -o nounset
main
-- snip --

AFAIK it should print:
-- snip --
$ ksh sortc.sh
(
        typeset -C -a ar=(
                [0]=(
                        typeset -l -E i=-nan
                )
                [1]=(
                        typeset -l -E i=inf
                )
                [2]=(
                        typeset -l -E i=24
                )
                [3]=(
                        typeset -l -E i=4
                )
                [4]=(
                        typeset -l -E i=2
                )
                [5]=(
                        typeset -l -E i=2
                )
                [6]=(
                        typeset -l -E i=1
                )
                [7]=(
                        typeset -l -E i=-1
                )
                [8]=(
                        typeset -l -E i=-inf
                )
        )
)
-- snip --
... but ast-ksh.2013-04-09 on SuSE 12.2/AMD64/64bit prints this:
-- snip --
$ ksh sortc.sh
sortc.sh[53]: main[46]: sortar: line 18: ar[i-1].i)*d, 0.)
                                : parameter not set
(
        typeset -C -a ar=(
                [0]=(
                        typeset -l -E i=4
                )
                [1]=(
                        typeset -l -E i=-nan
                )
                [3]=(
                        typeset -l -E i=2
                )
                [4]=(
                        typeset -l -E i=-inf
                )
                [5]=(
                        typeset -l -E i=1
                )
                [6]=(
                        typeset -l -E i=24
                )
                [7]=(
                        typeset -l -E i=inf
                )
                [8]=(
                        typeset -l -E i=-1
                )
        )
)
-- snip --

----

Bye,
Roland

-- 
  __ .  . __
 (o.\ \/ /.o) [email protected]
  \__\/\/__/  MPEG specialist, C&&JAVA&&Sun&&Unix programmer
  /O /==\ O\  TEL +49 641 3992797
 (;O/ \/ \O;)
_______________________________________________
ast-developers mailing list
[email protected]
http://lists.research.att.com/mailman/listinfo/ast-developers

Reply via email to