仓库源文

刚到手《Make Your Own Python Text Adventure: A Guide to Learning Programming》一书,打算将它的例程用木兰语言重写并改为中文标识符。一方面看看已重现的木兰功能对新手入门教程是否足够,顺便对之前小结的木兰与 Python 的语法对比进行补充。下面代码在木兰发布版本 0.0.15.0 运行通过。

该书三四五六章分别介绍用户输入、条件语句、函数、列表,直接跳到第七章:循环,因为例程包含了前几章的技术:

func 玩 {
  库存 = ['匕首','金币(5)','面包棍']
  println("逃出生天!")
  loop {
    输入 = 获取命令()
    if ['n', 'N'].__contains__(输入) {
      println("往北!")
    } elif ['s', 'S'].__contains__(输入) {
      println("往南!")
    } elif ['e', 'E'].__contains__(输入) {
      println("往东!")
    } elif ['w', 'W'].__contains__(输入) {
      println("往西!")
    } elif ['i', 'I'].__contains__(输入) {
      println("库存:")
      for 家伙 in 库存 {
        println('* ' + str(家伙))
      }
    } else {
      println("不懂!")
    }
  }
}

func 获取命令 {
  return input('行动:')
}


玩()

比较大的不适是不支持 Python 元素 in 列表 的判断语法,这里用 __contains__ 代替,尚待确认是否有更简便的木兰语法没发现。

可以用 ....< 代替 Python 中的 range:

for 数 in 1..<11 {
    因数 = []
    for 除数 in 1..数 {
        因数.append(除数) if 数 % 除数 == 0
    }
    println("`数`的因数:" + str(因数))
}

第八章:类型和个体

type 人 {
    func $人(名称, 年龄, 爱吃的) {
        $名称 = 名称
        $年龄 = 年龄
        $爱吃的 = 爱吃的
    }

    func $出生年份 {
        return 2015 - $年龄
    }

    func $__str__ {
        return "姓名:{} 年龄:{} 爱吃的:{}".format(
            $名称, $年龄, $爱吃的[0])
    }
}

各人 = [人("Ed", 11, ["hotdogs", "jawbreakers"])
    , 人("Edd", 11, ["broccoli"])
    , 人("Eddy", 12, ["chunky puffs", "jawbreakers"])]

年龄和 = 0
年份和 = 0
for 某人 in 各人 {
    年龄和 = 年龄和 + 某人.年龄
    年份和 = 年份和 + 某人.出生年份()
}

println("平均年龄:" + str((年龄和 + 0.0) / len(各人)))
println("平均出生年份:" + str(int(年份和 / len(各人))))

println("普查中的人:")
for 某人 in 各人 {
    println(某人)
}

第九章、异常,需要木兰的 try...catch 语法,打算在 gitee 项目重现该语法后继续本系列。