1 # YSH specific features of eval
2
3 ## our_shell: ysh
4 ## oils_failures_allowed: 1
5
6 #### Eval a command literal
7
8 var b = ^(echo obj)
9 eval (b)
10
11 eval (^(echo command literal))
12
13 eval { echo block }
14
15 ## STDOUT:
16 obj
17 command literal
18 block
19 ## END
20
21
22 #### Eval a block within a proc
23 proc run (;;; block) {
24 eval (block)
25 }
26
27 run {
28 echo 'In a block!'
29 }
30 ## STDOUT:
31 In a block!
32 ## END
33
34 #### Eval block created by calling a proc
35 proc lazy-block ( ; out; ; block) {
36 call out->setValue(block)
37 }
38
39 var myglobal = 0
40
41 lazy-block (&my_block) {
42 json write (myglobal)
43 }
44
45 eval (my_block)
46 setvar myglobal = 1
47 eval (my_block)
48 ## STDOUT:
49 0
50 1
51 ## END
52
53 #### eval (block) can read variables like eval ''
54
55 proc p2(code_str) {
56 var mylocal = 42
57 eval $code_str
58 }
59
60 p2 'echo mylocal=$mylocal'
61
62 proc p (;;; block) {
63 var mylocal = 99
64 eval (block)
65 }
66
67 p {
68 echo mylocal=$mylocal
69 }
70
71
72 ## STDOUT:
73 mylocal=42
74 mylocal=99
75 ## END
76
77 #### eval should have a sandboxed mode
78
79 proc 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
91 p {
92 echo $this
93 }
94
95 ## status: 1
96 ## STDOUT:
97 TODO
98 ## END