Umka adalah bahasa skrip yang dapat disematkan yang diketik secara statis. Ini menggabungkan kesederhanaan dan fleksibilitas yang diperlukan untuk pembuatan skrip dengan perlindungan waktu kompilasi terhadap kesalahan ketik. Tujuannya adalah untuk mengikuti prinsip Python Zen Eksplisit lebih baik daripada implisit secara lebih konsisten daripada bahasa yang diketik secara dinamis pada umumnya.
Perkalian matriks 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)
}
}
Meskipun Go adalah bahasa pemrograman sistem yang dikompilasi dengan pustaka runtime yang kompleks dan binari keluaran yang besar, Umka adalah bahasa skrip dengan penerjemah ringan yang dapat dengan mudah ditanamkan ke dalam aplikasi apa pun sebagai pustaka bersama.
Umka sangat mirip dengan Go secara sintaksis. Namun dalam beberapa aspek berbeda. Ini memiliki kata kunci yang lebih pendek: fn
untuk func
, str
untuk string
, in
untuk range
. Untuk keterbacaan yang lebih baik, diperlukan :
antara nama variabel dan tipe dalam deklarasi. Itu tidak mengikuti tradisi dereferensi penunjuk C yang disayangkan. Alih-alih *p
, ia menggunakan sintaks Pascal p^
. Karena karakter *
tidak lagi digunakan untuk pointer, maka karakter tersebut menjadi tanda ekspor, seperti di Oberon, sehingga seorang programmer dapat dengan bebas menggunakan huruf besar/kecil dalam pengidentifikasi sesuai dengan gayanya sendiri. Pernyataan tipe tidak memiliki sintaksis khusus; mereka terlihat seperti gips tipe penunjuk. Definisi penutupan memerlukan daftar variabel yang ditangkap secara eksplisit.
Umka mengizinkan pemeran tipe implisit dan mendukung parameter default dalam deklarasi fungsi. Ini menampilkan operator kondisional ternary yang sengaja dihilangkan dari Go. Itu tidak memiliki irisan sebagai tipe data terpisah. Sebaliknya, ia mendukung array dinamis, yang dideklarasikan seperti irisan Go dan diinisialisasi dengan memanggil make()
. Penerima metode harus berupa penunjuk. Model multithreading di Umka terinspirasi oleh Lua dan Wren, bukan Go. Ia menawarkan benang ringan yang disebut serat, bukan goroutine dan saluran. Mekanisme pengumpulan sampah didasarkan pada penghitungan referensi, sehingga Umka perlu mendukung petunjuk weak
. Dukungan penuh Unicode sedang dalam pengembangan.