木兰语言的引用相关功能与问题新发现 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
xuanwu
V2EX    分享发现

木兰语言的引用相关功能与问题新发现

  •  
  •   xuanwu 2020-12-24 14:03:57 +08:00 885 次点击
    这是一个创建于 1786 天前的主题,其中的信息可能已经有所发展或是发生改变。

    上周继续改写 Python 文字冒险游戏 第十二章,期间发现个木兰编程语言在引用功能上的特别之处。

    起因是这样,在 世界.ul 中添加了随机敌人:

    type 敌人位置 : 地块 { func $敌人位置(x, y) { 随机 = random.random() if 随机 < 0.50 { $敌人 = ch12.敌人.大蜘蛛() $提示出现 = "一只大蜘蛛从它的网上跳到你面前!" $提示死亡 = "死蜘蛛的尸体在地上发臭。" } elif 随机 < 0.80 { $敌人 = ch12.敌人.食人魔() $提示出现 = "一个食人魔挡住了去路!" $提示死亡 = "食人魔倒地,胜利!" } elif 随机 < 0.95 { $敌人 = ch12.敌人.蝙蝠群() $提示出现 = "一阵尖锐的噪声逐渐变大……突然被一群蝙蝠团团包围!" $提示死亡 = "数十只死蝙蝠散落在地。" } else { $敌人 = ch12.敌人.石头怪() $提示出现 = "你惊醒了一只沉睡的石头怪!" $提示死亡 = "怪物被打败,变回了普通石头。" } super.__init__(x, y) } func $介绍 { return ($敌人.活着() ? $提示出现 : $提示死亡) + "\n" } func $影响(玩家) { if $敌人.活着() { 玩家.血量 = 玩家.血量 - $敌人.攻击 println("敌人造成{}点伤害,你还有{}点血。".format($敌人.攻击, 玩家.血量)) } } } 地图 = [ [nil, 取胜位置(1,0), nil], [nil, 敌人位置(1,1), nil], [敌人位置(0,2), 起始位置(1,2), 敌人位置(2,2)], [nil, 敌人位置(1,3), nil] ] 

    在原代码中,有两处引用此模块。结果发现两处得到的同一地点的敌人不同。用简化例子说明(更多测试见此 issue):

    ran.ul 为被引用模块:

    using random r = random.random() println("in ran: `r`") 

    m1.ul 引用 ran 中的 r:

    using * in ran println("in m1: `r`") 

    m2.ul 引用 m1 后引用了 ran:

    using * in m1 using * in ran println("in m2: `r`") 

    运行 木兰 m2.ul 输出如下:

    in ran: 0.14259277701409412 in m1: 0.14259277701409412 in ran: 0.7840393404568102 in m2: 0.7840393404568102 

    就是说,在 m1 和 m2 都引用了 ran 模块时,ran 模块被运行了两次,导致在两处的 r 值不同。同样行为在原始 ulang-0.2.2.exe 中复现。而类似例程在 Python 下,ran 模块仅被运行一次,m1 和 m2 的 r 输出值相同。

    虽然仍需深入研究,但至少现在看来木兰的如此引用规则意味着在多处引用同一模块时要特别注意。在上面的游戏例程中,是通过方法传参规避了一处引用,达到了同样游戏功能。

    另外,本周用现有测试集对木兰的 PyPI 发布版本进行了全面测试( Mac 和 win7 下),结果发现其中有一个 测试 /引用 /引用本地包内 py.ul 未通过(详见此处)。这是头次发觉 PyPI 发布版本与本地开发版的行为差别。作为参照物之一的 木兰演示版本 在 win7 下安装测试也有同样问题,仍需进一步调查。

    目前尚无回复
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2523 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 21ms UTC 01:05 PVG 09:05 LAX 17:05 JFK 20:05
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86