芝士MCFPP
MCFPP是一个能被编译为Minecraft数据包的全新的面向对象的语言。它旨在以类似C系语言的语法,进行数据包的编写,并引入编程中常用的概念,从而使数据包的编写更加的便利。
仓库地址:https://github.com/MinecraftFunctionPlusPlus/MCFPP
目前最新版本:SNAPSHOT 25m01a
要做什么
java.util.HashMap mcfpp.lang.dict和mcfpp.lang.map,基于NBT复合标签的字典实现,以及可遍历的简单包装版本
怎么做的
神圣NBT让命令天然就有了字典这种数据类型。
但是可惜的是,原版的复合标签只提供了基本的读写能力,甚至完全不具备遍历能力。这也是为什么MCFPP提供了两个类型,dict
和map
,分别对应的是最基本的最原版的复合标签,以及维护了一个键列表从而能提供简单遍历功能的包装版本。
dict<E>
dict
类型是最基本的复合标签,实现于top.mcfpp.core.lang.nbt.NBTDictionary
。它有一个泛型参数E
,决定了这个字典里面能存什么类型的数据。
使用[string key]
索引访问字典中的内容。
函数名 | 参数 | 返回值 | 作用 |
---|---|---|---|
containsKey | string key | bool | 判断字典中是否包含指定键 |
merge | dict dict | void | 合并两个字典 |
remove | string key | void | 移除指定键的键值对 |
clear | - | void | 清空字典 |
以下是一个使用例
namespace test;
func main(){
dynamic dict<any> qwq = {
a:1,
b:"test",
c:[1,2,3]
};
print(qwq);
print((nbt)qwq["a"]);
qwq["d"] = {a:"b"};
print(qwq);
print(qwq.containsKey("a"));
print(qwq.containsKey("x"));
dict<any> pwp = {
e: 1,
f: 2,
g: 3
};
qwq.merge(pwp);
print(qwq);
qwq.remove("a");
print(qwq);
}
map<E>
MAP的遍历功能还没有做好,只是把底子铺好了。点点star助力项目开发~
map
类型维护了一个键的列表。在map
类型的数据中,有两个子成员,一个keys
,即键列表,一个keyValueSet
,也就是一个复合标签。换句话说,map
类型是一个列表加一个字典。
map
同样拥有一个泛型参数E
,决定了map
中能存的内容。
可以直接访问keys
和keyValueSet
两个成员。
函数名 | 参数 | 返回值 | 作用 |
---|---|---|---|
clear |
void |
void |
清空map |
containsKey |
string key |
bool |
判断map 中是否包含指定键 |
isEmpty |
void |
bool |
判断map 是否为空 |
remove |
string key |
void |
移除指定键的键值对 |
merge |
map<T> map |
void |
合并两个map |
size |
void |
int |
获取map 的大小 |
使用例:
namespace test;
func main(){
dynamic map<any> qwq = {
a:1,
b:"test",
c:[1,2,3]
};
print(qwq);
print((nbt)qwq["a"]);
qwq["d"] = {a:"b"};
print(qwq);
print(qwq.containsKey("a"));
print(qwq.containsKey("x"));
map<any> pwp = {
e: 1,
f: 2,
g: 3
};
qwq.merge(pwp);
print(qwq);
qwq.remove("a");
print(qwq);
}
编译结果:
test:main
data modify storage mcfpp:system stack_frame prepend value {}
#field: map<any> qwq = {a:1,b:"test",c:[1,2,3]}
data modify storage mcfpp:system stack_frame[0].qwq.keys set value [a,b,c]
data modify storage mcfpp:system stack_frame[0].qwq.keyValueSet set value {a:1,b:test,c:[1,2,3]}
#expression: print(qwq)
#print(qwq)
tellraw @a {"type":"nbt","nbt":"stack_frame[0].qwq", "storage":"mcfpp:system","interpret":false}
#expression end: print(qwq)
#expression: print((nbt)qwq["a"])
#print((nbt)qwq["a"])
tellraw @a {"type":"nbt","nbt":"stack_frame[0].qwq.keyValueSet.a", "storage":"mcfpp:system","interpret":false}
#expression end: print((nbt)qwq["a"])
#expression: qwq["d"]={a:"b"}
data modify storage mcfpp:system stack_frame[0].qwq.keyValueSet.d set value {a:b}
data modify storage mcfpp:system stack_frame[0].qwq.keys append value d
#expression end: qwq["d"]={a:"b"}
#expression: print(qwq)
#print(qwq)
tellraw @a {"type":"nbt","nbt":"stack_frame[0].qwq", "storage":"mcfpp:system","interpret":false}
#expression end: print(qwq)
#expression: print(qwq.containsKey("a"))
#print(qwq.containsKey("a"))
#containsKey("a")
execute store result score test_func_containsKey_return mcfpp_boolean if data storage mcfpp:system stack_frame[0].qwq.keyValueSet.a
tellraw @a {"type":"score","score":{"name":"test_func_containsKey_return","objective":"mcfpp_boolean"}}
#expression end: print(qwq.containsKey("a"))
#expression: print(qwq.containsKey("x"))
#print(qwq.containsKey("x"))
#containsKey("x")
execute store result score test_func_containsKey_return mcfpp_boolean if data storage mcfpp:system stack_frame[0].qwq.keyValueSet.x
tellraw @a {"type":"score","score":{"name":"test_func_containsKey_return","objective":"mcfpp_boolean"}}
#expression end: print(qwq.containsKey("x"))
#field: map<any> pwp = {e:1,f:2,g:3}
#expression: qwq.merge(pwp)
#merge(pwp)
data modify storage mcfpp:system stack_frame[0].pwp.keys set value [e,f,g]
data modify storage mcfpp:system stack_frame[0].qwq.keys append from storage mcfpp:system stack_frame[0].pwp.keys[]
data modify storage mcfpp:system stack_frame[0].qwq.keyValueSet merge value {e:1,f:2,g:3}
#expression end: qwq.merge(pwp)
#expression: print(qwq)
#print(qwq)
tellraw @a {"type":"nbt","nbt":"stack_frame[0].qwq", "storage":"mcfpp:system","interpret":false}
#expression end: print(qwq)
#expression: qwq.remove("a")
#remove("a")
data remove storage mcfpp:system stack_frame[0].qwq.keyValueSet.a
data modify storage mcfpp:system list.element set value a
scoreboard players set list.index mcfpp_temp 0
execute store result score list.size mcfpp_temp run data get storage mcfpp:system list.list
function mcfpp.lang:list/index_of
execute unless score list_index mcfpp_temp matches -1 run function test:remove_temp_33
#expression end: qwq.remove("a")
#expression: print(qwq)
#print(qwq)
tellraw @a {"type":"nbt","nbt":"stack_frame[0].qwq", "storage":"mcfpp:system","interpret":false}
#expression end: print(qwq)
data remove storage mcfpp:system stack_frame[0]
test:remove_temp_33
execute store result storage mcfpp:system stack_frame[0].list_index int 1 run scoreboard players get list_index mcfpp_temp
function mcfpp:dynamic/macro_34 with storage mcfpp:system stack_frame[0]
mcfpp:dynamic/macro_34
$data remove storage mcfpp:system stack_frame[0].qwq.keys[$(list_index)]
结果:
然后然后
在写map.remove(E e)
的时候,我们顺便给list
加上了remove
函数~
函数名 | 参数 | 返回值 | 作用 |
---|---|---|---|
remove |
E e |
void |
删除列表中对应的第一个元素,若没有这个元素则不改变列表 |
同时对any
进行了大幅度重构,现在可以用any
类型实现类似弱类型语言的功能~