MELP Dil Referansı

Kanonik kaynak: ORTAK/dil/ ve MELP_KANONİK/05_DIL_OZET.md  |  Durum: alfa  |  Güncelleme: Ağustos 2026

Bu sayfa derleyicinin bugün yaptığını belgeler, planlananı değil. Deneysel yapılar 🔬 ile işaretlidir. Burada yazan bir şeyi derleyici kabul etmiyorsa, bu sayfanın hatasıdır — lütfen bildirin.

Derleme Yolu

Bir .mlp dosyası LLVM IR'e, oradan da native binary'ye derlenir. Ortada bir yorumlayıcı ya da sonucun yanına kurulacak bir runtime yoktur.

# Çalıştır
bin/run_melp program.mlp

# LLVM IR görüntüle
bin/run_melp program.mlp --ir

# Native binary üret
bin/melp_compiler program.mlp -o program

Temel Kurallar

KuralDoğru ✅Yanlış ❌
Argüman ayracıfoo(a; b; c)foo(a, b, c)
Ondalık ayracı3,143.14
Yorum-- yorum// yorum
Blok kapanışıend function (boşluklu)end_function, }
Dönüş tipi öndenumeric function foo()function foo() -> numeric
Satır başına bir ifadex = 42x = 42;
Mantıksal operatörlerand, or, not&&, ||, !
Modulox mod yx % y
Metin birleştirmea & ba + b
Koleksiyonlist()[1; 2; 3] — kullanıcıya kapalı

Ondalık ayracı virgüldür; argüman ayracının noktalı virgül olmasının sebebi budur. Bu bir yerel ayar değil, bir dil kararıdır.

Anahtar kelimeler İngilizcedir. MELP'in tek bir anahtar kelime kümesi vardır. Dilin ilk yıllarındaki çok dilli anahtar kelime katmanı artık dil iddiasının parçası değildir — Kökenler bölümüne bakın.

Tipler

MELP'te üç değişken tipi vardır. null, void ve none YOKTUR.

TipTemsilNot
numerici64Varsayılan: ham i64, 18 basamağa kadar. Import'suz aşım E054 derleme hatasıdır.
stringi64 handleInline (≤7 byte) veya heap. Birleştirme & ile.
booleani1 / i64true = 1, false = 0.
numeric x     = 42
string  isim  = "MELP"
boolean hazir = true

-- İkinci numeric dünyası: dosya başına tercih
import bigdecimal
numeric pi    = 3,14159265358979323846
numeric tutar = 19,99

İki dünya. numeric varsayılan olarak ham i64'tür — tek CPU komutu, sıfır ek yük. Bir dosyada import bigdecimal yazıldığında o dosya, donanım taşma bayrağıyla otomatik büyük-sayı terfisi ve mantissa + ölçek olarak saklanan ondalık desteği kazanır (kayan nokta değil), böylece 0,1 + 0,2 tam olarak 0,3 eder. Ondalığı import'suz yazmak sessizce yanlış okunmaz — E055 hatası verir.

🔬 bigdecimal dünyası henüz korpus-kanıtlı değildir ve üretim için önerilmez. Varsayılan dünyada i64 taşması sessizce sarar — bilinçli bir bedeldir.

Değişkenler

Tip adı bildirimin kendisidirdim/var/let töreni yoktur ve tipleme tümüyle statiktir.

numeric sayac  = 10
string  dil    = "MELP"
boolean aktif  = true

-- Yeniden atama — tip anahtarı yok
sayac = sayac + 1
dil   = dil & " dili"

const anahtar kelime listesinden çıkarıldı; derleyici hâlâ tanıyabilir ama kanonik MELP değildir.

Operatörler

Aritmetik

x + y
x - y
x * y
x / y
x mod y     -- modulo (% değil)

Karşılaştırma

x == y
x != y
x < y
x > y
x <= y
x >= y

Mantıksal

x and y
x or y
not x

Metin Birleştirme

string tam = "Merhaba, " & isim & "!"

Birleştirme bugün O(n²)'dir; yüz binlerce birleştirme için sıkı bir birleştirme döngüsü yerine metni parça parça kurun.

Koşullar

if puan >= 90 then
    println("A")
else if puan >= 80 then
    println("B")
else
    println("C")
end if

then isteğe bağlıdır. else if tek satırda yazılır. Ternary operatör yoktur — değerlendirildi ve reddedildi.

Döngüler

Tek bir döngü yapısı vardır. while yok, for yok, continue yok — continue dilden kaldırıldı.

Koşullu döngü

numeric i = 0
loop i < 10
    println(i)
    i = i + 1
end loop

Sonsuz döngü ve çıkış

loop
    if bitti then exit end if
    isle()
end loop

Koleksiyon üzerinde

loop each n in sayilar
    println(n)
end loop

Fonksiyonlar

-- Dönüş tipi önde
numeric function topla(numeric a; numeric b)
    return a + b
end function

-- Giriş noktası
numeric function main()
    numeric sonuc = topla(3; 5)
    println(sonuc)
    return 0
end function

OK bir değerdir, tip değil. void yoktur: "bir şey döndürmeyen" fonksiyon OK döndürür ve bu ABI'de i64 taşınır. Tek istisna giriş noktasıdır: derleyicinin kabul ettiği biçim, açık return 0 ile birlikte numeric function main()'dir — derleyicinin kendi kaynağı da bunu kullanır.

return fonksiyondan değer döndürür; main içinde süreç çıkış kodunu belirler. exit farklıdır — bir scope'tan çıkar (döngü, if, match, isimli scope), fonksiyondan değil.

Scope'lar

Bellekte yer işgal eden her şey bir scope'tur. Bir değişkenin ömrü, içinde bulunduğu scope'un ömrüdür; scope kapanınca içindeki her şey temizlenir. Child, parent'ının değişkenine doğrudan yazamaz — scope sınırı izolasyon sınırıdır.

scope arama
    loop each i in satirlar
        loop each j in sutunlar
            if bul(i; j) then
                exit arama   -- iç içe döngüden temiz çıkış
            end if
        end loop
    end loop
end scope

Scope zaten canlıdır ve çağrılarak çalışır — sayac() her çağrıda yeni bir instance oluşturur. Scope sınırı boyunca paylaşım üç kontrollü kapıdan geçer:

tunnelpeekchannel
Ne taşır?Sahiplik (geçici velayet)Anlık kopyaMesaj kopyası
ErişimA↔B özelA→B tek yönlü, salt okunurÇok-çok, broadcast
KaynakAskıdaAktifBağımsız

🔬 tunnel ve peek parse ediliyor, doğrulanıyor ve kod üretiliyor ama şu an düz atamaya açılıyor; channel ise henüz FIFO kuyruk değil, düz bir global. Uyguladıkları izolasyon kuralları bugün gerçektir; daha zengin runtime semantiği değildir.

Struct, Enum, Match

Veri struct ile, davranış fonksiyonlarla tanımlanır. Class yok, kalıtım yok, virtual method yok. Struct bir ölü şablondur; new onu heap'te diriltir ve çağıran scope kapanınca ölür.

struct Nokta
    numeric x
    numeric y
end struct

Nokta p = Nokta(10; 20)
println(p.x)

-- Heap'te; çağıran scope kapanınca serbest bırakılır
Nokta q = new struct Nokta(30; 40)
enum Renk
    Kirmizi
    Yesil
    Mavi
end enum

Renk r = Renk.Mavi

match r
    case Renk.Kirmizi then println("kırmızı")
    case Renk.Yesil then println("yeşil")
    case Renk.Mavi then println("mavi")
end match

Enum değerleri çıplak yazılır — bildirimde case yoktur. case yalnız match içinde, enum adıyla nitelenmiş olarak görünür. 🔬 Payload taşıyan varyantlar dil spec'inde tarif edilir ama derleyicinin kabul ettiği biçim henüz yukarıdakidir.

Listeler

Koleksiyon tipi list()'tir. [...] dizi literali sözdizimi kullanıcıya kapalıdır.

-- .add() listeyi döndürür, bu yüzden yeniden atanır
isimler = isimler.add("Ali")
isimler = isimler.add("Can")

loop each n in isimler
    println(n)
end loop

🔬 Kullanıcıya dönük koleksiyon API'si hâlâ oturuyor. Yukarıdaki biçim derleyicinin kendi kaynağının kullandığı biçimdir; yüzeyi kararsız kabul edin ve güvenmeden önce MELP_LANGUAGE_SPEC.md'ye bakın. Algoritmik yığın/kuyruk ihtiyacı bugün liste üzerine elle kurulur.

Hata Yönetimi

Hata, doğduğu scope içinde çözülür ve dışarı taşmaz. Bugün kullanılan yapı expect bloğudur.

expect
    numeric sonuc = riskli_islem()
    println(sonuc)
end expect

Runtime'a tahmin bırakılmaz. Başka bir dilin makul bir yorum seçip devam edeceği yerde MELP açık bir hata koduyla durur. Eksik bir implementasyon exit 0 dönmek yerine gürültüyle patlamak zorundadır — sessiz yanlış, daha tehlikeli başarısızlık sayılır.

🔬 Result<T; E> tipi ve ? yayılım operatörü deneyseldir. try/catch/finally ve throw dilin parçası değildir.

debug Blokları

debug bloğu geleceğe bir mektuptur: kaydettiği varsayımı dünya aştığında programı durduran, koşan ve koşullu bir not.

debug
    if uye_sayisi > 10000 then stop
    -- Üye sayısı 10 bini geçince yeni bir veritabanı
    -- mimarisi gerekebilir. — 2026, ilk ekip
end debug

MELP_RELEASE=1 ile derlendiğinde debug blokları tamamen çıkarılır — üretim binary'sinde sıfır maliyet. Debug derlemesinde gdb ya da lldb ile her blokta durabilirsiniz.

Import ve FFI

import "hesaplar.mlp"     -- auto-declare
import bigdecimal         -- ikinci numeric dünyası

-- C ABI yabancı fonksiyon
external function write(numeric fd; string buf; numeric len)

Döngüsel import'lar derleme zamanında tespit edilir ve hata olarak raporlanır.

Dürüstlük satırı: external yazdığınız an bellek güvenliği garantisi biter — bu, MELP'in Rust unsafe'i karşılığıdır. Ayrıca MELP'in tedarik zinciri güvenliğine cevabı yoktur: import mekanizması emekleme aşamasında ve bir güven zinciri bulunmuyor.

Bilinçli Yokluklar

Bunlar uygulanmayı bekleyen özellikler değildir. Değerlendirildi ve reddedildiler; gerekçeler listenin kendisinden önemlidir.

MELP'te yokNeden
async, await, spawn, thread, coroutine, future, callbackİthal kalıplar. MELP'in yolu scope + channel + event-loop.
nullMilyar dolarlık hata. Ne null değeri ne null tipi vardır.
voidOK gerçek bir değerdir; "değer yok" diye adlandırılacak bir şey kalmıyor.
mutex, atomicMutasyon tek scope'ta tek noktada — korunacak bir şey yok.
Stack, Queue tipleriLIFO scope'un yaşam düzeni, FIFO channel'ın teslim düzenidir.
continueDilden kaldırıldı.
Class, kalıtım, virtual methodstruct + enum + match yeterli.
Ternary operatör, tupleDeğerlendirildi, reddedildi.
GC, borrow checker, &/lifetime anotasyonuÖmrü zaten scope sınırı belirler.

Öğretici

Dili sıfırdan denemek için adım adım rehber: 🚀 30 Dakikada MELP — kurulum, ilk program, değişkenler, dosya işlemleri, struct ve küçük bir web sunucusu örneği.

← Özelliklere Geri Dön 30 Dakikada MELP → Web IDE'de Deneyin →