Умка — это статически типизированный встраиваемый язык сценариев. Он сочетает в себе простоту и гибкость, необходимые для написания сценариев, с защитой от ошибок типов во время компиляции. Его цель — следовать принципу Python Zen. Явное лучше, чем неявное, и более последовательно, чем обычно это делают динамически типизированные языки.
Умножение матрицы 400 x 400 (AMD A4-3300M @ 1,9 ГГц, 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 — это язык сценариев с облегченным интерпретатором, который можно легко встроить в любое приложение в виде общей библиотеки.
Умка синтаксически очень похожа на Го. Однако в некоторых аспектах все по-другому. Ключевые слова короче: fn
для func
, str
для string
, in
для range
. Для лучшей читаемости между именами переменных и типами в объявлениях требуется :
. Он не следует неудачной традиции C по разыменованию указателей. Вместо *p
используется синтаксис Паскаля p^
. Поскольку символ *
больше не используется для указателей, он становится знаком экспорта, как в Обероне, так что программист может свободно использовать прописные/строчные буквы в идентификаторах в соответствии со своим стилем. Утверждения типа не имеют специального синтаксиса; они выглядят как приведения типов указателей. Определения замыканий требуют явных списков захваченных переменных.
Умка допускает неявное приведение типов и поддерживает параметры по умолчанию в объявлениях функций. В нем присутствует троичный условный оператор, намеренно опущенный в Go. У него нет срезов как отдельных типов данных. Вместо этого он поддерживает динамические массивы, которые объявляются как срезы Go и инициализируются вызовом make()
. Получатели методов должны быть указателями. Модель многопоточности в Умке вдохновлена Lua и Wren, а не Go. Он предлагает легкие потоки, называемые волокнами, вместо горутин и каналов. Механизм сборки мусора основан на подсчете ссылок, поэтому Умке необходимо поддерживать weak
указатели. Полная поддержка Unicode находится в стадии разработки.