umka lang
Umka 1.5
Umka 是一种静态类型的嵌入式脚本语言。它将脚本编写所需的简单性和灵活性与针对类型错误的编译时保护结合起来。其目标是遵循 Python Zen 原则“显式优于隐式”,比动态类型语言通常更一致。
400 x 400 矩阵乘法(AMD A4-3300M @ 1.9 GHz,Windows 7)
fn main() {
printf("Hello Umka!n")
}
const a = 3
const b* = 2.38 // Exported identifier
const (
c = sin(b) / 5
d = "Hello" + " World"
)
type IntPtr = ^uint16 // Pointer
type Arr = [a]real // Array
type (
DynArr = [][5]int // Dynamic array
String = str // String
Button = enum { // Enumeration
left
middle
right
}
MyMap = map[str]real // Map
Quat = struct { // Structure
q: [4]real
normalized: bool
}
Printable = interface { // Interface
print(): int
}
ErrFn = fn(code: int) // Function
)
var e: int
var f: String = d + "!"
var (
g: Arr = [3]real{2.3, -4.1 / 2, b}
h: DynArr
m: MyMap
)
q := Quat{q: [4]real{1, 0, 0, 0}, normalized: true}
fn tan(x: real): real {return sin(x) / cos(x)}
fn getValue(): (int, bool) {return 42, true}
fn (a: ^Arr) print(): int {
printf("Arr: %vn", a^)
return 0
}
h = make([][5]int, 3) // Dynamic arrays and maps are initialized with make()
m = make(MyMap)
m["Hello Umka"] = 3.14
sum := 0.0
y := tan(30 * std::pi / 180)
h = append(h, [5]int{10, 20, 30, 40, 50})
h = delete(h, 1)
g.print()
if x, ok := getValue(); ok {
printf("Got %vn", x)
}
switch a {
case 1, 3, 5, 7: std::println(std::itoa(a) + " is odd")
case 2, 4, 6, 8: std::println(std::itoa(a) + " is even")
default: std::println("I don't know")
}
switch v := type(a) {
case int: printf("int: %d + 5 = %dn", v, v + 5)
case str: printf("str: %s + 5 = %sn", v, v + "5")
default: printf("unknown: %vn", a)
}
for k := 1; k <= 128; k *= 2 {
printf("%vn", k)
}
for i, x in g {
if fabs(x) > 1e12 {break}
if x < 0 {continue}
sum += x
}
a := new(int)
child := make(fiber, |a| {
for i := 0; i < 5; i++ {
std::println("Child : i=" + std::itoa(i) + " buf=" + std::itoa(a^))
a^ = i * 3
resume()
}
})
for i := 0; i < 10; i++ {
std::println("Parent: i=" + std::itoa(i) + " buf=" + std::itoa(a^))
a^ = i * 7
if valid(child) {
resume(child)
}
}
Go 是一种编译系统编程语言,具有复杂的运行时库和大型输出二进制文件,而 Umka 是一种具有轻量级解释器的脚本语言,可以作为共享库轻松嵌入到任何应用程序中。
Umka 在语法上与 Go 非常相似。然而,在某些方面又有所不同。它有更短的关键字: fn
代表func
, str
代表string
, in
代表range
。为了更好的可读性,声明中的变量名和类型之间需要一个:
。它没有遵循不幸的 C 指针取消引用传统。它使用 Pascal 语法p^
代替*p
。由于*
字符不再用于指针,它成为导出标记,就像 Oberon 一样,以便程序员可以根据自己的风格在标识符中自由使用大小写字母。类型断言没有任何特殊的语法;它们看起来像指针类型转换。闭包定义需要捕获变量的显式列表。
Umka 允许隐式类型转换并支持函数声明中的默认参数。它具有 Go 中故意省略的三元条件运算符。它没有切片作为单独的数据类型。相反,它支持动态数组,这些数组像 Go 的切片一样声明并通过调用make()
进行初始化。方法接收者必须是指针。 Umka 中的多线程模型的灵感来自 Lua 和 Wren,而不是 Go。它提供了称为纤维的轻量级线程,而不是 goroutine 和通道。垃圾收集机制是基于引用计数的,因此Umka需要支持weak
指针。完整的 Unicode 支持正在开发中。