仓库源文

【安装:pip install ulang,用法与例程请见 PyPI。源码位于开源中国注意:必需 python 3.7,源码文件需 UTF-8 编码

2022年小结

去年,七月发布 0.0.22 版之后项目静默了一段时间。今年一月末开始 悬赏任务又开始大步推进。重现功能量较大,因此发布大版本。

感激所有参与者的合作、耐心和探究精神!

此版本重现功能

按各悬赏任务的完成先后顺序逐个介绍。

更多增量运算

早先完成了 += -=,现已完成余下的 *= ^= |= &= /= %= 等:

> a = 10
> a %= 4
> a
2

木兰源码转换为 Python

现在 --dump-python 命令行选项可以将木兰源码转换为 Python 源码:

> 木兰 --dump-python 测试\算法\排序\冒泡.ul
import sys
from math import *
ARGV = sys.argv[1:]
def 冒泡(数列):
  换过 = True
  while 换过:
    换过 = False
    for i in range(0, len(数列) - 2 + 1):
      前项 = 数列[i]
      后项 = 数列[i + 1]
      if (前项 > 后项):
        (数列[i], 数列[i + 1]) = (后项, 前项)
        换过 = True
打乱数列 = [5, 2, 1, 8, 4]
冒泡(打乱数列)
print(打乱数列)

匿名函数支持多参数与无参数

以及注解参数类型

> 体积 = (长:int, 宽:int, 高:int) -> 长*宽*高
print(体积(2, 3, 4))
24
> a = () -> 3
print(a())
3

期间发现第一个形参 不支持默认值,不解原因。

函数支持若干形参(点点点)

包括普通函数

>func 哈(...) {{
    __varargs__ = tuple('ha', 'ha')
    print(...)
}
哈(2, 3, 3, 3)
hah

和匿名函数

>b = (...) -> max(...))
print(b(3, 1, 2))
3

以下是十月末之后完成的。

.. 作为模块路径

详见此 pr

using * in ..

func talk() {
    module_py.talk('..')
}

更多超类语法,但运行报错,不明用意

见最后两行示例。运行有报错,与原始木兰行为相同,因而仅添加了语法树测试。详见 此pr

type Person : list {
  func $Person {
    super.__init__()
  }
}
p = Person()
v = p.super
Person.super(None)

在类型内定义类型

type Animal {
    type Child {
        func $Child(name) {
            $name = name
        }
    }
    func getChildName() {
        c = Animal.Child('Animal.Child').name
        return c
    }
}

p = Animal()
print(p.getChildName())

十六进制数字

> n = 12 + 0x1F + 0X1a + 0xab + 0XCD
print(n)
445

但格式有误时报错比较费解:

> print(0xg)
 😰 请先定义‘xg’再使用,见第1行

应该是木兰支持 乘法省略乘号 的副作用。

(语义待确定)复杂类型注解

详见 此pr,语法上支持嵌套的类型注解,但不知用意和建议用法为何。

func hello(a : tuple [ int ]) : int [ float, list [ str ], dict ] {
  print(a)
}
a : list [ int ] = 2

补全 try ... catch ... finally

try f=open('__init__.py', 'r') {
  print(len(f.read()))
  print([][int('0')])
} catch e : ValueError {
  print('v')
} catch e : IndexError {
  print('i')
} finally {
  print('f')
}

重载余下所有操作符,包括二元、一元等

包括下例的 26 个操作符,详见 此文档

type P : str {
    operator + (a) {
        return str(self) + str(a) + '啊'
    }

    {}
}
a = P("你")
b = P("好")
print(a+b)  // 输出“你好啊”

其他维护