开启辅助访问     
收藏本站

站内搜索

搜索

Minecraft(我的世界)苦力怕论坛

[展示] MCFPP开发日志——dict和map

 发表于 2025-2-16 18:44:49|显示全部楼层|阅读模式 IP:陕西省
本帖最后由 Alumopper 于 2025-2-16 18:43 编辑
芝士MCFPP
MCFPP是一个能被编译为Minecraft数据包的全新的面向对象的语言。它旨在以类似C系语言的语法,进行数据包的编写,并引入编程中常用的概念,从而使数据包的编写更加的便利。
项目官网:https://www.mcfpp.top
目前最新版本: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]索引访问字典中的内容。

函数名参数返回值作用
containsKeystring keybool判断字典中是否包含指定键
mergedict dictvoid合并两个字典
removestring keyvoid移除指定键的键值对
clear-void清空字典

以下是一个使用例

  1. namespace test;

  2. func main(){
  3.     dynamic dict<any> qwq = {
  4.         a:1,
  5.         b:"test",
  6.         c:[1,2,3]
  7.     };
  8.     print(qwq);
  9.     print((nbt)qwq["a"]);
  10.     qwq["d"] = {a:"b"};
  11.     print(qwq);
  12.     print(qwq.containsKey("a"));
  13.     print(qwq.containsKey("x"));
  14.     dict<any> pwp = {
  15.         e: 1,
  16.         f: 2,
  17.         g: 3
  18.     };
  19.     qwq.merge(pwp);
  20.     print(qwq);
  21.     qwq.remove("a");
  22.     print(qwq);
  23. }
复制代码

map<E>
map类型维护了一个键的列表。在map类型的数据中,有两个子成员,一个keys,即键列表,一个keyValueSet,也就是一个复合标签。换句话说,map类型是一个列表加一个字典。
map同样拥有一个泛型参数E,决定了map中能存的内容。
可以直接访问keys和keyValueSet两个成员。

函数名参数返回值作用
clearvoidvoid清空map
containsKeystring keybool判断map中是否包含指定键
isEmptyvoidbool判断map是否为空
removestring keyvoid移除指定键的键值对
mergemap<T> mapvoid合并两个map
sizevoidint获取map的大小

使用例:

  1. namespace test;

  2. func main(){
  3.     dynamic map<any> qwq = {
  4.         a:1,
  5.         b:"test",
  6.         c:[1,2,3]
  7.     };
  8.     print(qwq);
  9.     print((nbt)qwq["a"]);
  10.     qwq["d"] = {a:"b"};
  11.     print(qwq);
  12.     print(qwq.containsKey("a"));
  13.     print(qwq.containsKey("x"));
  14.     map<any> pwp = {
  15.         e: 1,
  16.         f: 2,
  17.         g: 3
  18.     };
  19.     qwq.merge(pwp);
  20.     print(qwq);
  21.     qwq.remove("a");
  22.     print(qwq);
  23. }
复制代码

编译结果:
test:main
  1. data modify storage mcfpp:system stack_frame prepend value {}
  2. #field: map<any> qwq = {a:1,b:"test",c:[1,2,3]}
  3. data modify storage mcfpp:system stack_frame[0].qwq.keys set value [a,b,c]
  4. data modify storage mcfpp:system stack_frame[0].qwq.keyValueSet set value {a:1,b:test,c:[1,2,3]}
  5. #expression: print(qwq)
  6. #print(qwq)
  7. tellraw @a {"type":"nbt","nbt":"stack_frame[0].qwq", "storage":"mcfpp:system","interpret":false}
  8. #expression end: print(qwq)
  9. #expression: print((nbt)qwq["a"])
  10. #print((nbt)qwq["a"])
  11. tellraw @a {"type":"nbt","nbt":"stack_frame[0].qwq.keyValueSet.a", "storage":"mcfpp:system","interpret":false}
  12. #expression end: print((nbt)qwq["a"])
  13. #expression: qwq["d"]={a:"b"}
  14. data modify storage mcfpp:system stack_frame[0].qwq.keyValueSet.d set value {a:b}
  15. data modify storage mcfpp:system stack_frame[0].qwq.keys append value d
  16. #expression end: qwq["d"]={a:"b"}
  17. #expression: print(qwq)
  18. #print(qwq)
  19. tellraw @a {"type":"nbt","nbt":"stack_frame[0].qwq", "storage":"mcfpp:system","interpret":false}
  20. #expression end: print(qwq)
  21. #expression: print(qwq.containsKey("a"))
  22. #print(qwq.containsKey("a"))
  23. #containsKey("a")
  24. execute store result score test_func_containsKey_return mcfpp_boolean if data storage mcfpp:system stack_frame[0].qwq.keyValueSet.a
  25. tellraw @a {"type":"score","score":{"name":"test_func_containsKey_return","objective":"mcfpp_boolean"}}
  26. #expression end: print(qwq.containsKey("a"))
  27. #expression: print(qwq.containsKey("x"))
  28. #print(qwq.containsKey("x"))
  29. #containsKey("x")
  30. execute store result score test_func_containsKey_return mcfpp_boolean if data storage mcfpp:system stack_frame[0].qwq.keyValueSet.x
  31. tellraw @a {"type":"score","score":{"name":"test_func_containsKey_return","objective":"mcfpp_boolean"}}
  32. #expression end: print(qwq.containsKey("x"))
  33. #field: map<any> pwp = {e:1,f:2,g:3}
  34. #expression: qwq.merge(pwp)
  35. #merge(pwp)
  36. data modify storage mcfpp:system stack_frame[0].pwp.keys set value [e,f,g]
  37. data modify storage mcfpp:system stack_frame[0].qwq.keys append from storage mcfpp:system stack_frame[0].pwp.keys[]
  38. data modify storage mcfpp:system stack_frame[0].qwq.keyValueSet merge value {e:1,f:2,g:3}
  39. #expression end: qwq.merge(pwp)
  40. #expression: print(qwq)
  41. #print(qwq)
  42. tellraw @a {"type":"nbt","nbt":"stack_frame[0].qwq", "storage":"mcfpp:system","interpret":false}
  43. #expression end: print(qwq)
  44. #expression: qwq.remove("a")
  45. #remove("a")
  46. data remove storage mcfpp:system stack_frame[0].qwq.keyValueSet.a
  47. data modify storage mcfpp:system list.element set value a
  48. scoreboard players set list.index mcfpp_temp 0
  49. execute store result score list.size mcfpp_temp run data get storage mcfpp:system list.list
  50. function mcfpp.lang:list/index_of
  51. execute unless score list_index mcfpp_temp matches -1 run function test:remove_temp_33
  52. #expression end: qwq.remove("a")
  53. #expression: print(qwq)
  54. #print(qwq)
  55. tellraw @a {"type":"nbt","nbt":"stack_frame[0].qwq", "storage":"mcfpp:system","interpret":false}
  56. #expression end: print(qwq)
  57. data remove storage mcfpp:system stack_frame[0]
复制代码

test:remove_temp_33
  1. execute store result storage mcfpp:system stack_frame[0].list_index int 1 run scoreboard players get list_index mcfpp_temp
  2. function mcfpp:dynamic/macro_34 with storage mcfpp:system stack_frame[0]
复制代码

mcfpp:dynamic/macro_34
  1. $data remove storage mcfpp:system stack_frame[0].qwq.keys[$(list_index)]
复制代码

结果:
ccaf933158cdfce00e5b3a8156fb08d5.png

然后然后

在写map.remove(E e)的时候,我们顺便给list加上了remove函数~

函数名参数返回值作用
removeE evoid删除列表中对应的第一个元素,若没有这个元素则不改变列表

同时对any进行了大幅度重构,现在可以用any类型实现类似弱类型语言的功能~

苦力怕论坛,感谢有您~

本版积分规则

本站
关于我们
联系我们
坛史纲要
官方
哔哩哔哩
技术博客
下载
网易版
安卓版
JAVA
反馈
意见建议
教程中心
更多
捐助本站
QQ群
QQ群

QQ群

访问手机版

访问手机版

手机版|小黑屋|系统状态|klpbbs.com

| 由 木韩网络 提供支持 | GMT+8, 2026-6-19 04:55

声明:本站与Mojang以及微软公司没有从属关系

Powered by Discuz! X3.4