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 の伝統に従っていません。 *p
の代わりに、Pascal 構文p^
使用します。 *
文字はポインターに使用されなくなったため、Oberon と同様にエクスポート マークになり、プログラマは独自のスタイルに従って識別子に大文字/小文字を自由に使用できます。型アサーションには特別な構文はありません。これらはポインタ型のキャストのように見えます。クロージャ定義には、キャプチャされた変数の明示的なリストが必要です。
Umka は暗黙的な型キャストを許可し、関数宣言のデフォルト パラメーターをサポートします。 Go では意図的に省略された三項条件演算子が特徴です。個別のデータ型としてのスライスはありません。代わりに、Go のスライスのように宣言され、 make()
を呼び出すことによって初期化される動的配列をサポートします。メソッドのレシーバーはポインターである必要があります。 Umka のマルチスレッド モデルは、Go ではなく Lua と Wren からインスピレーションを得ています。ゴルーチンやチャネルの代わりにファイバーと呼ばれる軽量のスレッドを提供します。ガベージ コレクション メカニズムは参照カウントに基づいているため、Umka はweak
ポインターをサポートする必要があります。 Unicode の完全なサポートは開発中です。