1 ## our_shell: ysh
2
3 # Test YSH expressions within $[]
4
5 #### $[f(x)]
6 var a = %(a b c)
7 echo $[len(a)]
8 ## STDOUT:
9 3
10 ## END
11
12 #### $[d['key']]
13 var d = {}
14 setvar d['key'] = 42
15 echo $[d['key']]
16 ## STDOUT:
17 42
18 ## END
19
20 #### $[d.key]
21 var d = {}
22 setvar d['key'] = 42
23 echo $[d.key]
24 ## STDOUT:
25 42
26 ## END
27
28 #### In Double quotes
29 var a = %(a b c)
30 var obj = /d+/
31 var d = {}
32 setvar d['key'] = 42
33 echo "func $[len(a)]"
34 echo "key $[d['key']]"
35 echo "key $[d.key]"
36 echo "dq $[d["key"]]"
37 ## STDOUT:
38 func 3
39 key 42
40 key 42
41 dq 42
42 ## END
43
44 #### @[expr_splice] in expression mode
45
46 # In addition to:
47 # write -- @[x]
48 #
49 # We can also do:
50 # var y = @[x]
51 # write -- @y
52
53 var x = [1, 2, 3]
54
55 var y = @[x] ++ ['99']
56
57 #= y
58
59 # note: related bug in parsing [[ in test/ysh-parse-errors.sh
60 #assert [['1', '2', '3'] === y]
61
62 assert [ ['1', '2', '3', '99'] === y]
63
64 pp test_ (y)
65
66 pp test_ (@[[4, 5, 6]])
67
68 var bad = [42, []]
69 pp test_ (@[ bad ]) # cannot be stringified
70
71 ## status: 3
72 ## STDOUT:
73 (List) ["1","2","3","99"]
74 (List) ["4","5","6"]
75 ## END
76
77
78 #### $[expr_sub] in expression mode
79
80 # Test that $[...] works in expression mode, not just in command/word mode
81
82 # Basic integer expression
83 var a = $[42]
84 pp test_ (a)
85
86 # Arithmetic expression
87 var b = $[1 + 2]
88 pp test_ (b)
89
90 # Function call
91 var arr = [1, 2, 3]
92 var c = $[len(arr)]
93 pp test_ (c)
94
95 # Nested expression
96 var d = $[$[5] + $[10]]
97 echo "d = $d"
98
99 # Combined with @[] splice
100 var items = [10, 20, 30]
101 var e = @[items]
102 echo "len(e) = $[len(e)]"
103
104 # Error case: list cannot be stringified
105 var x = $[ [42] ]
106
107 ## status: 3
108 ## STDOUT:
109 (Str) "42"
110 (Str) "3"
111 (Str) "3"
112 d = 15
113 len(e) = 3
114 ## END