-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathvalue_bind.mdtlbl
96 lines (84 loc) · 2.06 KB
/
value_bind.mdtlbl
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
#**
* 这是在0.10.0版本加入的语法
* 可以有效的把数据组织起来
* 作用是将一个Var按照特定格式绑定到一个Value的句柄
* 语法为 `NonDExpValue "." NoStringVar`, 例如`$.data` `foo.bar`
* 这里需要注意的是, 其左值的句柄不能为字符串, 否则会报错
*
* 在0.14.3版本将其扩展, 使其可以出现在take和const目标中, 并且会添加至全局作用域
* 当局部作用域都没有命中时, 将会尝试命中全局作用域
*
* 需要注意的是, 最佳实践中最好被绑定的量仅为匿名量, 否则可能会造成一定的混乱.
* 因为那时候或许难以区分哪些是展开为同一个量的值, 而值绑定是绑定在其句柄,
* 也就是展开的量上的
*
* 这个功能扩展主要是配合match使用的,
* 对于主要关注其量为变量的情况, 这很可能导致生命周期的模糊边界,
* 可能为项目增加额外的复杂度, 谨慎使用
*#
const Human_new = (
take Name = _0;
take Age = _1;
$ $.age = Name Age;
);
take["jack" 18] Human = Human_new;
print Human Human.age;
#* >>>
set __0 "jack"
set __1 18
print __0
print __1
*#
# 可以看到, 我们将额外的age绑定到了我们的Human
# 这可以用来组织一些复杂结构
# 这是一个复数的示例
const Complex_new = (
take RNum = _0;
take INum = _1;
$ $.i = RNum INum;
);
const Complex_add = (
take Num1 = _0;
take Num2 = _1;
op $ Num1 + Num2;
op $.i Num1.i + Num2.i;
);
take[3 5] Num1 = Complex_new;
take[2 8] Num2 = Complex_new;
take[Num1 Num2] Num3 = Complex_add;
print Num3 "," Num3.i;
#* >>>
set __0 3
set __1 5
set __2 2
set __3 8
op add __4 __0 __2
op add __5 __1 __3
print __4
print ","
print __5
*#
# 可以看到, 这可以使我们方便的组织数据
const Foo = (
take $.X = _0;
);
print Foo[2].X;
#* >>>
print 2
*#
# 全局作用域并不受局部作用域限制
const Foo = (
const $.F = (
print "foo";
);
print "bar";
);
take R = Foo;
print "---";
take R.F;
#* >>>
print "bar"
print "---"
print "foo"
*#
# 使用const直接将值传出而不take