OILS / spec / ysh-builtin-eval.test.sh View on Github | oilshell.org

98 lines, 50 significant
1# YSH specific features of eval
2
3## our_shell: ysh
4## oils_failures_allowed: 1
5
6#### Eval a command literal
7
8var b = ^(echo obj)
9eval (b)
10
11eval (^(echo command literal))
12
13eval { echo block }
14
15## STDOUT:
16obj
17command literal
18block
19## END
20
21
22#### Eval a block within a proc
23proc run (;;; block) {
24 eval (block)
25}
26
27run {
28 echo 'In a block!'
29}
30## STDOUT:
31In a block!
32## END
33
34#### Eval block created by calling a proc
35proc lazy-block ( ; out; ; block) {
36 call out->setValue(block)
37}
38
39var myglobal = 0
40
41lazy-block (&my_block) {
42 json write (myglobal)
43}
44
45eval (my_block)
46setvar myglobal = 1
47eval (my_block)
48## STDOUT:
490
501
51## END
52
53#### eval (block) can read variables like eval ''
54
55proc p2(code_str) {
56 var mylocal = 42
57 eval $code_str
58}
59
60p2 'echo mylocal=$mylocal'
61
62proc p (;;; block) {
63 var mylocal = 99
64 eval (block)
65}
66
67p {
68 echo mylocal=$mylocal
69}
70
71
72## STDOUT:
73mylocal=42
74mylocal=99
75## END
76
77#### eval should have a sandboxed mode
78
79proc p (;;; block) {
80 var this = 42
81
82 # like push-registers? Not sure
83 # We could use state.ctx_Temp ? There's also ctx_FuncCall etc.
84 #
85 # I think we want to provide full control over the stack.
86 push-frame {
87 eval (block)
88 }
89}
90
91p {
92 echo $this
93}
94
95## status: 1
96## STDOUT:
97TODO
98## END