-
Notifications
You must be signed in to change notification settings - Fork 214
Expand file tree
/
Copy pathcodebloc.prg
More file actions
127 lines (89 loc) · 2.68 KB
/
codebloc.prg
File metadata and controls
127 lines (89 loc) · 2.68 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#ifndef __HARBOUR__
#include "clipper.ch"
#endif
// codeblock tests
PROCEDURE Main()
LOCAL B := "this will never print"
LOCAL a := {| b, c | OutStd( "I am a codeblock" + b + c ) }
LOCAL d
LOCAL de
LOCAL ar := { 1, 2 }
LOCAL YY, X
LOCAL x1, x2
HB_SYMBOL_UNUSED( b )
OutStd( "this should print first" )
OutStd( hb_eol() )
Eval( a, " with parameters", " ... and it works!" )
OutStd( hb_eol() )
d := "with access to local variables"
a := {| b, c | OutStd( "I am a second codeblock " + d + b + ;
iif( c == NIL, " empty second parameter ", c ) ), OutStd( hb_eol() ), "WITH return value" }
Eval( a, ", codeblock parameters" )
OutStd( hb_eol() )
Eval( a, ", codeblock parameters ", "and with second parameter" )
OutStd( hb_eol() )
OutStd( MyEval( a ) )
OutStd( hb_eol() )
OtherTest( a )
OutStd( hb_eol() )
AnotherTest( a, "==> Another " )
OutStd( hb_eol() )
a := {| c | iif( c == NIL, {| a | "First " + a }, {| a | "Second " + a } ) }
a := Eval( a )
OutStd( hb_eol() )
OutStd( Eval( a, "codeblock created in a codeblock" ) )
OutStd( hb_eol() )
OutStd( ar[ 1 ] )
OutStd( hb_eol() )
a := {|| ar[ 1 ]++ }
Eval( a )
OutStd( ar[ 1 ] )
OutStd( hb_eol() )
yy := 5
x := {| xx | OutStd( hb_ntos( xx ) ), OutStd( "+" ), OutStd( hb_ntos( yy ) ), OutStd( "=" ), xx + yy }
OutStd( Eval( x, 1 ) ) // this is OK
OutStd( hb_eol() )
OutStd( Eval( x, 1, 2 ) ) // this should ignore unnecesary parameters
QOut( Eval( RetBlock(), 5 ) )
// BugToFix()
OutStd( hb_eol() )
OutStd( "Trying to use detached variable ..." )
OutStd( hb_eol() )
x1 := 5
x2 := 6
de := DetachLocal( x1, x2 )
OutStd( Eval( de ) )
// changing the value of variables
OutStd( hb_eol() )
x1 := 10
x2 := 11
QOut( Eval( de ) )
de := DetachLocal( x1, x2 )
QOut( Eval( de ) )
RETURN
STATIC FUNCTION MyEval( bCodeBlock )
LOCAL D := "this is another variable"
RETURN Eval( bCodeBlock, " from ", "MyEval Function" )
STATIC PROCEDURE OtherTest( cblock )
LOCAL cb
cb := {| a, b | Eval( cblock, a, b ) }
Eval( cb, "--> with nested ", "EVAL" )
RETURN
STATIC PROCEDURE AnotherTest( cb, a )
OutStd( Eval( cb, a ) )
OutStd( hb_eol() )
OutStd( Eval( cb, a, "again and again" ) )
OutStd( hb_eol() )
RETURN
STATIC FUNCTION DetachLocal( x, y )
// NOTE! this should work
LOCAL z := x + y
LOCAL cb := {|| QOut( "z=x+y=" ), QOut( z ), QOut( "x*x=" ), QOut( x * x ), QOut( "x*x+z=" ), x * x + z }
RETURN cb
STATIC PROCEDURE BugToFix()
LOCAL b, a := {|| a + b }
b := "bug "
Eval( a )
RETURN
STATIC FUNCTION RetBlock()
RETURN {| x | x * x }