@c Created Sun Dec 13 12:05:46 2009 by ./../gri2texi from tst_var_syn.gri.gri
@example
show "doc/tst_suite/tst_var_syn.gri ..." ...
rpnfunction same - abs 1e-10 >          @emph{#  Are numbers virtually same?}

# New and delete (variables)
 .v. = 1
new .v.
.v. = 2
assert @{rpn .v. 2 same@}                 " failed test 1.1"
assert @{rpn ".v." defined@}              " failed test 1.2"
delete .v.
assert @{rpn .v. 1 same@}                 " failed test 1.3"
assert @{rpn ".v." defined@}              " failed test 1.4"
delete .v.
assert @{rpn ".v." defined !@}            " failed test 1.4"

# New and delete (synonyms)
\v = "hi"
new \v
\v = "hello"
assert @{rpn "\v" "hello" ==@}            " failed test 2.1"
assert @{rpn "\\v" defined@}              " failed test 2.2"
delete \v
assert @{rpn "\v" "hi" ==@}               " failed test 2.3"
assert @{rpn "\\v" defined@}              " failed test 2.4"
delete \v
assert @{rpn "\\v" defined !@}            " failed test 2.5"

# Multi-word synonyms
\h = "Hi there buddy"
assert @{rpn  \[]h    3      ==@}         " failed test 3.1"
.i. = \[]h
assert @{rpn  .i.     3      ==@}         " failed test 3.2"
assert @{rpn "\[0]h" "Hi"    ==@}         " failed test 3.3"
assert @{rpn "\[1]h" "there" ==@}         " failed test 3.4"
assert @{rpn "\[2]h" "buddy" ==@}         " failed test 3.5"
\h = "Hi means \"hello\""
assert @{rpn "\[0]h" "Hi"        ==@}     " failed test 3.6"
assert @{rpn "\[1]h" "means"     ==@}     " failed test 3.7"
assert @{rpn "\[2]h" "\"hello\"" ==@}     " failed test 3.8"
.i. = 1
assert @{rpn "\[.i.]h" "means"   ==@}     " failed test 3.9"
\i = "1"
assert @{rpn "\[\i]h"  "means"   ==@}     " failed test 3.10"

# Setting by quoted name
set ".var." to 10
assert @{rpn .var. 10 ==@}                " failed test 4.1"
set "\\syn" to "hi"
assert @{rpn "\syn" "hi" ==@}             " failed test 4.2"

# Setting by quoted name, in a new command
`hi pi "\\Greeting" ".Pi."'
@{
    set "\.word2." to "hi"
    set "\.word3." to 3.14
@}
hi pi "\\g" ".p."
assert @{rpn "\g" "hi" ==@}                       " failed test 5.1"
assert @{rpn .p.  3.14 ==@}                       " failed test 5.2"

# Execution of synonyms
\ret = "\string = \"Hello\""
\ret
assert @{rpn "\string" "Hello" ==@}               " failed test 6.1"

# Parsing of individual words in synonyms (tests SourceForge bug 114983)
`Newcommand "\pat"''
@{
    \t = "A .2" 
    assert @{rpn "\[0].word1." "\[0]t" ==@}       " failed test 7.1"
@} 
Newcommand "A .2" 

# Test aliased synonyms

# Part 1. check to see @strong{if} can delete without either a 
# single or a double backslash, and either with 
# enclosing double-quotes, or not.
\a = "HI"
assert @{rpn "\\a"    defined   @}                " failed test 8.1"
delete \a
assert @{rpn "\\a"    defined ! @}                " failed test 8.2"
\a = "HI"
delete \a
assert @{rpn "\\a"    defined ! @}                " failed test 8.3"

new \a
assert @{rpn "\\a"     defined   @}               " failed test 9.1"
\a = "greeting"
assert @{rpn "\\a"     defined   @}               " failed test 9.2"
delete \a
assert @{rpn "\\a"     defined ! @}               " failed test 9.3"

# Part 5. sprintf
sprintf \a "%.1f" 10
assert @{rpn "\a" "10.0" == @}                    " failed test 10.1"
\alias_for_a = "\\a"
sprintf \@@alias_for_a "%.1f" 20
assert @{rpn "\a" "20.0" == @}                    " failed test 10.2"

# Part 6. Environment variables (SF bug 117415)
\alias_for_a = "\\a"
get env \@@alias_for_a "SHELL"
get env \b "SHELL"
assert @{rpn "\a" "\b" ==@}                       " failed test 11.1"

# Part 7 'read' (SF bug 117412)
\TMPFILE = tmpname
system echo "Hello" > \TMPFILE
open "\TMPFILE"
read \a
assert @{rpn "\a" "Hello" ==@}                    " failed test 12.1"
\a = "JUNK"
\alias_for_a = "\\a"
rewind
read \\a
assert @{rpn "\a" "Hello" ==@}                    " failed test 12.2"
\a = "JUNK"
\alias_for_a = "\\a"
rewind
read \@@alias_for_a
close
assert @{rpn "\a" "Hello" ==@}                    " failed test 12.3"
system rm -f \TMPFILE

# Part 8 -- ensure not trying to evaluate inside 'false' @strong{if} parts.
\str = "Hello"
\t = @{rpn "\s" "tr" strcat@}	@emph{#  construct a name}
@strong{@strong{if}} @{rpn "\\t" defined@}		@emph{#  test @strong{if} defined}
    .val. = 1
end @strong{if}
@strong{@strong{if}} @{rpn "\\x" defined@}		@emph{#  this one is not defined}
    .val. = 2
end @strong{if}
assert @{rpn .val. 1 ==@}                         " failed test 12.4"

#
\a1 = "1"
\b1 = "2"
\a2 = "10"
\b2 = "20"
read columns x y
\a1 \b1
\a2 \b2

assert @{rpn x 0 @@  1 ==@}                        " failed test 13.1"
assert @{rpn x 1 @@ 10 ==@}                        " failed test 13.2"
assert @{rpn y 0 @@  2 ==@}                        " failed test 13.3"
assert @{rpn y 1 @@ 20 ==@}                        " failed test 13.4"

`NC ...'
@{
    read columns x y
    \.word1 \.word2.
    
@}
NC 1 10
assert @{rpn x 0 @@  1 ==@}                        " failed test 14.1"
assert @{rpn y 0 @@ 10 ==@}                        " failed test 14.2"

\a = "1  2"
\b = "10 20"
\index = "0"
read columns x y
\[\index]a \[1]b

assert @{rpn x 0 @@  1 ==@}                        " failed test 15.1"
assert @{rpn y 0 @@ 20 ==@}                        " failed test 15.2"


`NC2 ...'
@{
    read columns x y
    \[0].word1. \[0].word2.
    \[1].word1. \[1].word2.
    
@}
NC2 "1 2" "100 200"
assert @{rpn x 0 @@   1 ==@}                        " failed test 16.1"
assert @{rpn x 1 @@   2 ==@}                        " failed test 16.2"
assert @{rpn y 0 @@ 100 ==@}                        " failed test 16.3"
assert @{rpn y 1 @@ 200 ==@}                        " failed test 16.4"


# Part 9. New commands with variables

# Rvalue: synonyms/variables
`ampersand_rvalue &.v. &\s'
@{
    new \syn
    \syn = "Shadow"
    new .a.
    .a. = 0
    assert @{rpn \.word1. 1 ==@}                   " failed test 17.1"
    assert @{rpn "\.word2." "Brightness" ==@}      " failed test 17.2"
    delete \syn
    delete .a.
@}
.a. = 1
\syn = "Brightness"
ampersand_rvalue &.a. &\syn

# Rvalue + Lvalue: synonym
`append &\s'
@{
    \.word1. = "\.word1. and bye"
@}
\a = "hi"
append &\a
assert @{rpn "\a" "hi and bye" ==@}                "failed test 18.3"

# Rvalue + Lvalue: variable in the = form of assignment
`double &.var.'
@{
    \.word1. = @{rpn \.word1. 2 *@}
@}
.a. = 10
double &.a.
assert @{rpn .a. 20 ==@}                           "failed test 18.4"

`Double &.var.'
@{
    \.word1. *= 2
@}
.a. = 10
Double &.a.
assert @{rpn .a. 20 ==@}                          " failed test 18.5"

`halve &.var.'
@{
    \.word1. = @{rpn \.word1. 2 /@}
@}
halve &.a.
assert @{rpn .a. 10 ==@}                          " failed test 18.6"

`NC3 &\friendly'
@{
    \.word1. = "Howdy"
@}
\greeting = "Hi"
NC3 &\greeting
assert @{rpn "\greeting" "Howdy" ==@}             " failed test 18.7"

`postpend_dat &\filename'
@{
    \.word1. = @{rpn "\.word1." ".dat" strcat@}
@}
\filename = "test"
postpend_dat &\filename
assert @{rpn "test.dat" "\filename" ==@}           " failed test 18.8"

# new
`test_new &\s'
@{
    new \.word1.
    new \a
    \a = "This will dissapear"
    \.word1. = "Think locally"
    delete \a
@}
\a = "Act globally"
test_new &\a
assert @{rpn "\a" "Think locally" ==@}             " failed test 18.9"
delete \a
assert @{rpn "\a" "Act globally" ==@}              " failed test 18.10"

`test_new_delete &\s'
@{
    new \a
    \a = "Insurrection"
    assert @{rpn "\.word1." "Act globally" ==@}    " failed test 18.11"
    delete \.word1.
    assert @{rpn "\.word1." "Or @strong{else}" ==@}         " failed test 18.12"
    delete \a
@}
\a = "Or @strong{else}"
new \a
\a = "Act globally"
test_new_delete &\a

# Nexting
`nest2 &.v. &\s'
@{
    assert @{rpn "\.word1." "HI" ==@}              " failed test 18.13"
    assert @{rpn \.word2. 0.5 ==@}                 " failed test 18.14"
@}
`nest1 &.v. &\s'
@{
    nest2 &\.word2. &\.word1.	@emph{#  reversed}
@}
.a. = 0.5
\s = "HI"
nest1 &.a. &\s
# defined
`check_defined &.v.'
@{
    assert @{rpn "\\.word1." defined@}             " failed test 18.15"
    delete .a.
    assert @{rpn "\\.word1." defined !@}           " failed test 18.16"
@}
.a. = 100
check_defined &.a.

# System
\t = system perl <<"EOF" 
@{print "Hi"@}; 
EOF 
assert @{rpn "\t" "Hi" ==@}                       " failed test 19.1"
\t = system perl <<"EOF" 
@{print "Hello"@}; 
 EOF 
assert @{rpn "\t" "Hello" ==@}                    " failed test 19.2"
`NC4'
@{ 
    \t = system perl <<"EOF" 
    @{print "Howdie"@};
EOF 
@} 
NC4
assert @{rpn "\t" "Howdie" ==@}                   " failed test 19.3"
`NC5'
@{ 
    \t = system perl <<"EOF" 
        @{print "G'day"@};
    EOF 
@} 
NC5
assert @{rpn "\t" "G'day" ==@}                    " failed test 19.4"

#@emph{# # BLOCK 20 ###}
# Alias as lvalue (e.g. \@@ptr = ...)
# (1) lvalue synonyms
\greeting = "You say goodbye"
\alias = "\\greeting"
\@@alias = "And I say hello"
assert @{rpn "\greeting" "And I say hello" ==@}   " failed test 20.1"
# (2) lvalue variables
.b. = 1
\bptr = ".b."
\@@bptr *= 2
assert @{rpn .b. 2 ==@}                           " failed test 20.2"
\@@bptr = 10
assert @{rpn .b. 10 ==@}                          " failed test 20.3"

# Alias as rvalue (e.g. show "\@@ptr")
# (1) rvalue synonyms
\a = "HI"
\aptr = "\\a"
assert @{rpn "\@@aptr" "HI" ==@}                   " failed test 20.4"
\@@aptr = "BYE"
assert @{rpn "\@@aptr" "BYE" ==@}                  " failed test 20.5"
\aa = "\@@aptr"
assert @{rpn "\@@aptr" "BYE" ==@}                  " failed test 20.6"
# (2) rvalue variables
.a. = 1
\aptr = ".a."
assert @{rpn \@@aptr 1 ==@}                        " failed test 20.7"
.aa. = @{rpn .a. 1 +@}
assert @{rpn .aa. 2 ==@}                          " failed test 20.8"

# Missing values
set missing value 0
.x. = 0
assert @{rpn .x. ismissing@}                      " failed test 21.1"
assert @{rpn .x. 1 + ismissing@}                  " failed test 21.2"
set missing value 1e33

show " passed"
@end example
