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
| Kural | Doğru ✅ | Yanlış ❌ |
|---|---|---|
| Argüman ayracı | foo(a; b; c) | foo(a, b, c) |
| Ondalık ayracı | 3,14 | 3.14 |
| Yorum | -- yorum | // yorum |
| Blok kapanışı | end function (boşluklu) | end_function, } |
| Dönüş tipi önde | numeric function foo() | function foo() -> numeric |
| Satır başına bir ifade | x = 42 | x = 42; |
| Mantıksal operatörler | and, or, not | &&, ||, ! |
| Modulo | x mod y | x % y |
| Metin birleştirme | a & b | a + b |
| Koleksiyon | list() | [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.
| Tip | Temsil | Not |
|---|---|---|
numeric | i64 | Varsayılan: ham i64, 18 basamağa kadar. Import'suz aşım E054 derleme hatasıdır. |
string | i64 handle | Inline (≤7 byte) veya heap. Birleştirme & ile. |
boolean | i1 / i64 | true = 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 kendisidir —
dim/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:
tunnel | peek | channel | |
|---|---|---|---|
| Ne taşır? | Sahiplik (geçici velayet) | Anlık kopya | Mesaj kopyası |
| Erişim | A↔B özel | A→B tek yönlü, salt okunur | Çok-çok, broadcast |
| Kaynak | Askıda | Aktif | Bağı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 yok | Neden |
|---|---|
async, await, spawn, thread, coroutine, future, callback | İthal kalıplar. MELP'in yolu scope + channel + event-loop. |
null | Milyar dolarlık hata. Ne null değeri ne null tipi vardır. |
void | OK gerçek bir değerdir; "değer yok" diye adlandırılacak bir şey kalmıyor. |
mutex, atomic | Mutasyon tek scope'ta tek noktada — korunacak bir şey yok. |
Stack, Queue tipleri | LIFO scope'un yaşam düzeni, FIFO channel'ın teslim düzenidir. |
continue | Dilden kaldırıldı. |
| Class, kalıtım, virtual method | struct + enum + match yeterli. |
| Ternary operatör, tuple | Değ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.