Sundawi Programming Language - VSCode Extension
🌟 Tentang Sundawi
Sundawi adalah bahasa pemrograman modern yang menggunakan bahasa Sunda sebagai sintaks, dirancang untuk membuat coding lebih mudah dipahami oleh penutur bahasa Sunda. Sundawi di-transpile ke JavaScript, sehingga kompatibel dengan ekosistem JavaScript yang luas.
🚀 Quick Start
1. Buat File Sundawi Pertama
Cara A: Menggunakan Command Palette
- Tekan Ctrl+Shift+P/Cmd+Shift+P
- Ketik Sundawi: Gawe File Anyar
- Masukkan nama file: halo.sundawi
Cara B: Manual
- Buat file baru
- Simpan dengan ekstensi .sundawiatau.sw
2. Tulis Kode Pertama Anda
// Program pertama - Halo Dunya!
gawe main() {
    tulis('Wilujeng sumping di Sundawi! 🎉')
    tulis('Ieu program Sundawi munggaran abdi')
}
main()
3. Jalankan Program
# Transpile ke JavaScript
sundawi-compile halo.sundawi
# Jalankan hasil transpile
node halo.js
1. Variabel & Tipe Data
Deklarasi Variabel
// hayu - variabel yang bisa diubah (seperti let)
hayu ngaran = 'Asep'
hayu umur = 25
umur = 26  // bisa diubah
// tetep - konstanta (seperti const)
tetep PI = 3.14159
tetep KOTA = 'Bandung'
// PI = 3.14  // ERROR! tidak bisa diubah
// robah - variabel global/function scope (seperti var)
robah jumlah = 100
Tipe Data
// angka - Number
hayu harga = 50000
hayu diskon = 0.15
hayu negatif = -100
// téks - String
hayu salam = "Wilujeng enjing"
hayu alamat = 'Jl. Asia Afrika No. 8'
hayu template = `Nami abdi ${ngaran}, umur ${umur} taun`
// boole - Boolean
hayu sudahNikah = salah  // false
hayu aktif = bener       // true
// kosong - null
hayu data = kosong
// teu_ditetepkeun - undefined
hayu belumDiisi = teu_ditetepkeun
// daptar - Array
hayu buah = ['Mangga', 'Jambu', 'Nanas']
// objék - Object
hayu jalma = {
    ngaran: 'Ujang',
    umur: 30,
    kota: 'Bandung'
}
2. Operator
Operator Aritmatika
hayu a = 10
hayu b = 3
tulis(a + b)   // 13 - Tambah
tulis(a - b)   // 7  - Kurang
tulis(a * b)   // 30 - Kali
tulis(a / b)   // 3.333... - Bagi
tulis(a % b)   // 1  - Modulus (sisa bagi)
tulis(a ** b)  // 1000 - Pangkat
Operator Perbandingan
hayu x = 5
hayu y = 10
tulis(x == y)   // salah - sama dengan
tulis(x != y)   // bener - tidak sama dengan
tulis(x < y)    // bener - kurang dari
tulis(x > y)    // salah - lebih dari
tulis(x <= y)   // bener - kurang dari atau sama dengan
tulis(x >= y)   // salah - lebih dari atau sama dengan
Operator Logika
hayu benar1 = bener
hayu benar2 = bener
hayu salah1 = salah
// jeung - AND (&&)
tulis(benar1 jeung benar2)  // bener
tulis(benar1 jeung salah1)  // salah
// atawa - OR (||)
tulis(benar1 atawa salah1)  // bener
tulis(salah1 atawa salah1)  // salah
// lain - NOT (!)
tulis(lain benar1)  // salah
tulis(lain salah1)  // bener
3. Kontrol Flow
Pernyataan Lamun (If)
hayu umur = 20
// lamun - if
lamun umur >= 17 {
    tulis('Anjeun geus dewasa')
}
// lamun...atawa - if...else
lamun umur >= 17 {
    tulis('Geus dewasa')
} atawa {
    tulis('Keneh budak')
}
// lamun...tapi_lamun...atawa - if...else if...else
lamun umur >= 60 {
    tulis('Sepuh')
} tapi_lamun umur >= 17 {
    tulis('Dewasa')
} tapi_lamun umur >= 13 {
    tulis('Rumaja')
} atawa {
    tulis('Budak')
}
Pilih (Switch)
hayu poé = 'Senén'
pilih poé {
    kasus 'Senén':
        tulis('Mimiti minggu')
        tepi
    
    kasus 'Jumaah':
        tulis('Poé terakhir gawé')
        tepi
    
    kasus 'Saptu':
    kasus 'Minggu':
        tulis('Libur!')
        tepi
    
    baku:
        tulis('Poé biasa')
}
Loop Bari (While)
hayu i = 1
// bari - while
bari i <= 5 {
    tulis(`Angka: ${i}`)
    i++
}
// ulang...bari - do...while
hayu j = 1
ulang {
    tulis(`Angka: ${j}`)
    j++
} bari j <= 5
Loop Pikeun (For)
// pikeun - for loop
pikeun hayu i = 1; i <= 5; i++ {
    tulis(`Iterasi ka-${i}`)
}
// pikeun...dina - for...in (iterasi object keys)
hayu jalma = { ngaran: 'Asep', umur: 25 }
pikeun hayu kunci dina jalma {
    tulis(`${kunci}: ${jalma[kunci]}`)
}
// unggal - forEach (iterasi array)
hayu buah = ['Mangga', 'Jambu', 'Nanas']
unggal buah jadi item {
    tulis(item)
}
// tepi - break
pikeun hayu i = 1; i <= 10; i++ {
    lamun i == 5 {
        tepi  // Stop loop
    }
    tulis(i)
}
// tuluyen - continue
pikeun hayu i = 1; i <= 5; i++ {
    lamun i == 3 {
        tuluyen  // Skip iterasi ini
    }
    tulis(i)
}
4. Fungsi
Fungsi Dasar
// gawe - function
gawe salam(ngaran) {
    tulis(`Wilujeng sumping, ${ngaran}!`)
}
salam('Asep')  // Output: Wilujeng sumping, Asep!
// mulangkeun - return
gawe tambah(a, b) {
    mulangkeun a + b
}
hayu hasil = tambah(5, 3)
tulis(hasil)  // Output: 8
Default Parameters
gawe sapa(ngaran = 'Dulur') {
    mulangkeun `Kumaha damang, ${ngaran}?`
}
tulis(sapa())        // Kumaha damang, Dulur?
tulis(sapa('Ujang')) // Kumaha damang, Ujang?
Arrow Function
// Arrow function
tetep kali = (a, b) => a * b
tulis(kali(4, 5))  // 20
// Dengan body
tetep cekGanjil = (angka) => {
    lamun angka % 2 == 1 {
        mulangkeun bener
    }
    mulangkeun salah
}
Rest Parameters
gawe jumlahkan(...angka) {
    hayu total = 0
    unggal angka jadi num {
        total += num
    }
    mulangkeun total
}
tulis(jumlahkan(1, 2, 3, 4, 5))  // 15
5. Array & Object
Array Methods
hayu angka = [1, 2, 3, 4, 5]
// peta - map
hayu ganda = angka.peta(x => x * 2)
tulis(ganda)  // [2, 4, 6, 8, 10]
// saring - filter
hayu genap = angka.saring(x => x % 2 == 0)
tulis(genap)  // [2, 4]
// kurangi - reduce
hayu jumlah = angka.kurangi((acc, val) => acc + val, 0)
tulis(jumlah)  // 15
// panjangna - length
tulis(angka.panjangna)  // 5
// push & pop
angka.push(6)        // Tambah di akhir
hayu terakhir = angka.pop()  // Hapus dari akhir
// shift & unshift
angka.unshift(0)     // Tambah di awal
hayu pertama = angka.shift() // Hapus dari awal
Object Manipulation
hayu jalma = {
    ngaran: 'Asep Sunandar',
    umur: 25,
    kota: 'Bandung',
    hobi: ['maca', 'nulis', 'ngoding']
}
// Akses property
tulis(jalma.ngaran)     // Asep Sunandar
tulis(jalma['umur'])    // 25
// Tambah property
jalma.email = 'asep@example.com'
// Hapus property
hapus jalma.hobi
// Object destructuring
hayu { ngaran, umur } = jalma
tulis(ngaran)  // Asep Sunandar
// Object.keys(), Object.values(), Object.entries()
tulis(Object.keys(jalma))    // ['ngaran', 'umur', 'kota', 'email']
tulis(Object.values(jalma))  // ['Asep Sunandar', 25, 'Bandung', ...]
6. Class & OOP
Membuat Class
// kelas - class
kelas Jalma {
    // Constructor
    gawe constructor(ngaran, umur) {
        ieu.ngaran = ngaran  // ieu - this
        ieu.umur = umur
    }
    
    // Method
    gawe kenalkeun() {
        tulis(`Nami abdi ${ieu.ngaran}, umur ${ieu.umur} taun`)
    }
    
    // Getter
    get info() {
        mulangkeun `${ieu.ngaran} (${ieu.umur})`
    }
    
    // Setter
    set umuranjeun(nilai) {
        lamun nilai > 0 {
            ieu.umur = nilai
        }
    }
    
    // Static method
    gawe statik buatRandom() {
        mulangkeun anyar Jalma('Random', 20)
    }
}
// anyar - new
hayu jalma1 = anyar Jalma('Asep', 25)
jalma1.kenalkeun()  // Nami abdi Asep, umur 25 taun
tulis(jalma1.info)  // Asep (25)
jalma1.umuranjeun = 26
hayu jalmaRandom = Jalma.buatRandom()
Inheritance (Warisan)
// warisan - extends
kelas Mahasiswa warisan Jalma {
    gawe constructor(ngaran, umur, npm) {
        indung(ngaran, umur)  // indung - super
        ieu.npm = npm
    }
    
    // Override method
    gawe kenalkeun() {
        indung.kenalkeun()  // Panggil method parent
        tulis(`NPM: ${ieu.npm}`)
    }
    
    gawe belajar() {
        tulis(`${ieu.ngaran} keur diajar`)
    }
}
hayu mhs = anyar Mahasiswa('Ujang', 20, '1234567890')
mhs.kenalkeun()
// Output:
// Nami abdi Ujang, umur 20 taun
// NPM: 1234567890
mhs.belajar()  // Ujang keur diajar
Access Modifiers
kelas Akun {
    // umum - public (default)
    umum ngaran
    
    // pribadi - private
    pribadi sandi
    
    // ditangtayungan - protected
    ditangtayungan saldo
    
    gawe constructor(ngaran, sandi) {
        ieu.ngaran = ngaran
        ieu.sandi = sandi
        ieu.saldo = 0
    }
    
    gawe pribadi cekSandi(input) {
        mulangkeun input == ieu.sandi
    }
    
    gawe login(sandi) {
        lamun ieu.cekSandi(sandi) {
            tulis('Login sukses!')
            mulangkeun bener
        }
        tulis('Sandi salah!')
        mulangkeun salah
    }
}
7. Async/Await
Promise Dasar
// jangjian - promise
gawe ambilData() {
    mulangkeun anyar Jangjian((resolve, reject) => {
        // Simulasi API call
        setTimeout(() => {
            hayu sukses = bener
            lamun sukses {
                resolve({ data: 'Hasil API' })
            } atawa {
                reject('Gagal ambil data')
            }
        }, 1000)
    })
}
// Pakai .then() dan .catch()
ambilData()
    .then(hasil => {
        tulis('Sukses:', hasil.data)
    })
    .catch(kasalahan => {
        tulis('Error:', kasalahan)
    })
Async/Await
// async - async function
gawe async ambilPamaké(id) {
    coba {
        // antosan - await
        hayu respon = antosan ambil(`https://api.example.com/users/${id}`)
        hayu data = antosan respon.json()
        mulangkeun data
    } cekel (kasalahan) {
        tulis('Kasalahan:', kasalahan)
        buang kasalahan
    }
}
// Pakai async function
gawe async main() {
    hayu pamaé = antosan ambilPamaé(1)
    tulis(pamaé)
}
main()
Multiple Promises
gawe async ambilBanyakData() {
    coba {
        // Promise.all - tunggu semua selesai
        hayu [users, posts, comments] = antosan Jangjian.kabeh([
            ambil('/api/users'),
            ambil('/api/posts'),
            ambil('/api/comments')
        ])
        
        tulis('Sadaya data rengse!')
        
    } cekel (kasalahan) {
        tulis('Aya nu gagal:', kasalahan)
    }
}
// Promise.race - ambil yang pertama selesai
gawe async lomba() {
    hayu winner = antosan Jangjian.lomba([
        ambil('/api/server1'),
        ambil('/api/server2'),
        ambil('/api/server3')
    ])
    tulis('Meunang:', winner)
}
8. Module System
Export & Import
file: utils.sundawi
// Export individual
ékspor gawe tambah(a, b) {
    mulangkeun a + b
}
ékspor gawe kurang(a, b) {
    mulangkeun a - b
}
ékspor tetep PI = 3.14159
// Export default
gawe kali(a, b) {
    mulangkeun a * b
}
ékspor baku kali
file: main.sundawi
// Import named exports
asupkeun { tambah, kurang, PI } ti './utils.sundawi'
tulis(tambah(5, 3))  // 8
tulis(PI)            // 3.14159
// Import default
asupkeun kali ti './utils.sundawi'
tulis(kali(4, 5))    // 20
// Import semua
asupkeun * jadi Utils ti './utils.sundawi'
tulis(Utils.tambah(10, 5))  // 15
// Import dengan alias
asupkeun { tambah jadi add } ti './utils.sundawi'
tulis(add(2, 3))  // 5
Export Object & Class
file: models.sundawi
ékspor kelas Pamaé {
    gawe constructor(ngaran) {
        ieu.ngaran = ngaran
    }
}
ékspor kelas Produk {
    gawe constructor(ngaran, harga) {
        ieu.ngaran = ngaran
        ieu.harga = harga
    }
}
file: app.sundawi
asupkeun { Pamaé, Produk } ti './models.sundawi'
hayu user = anyar Pamaé('Asep')
hayu item = anyar Produk('Laptop', 5000000)
9. Error Handling
Try-Catch-Finally
gawe bagi(a, b) {
    // coba - try
    coba {
        lamun b == 0 {
            // buang - throw
            buang anyar Kasalahan('Teu bisa bagi ku nol!')
        }
        mulangkeun a / b
        
    // cekel - catch
    } cekel (kasalahan) {
        tulis('Error:', kasalahan.message)
        mulangkeun kosong
        
    // pamustunganana - finally
    } pamustunganana {
        tulis('Operasi rengse')
    }
}
hayu hasil = bagi(10, 0)
// Output:
// Error: Teu bisa bagi ku nol!
// Operasi rengse
Custom Error Class
kelas KasalahanValidasi warisan Kasalahan {
    gawe constructor(pesen) {
        indung(pesen)
        ieu.ngaran = 'KasalahanValidasi'
    }
}
gawe validasiUmur(umur) {
    coba {
        lamun umur < 0 {
            buang anyar KasalahanValidasi('Umur teu tiasa negatif!')
        }
        lamun umur > 150 {
            buang anyar KasalahanValidasi('Umur teu wajar!')
        }
        tulis('Umur valid:', umur)
        
    } cekel (err) {
        lamun err.ngaran == 'KasalahanValidasi' {
            tulis('Validasi gagal:', err.message)
        } atawa {
            tulis('Error teu dipikawanoh:', err)
        }
    }
}
validasiUmur(-5)   // Validasi gagal: Umur teu tiasa negatif!
validasiUmur(200)  // Validasi gagal: Umur teu wajar!
validasiUmur(25)   // Umur valid: 25
10. DOM Manipulation
Selecting Elements
// pilih - querySelector
hayu judul = pilih('#judul')
hayu tombol = pilih('.tombol-utama')
// pilihSadaya - querySelectorAll
hayu paragraf = pilihSadaya('p')
hayu items = pilihSadaya('.item')
// Akses element properties
tulis(judul.textContent)
tulis(tombol.innerHTML)
Event Listeners
// dengekeun - addEventListener
hayu tombol = pilih('#tombol-klik')
tombol.dengekeun('klik', (e) => {
    tulis('Tombol diklik!')
    tulis('Event:', e)
})
// Multiple events
hayu input = pilih('#input-ngaran')
input.dengekeun('focus', () => {
    tulis('Input di-focus')
})
input.dengekeun('blur', () => {
    tulis('Input blur')
})
input.dengekeun('input', (e) => {
    tulis('Nilai:', e.target.value)
})
Manipulating Elements
// Mengubah konten
hayu kotak = pilih('.kotak')
kotak.textContent = 'Teks anyar'
kotak.innerHTML = '<strong>Teks bold</strong>'
// Mengubah style
kotak.style.backgroundColor = 'blue'
kotak.style.color = 'white'
kotak.style.padding = '20px'
// Mengubah class
kotak.classList.add('aktif')
kotak.classList.remove('nonaktif')
kotak.classList.toggle('highlight')
lamun kotak.classList.contains('aktif') {
    tulis('Kotak aktif')
}
// Mengubah attributes
hayu gambar = pilih('img')
gambar.setAttribute('src', 'foto-baru.jpg')
gambar.setAttribute('alt', 'Deskripsi gambar')
hayu src = gambar.getAttribute('src')
Creating & Removing Elements
// Membuat element baru
hayu divBaru = document.createElement('div')
divBaru.textContent = 'Elemen anyar'
divBaru.classList.add('kotak', 'anyar')
// Menambahkan ke DOM
hayu container = pilih('.container')
container.appendChild(divBaru)
// Insert at specific position
container.insertBefore(divBaru, container.firstChild)
// Menghapus element
hayu elementHapus = pilih('.hapus-ieu')
elementHapus.remove()
// Atau dengan parent
elementHapus.parentElement.removeChild(elementHapus)
🎨 Fitur Extension
1. Syntax Highlighting
Kode Sundawi akan ditampilkan dengan warna yang indah dan mudah dibaca:
- Keywords (gawe, lamun, pikeun) - Ungu
- Functions (tulis, ambil) - Kuning
- Strings - Oranye
- Numbers - Hijau muda
- Comments - Hijau tua
2. IntelliSense & Autocomplete
Ketik beberapa huruf dan dapatkan saran kode otomatis:
- Keyword suggestions
- Function names
- Variable names
- Object properties
- Import suggestions
3. Code Snippets
Ketik prefix dan tekan Tab untuk expand:
- gawe→ Template function
- lamun→ Template if statement
- kelas→ Template class
- pikeun→ Template for loop
- gasync→ Template async function
4. Error Detection
Deteksi kesalahan real-time:
- Syntax errors
- Undefined variables
- Type mismatches
- Missing semicolons (opsional)
5. Hover Documentation
Hover mouse di atas keyword untuk melihat dokumentasi instant dengan contoh penggunaan.
Tekan Shift+Alt+F untuk format kode otomatis:
- Indentasi konsisten
- Spacing yang benar
- Bracket alignment
⚙️ Settings
Customize extension di VSCode Settings:
{
  "sundawi.formatting.indentSize": 4,
  "sundawi.formatting.useTabs": false,
  "sundawi.formatting.semicolons": "optional",
  "sundawi.linting.enabled": true,
  "sundawi.linting.strictMode": false,
  "sundawi.intellisense.autoImport": true,
  "sundawi.intellisense.suggestions": true,
  "sundawi.transpiler.target": "ES2020",
  "sundawi.transpiler.module": "ESM"
}
📋 Command Palette
Tekan Ctrl+Shift+P / Cmd+Shift+P dan ketik:
- Sundawi: Gawe File Anyar- Buat file .sundawi baru
- Sundawi: Jalankeun File- Run file saat ini
- Sundawi: Format Dokumén- Format kode
- Sundawi: Ngarobah ka JavaScript- Transpile ke JS
- Sundawi: Buka Dokumentasi- Buka docs
- Sundawi: Cék Vérsi- Cek versi extension
🎯 Contoh Project
Todo List App
kelas TodoApp {
    gawe constructor() {
        ieu.todos = []
        ieu.render()
    }
    
    gawe tambahTodo(teks) {
        hayu todo = {
            id: Date.now(),
            teks: teks,
            rengse: salah
        }
        ieu.todos.push(todo)
        ieu.render()
    }
    
    gawe hapusTodo(id) {
        ieu.todos = ieu.todos.saring(t => t.id != id)
        ieu.render()
    }
    
    gawe toggleTodo(id) {
        hayu todo = ieu.todos.find(t => t.id == id)
        lamun todo {
            todo.rengse = lain todo.rengse
            ieu.render()
        }
    }
    
    gawe render() {
        hayu list = pilih('#todo-list')
        list.innerHTML = ''
        
        unggal ieu.todos jadi todo {
            hayu item = document.createElement('li')
            item.className = todo.rengse ? 'rengse' : ''
            item.innerHTML = `
                <span>${todo.teks}</span>
                <button data-id="${todo.id}" class="hapus">Hapus</button>
            `
            list.appendChild(item)
        }
    }
}
// Inisialisasi
hayu app = anyar TodoApp()
// Event listeners
hayu form = pilih('#todo-form')
form.dengekeun('submit', (e) => {
    e.preventDefault()
    hayu input = pilih('#todo-input')
    app.tambahTodo(input.value)
    input.value = ''
})
hayu list = pilih('#todo-list')
list.dengekeun('click', (e) => {
    lamun e.target.classList.contains('hapus') {
        hayu id = tos(e.target.dataset.id)
        app.hapusTodo(id)
    }
})
API Fetching Example
kelas UserService {
    gawe constructor() {
        ieu.baseUrl = 'https://jsonplaceholder.typicode.com'
    }
    
    gawe async ambilSadayaPamaé() {
        coba {
            hayu respon = antosan ambil(`${ieu.baseUrl}/users`)
            hayu users = antosan respon.json()
            mulangkeun users
        } cekel (err) {
            tulis('Gagal ambil data:', err)
            buang err
        }
    }
    
    gawe async ambilPamaeById(id) {
        coba {
            hayu respon = antosan ambil(`${ieu.baseUrl}/users/${id}`)
            hayu user = antosan respon.json()
            mulangkeun user
        } cekel (err) {
            tulis('Gagal ambil user:', err)
            mulangkeun kosong
        }
    }
    
    gawe async buatPamaé(data) {
        coba {
            hayu respon = antosan ambil(`${ieu.baseUrl}/users`, {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json'
                },
                body: JSON.stringify(data)
            })
            mulangkeun antosan respon.json()
        } cekel (err) {
            tulis('Gagal buat user:', err)
            buang err
        }
    }
}
// Penggunaan
gawe async main() {
    hayu service = anyar UserService()
    
    // Ambil semua users
    hayu users = antosan service.ambilSadayaPamaé()
    tulis('Total users:', users.panjangna)
    
    // Ambil user tertentu
    hayu user = antosan service.ambilPamaeById(1)
    tulis('User 1:', user.name)
    
    // Buat user baru
    hayu userBaru = {
        name: 'Asep Sunandar',
        email: 'asep@example.com',
        username: 'asepdev'
    }
    hayu hasil = antosan service.buatPamaé(userBaru)
    tulis('User baru dibuat:', hasil)
}
main()
Calculator App
kelas Kalkulator {
    gawe constructor() {
        ieu.display = pilih('#display')
        ieu.nilaiSaiki = '0'
        ieu.operatorSaiki = kosong
        ieu.nilaiSebelumna = kosong
        ieu.setupEventListeners()
    }
    
    gawe setupEventListeners() {
        // Number buttons
        hayu numberButtons = pilihSadaya('.number')
        unggal numberButtons jadi btn {
            btn.dengekeun('klik', () => ieu.inputNumber(btn.textContent))
        }
        
        // Operator buttons
        hayu operatorButtons = pilihSadaya('.operator')
        unggal operatorButtons jadi btn {
            btn.dengekeun('klik', () => ieu.setOperator(btn.dataset.operator))
        }
        
        // Equal button
        pilih('#equals').dengekeun('klik', () => ieu.calculate())
        
        // Clear button
        pilih('#clear').dengekeun('klik', () => ieu.clear())
        
        // Decimal button
        pilih('#decimal').dengekeun('klik', () => ieu.addDecimal())
    }
    
    gawe inputNumber(num) {
        lamun ieu.nilaiSaiki == '0' {
            ieu.nilaiSaiki = num
        } atawa {
            ieu.nilaiSaiki += num
        }
        ieu.updateDisplay()
    }
    
    gawe setOperator(op) {
        lamun ieu.operatorSaiki != kosong jeung ieu.nilaiSebelumna != kosong {
            ieu.calculate()
        }
        ieu.operatorSaiki = op
        ieu.nilaiSebelumna = kajadianGedé(ieu.nilaiSaiki)
        ieu.nilaiSaiki = '0'
    }
    
    gawe calculate() {
        lamun ieu.operatorSaiki == kosong atawa ieu.nilaiSebelumna == kosong {
            mulangkeun
        }
        
        hayu a = ieu.nilaiSebelumna
        hayu b = kajadianGedé(ieu.nilaiSaiki)
        hayu hasil
        
        pilih ieu.operatorSaiki {
            kasus '+':
                hasil = a + b
                tepi
            kasus '-':
                hasil = a - b
                tepi
            kasus '*':
                hasil = a * b
                tepi
            kasus '/':
                hasil = b != 0 ? a / b : 'Error'
                tepi
            baku:
                mulangkeun
        }
        
        ieu.nilaiSaiki = hasil.toString()
        ieu.operatorSaiki = kosong
        ieu.nilaiSebelumna = kosong
        ieu.updateDisplay()
    }
    
    gawe addDecimal() {
        lamun lain ieu.nilaiSaiki.includes('.') {
            ieu.nilaiSaiki += '.'
            ieu.updateDisplay()
        }
    }
    
    gawe clear() {
        ieu.nilaiSaiki = '0'
        ieu.operatorSaiki = kosong
        ieu.nilaiSebelumna = kosong
        ieu.updateDisplay()
    }
    
    gawe updateDisplay() {
        ieu.display.textContent = ieu.nilaiSaiki
    }
}
// Jalankan aplikasi
hayu calc = anyar Kalkulator()
🔧 Troubleshooting
Extension tidak berfungsi?
- Restart VSCode - Tekan Ctrl+Shift+P> "Developer: Reload Window"
- Cek versi VSCode - Minimal versi 1.75.0
- Reinstall extension - Uninstall lalu install kembali
- Cek output panel - View > Output > Pilih "Sundawi"
Syntax highlighting tidak muncul?
- Pastikan file berekstensi .sundawiatau.sw
- Tekan Ctrl+Shift+P> "Change Language Mode" > Pilih "Sundawi"
- Reload window
IntelliSense tidak bekerja?
- Buka Settings > sundawi.intellisense.suggestionsharustrue
- Pastikan Language Server Protocol aktif
- Restart VSCode
Error saat transpile?
- Cek syntax error di file Sundawi
- Pastikan semua import path benar
- Lihat error message di terminal
Contribution Guidelines
- Gunakan bahasa Sunda untuk keyword/function names
- Tulis test untuk fitur baru
- Update dokumentasi jika perlu
- Follow code style yang ada
- Commit message dalam bahasa Indonesia/Inggris
🎓 Learning Path
Level 1: Pemula (1-2 minggu)
- Instalasi VSCode dan Extension
- Variabel dan Tipe Data
- Operator dan Kontrol Flow
- Fungsi Dasar
- Array dan Object
Level 2: Menengah (2-4 minggu)
- Class dan OOP
- Async/Await
- Module System
- Error Handling
- DOM Manipulation
Level 3: Advanced (4-8 minggu)
- Design Patterns
- API Integration
- State Management
- Testing
- Build & Deploy
📝 Changelog
Version 1.0.0 (2024-01-15)
- 🎉 Initial release
- ✨ Syntax highlighting
- 🔍 IntelliSense & autocomplete
- 📦 50+ code snippets
- 🐛 Error detection
- 📖 Hover documentation
Version 1.1.0 (Coming Soon)
- 🚀 Performance improvements
- 🎨 New color themes
- 📚 More snippets
- 🔧 Better error messages
- 🌐 Multi-language support (EN/ID)
📄 License
MIT License
Copyright (c) 2024 EHFCreative
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
👨💻 Creator
EHFCreative
Sundawi Programming Language dan VSCode Extension ini dikembangkan dengan ❤️ oleh EHFCreative untuk memajukan komunitas developer Sunda dan Indonesia.
Follow untuk update terbaru:
Technical Support
- 📧 Email: info@ehfcreative.xyz 
- 🐛 Bug Reports: GitHub Issues 
- 📧 Email: info@ehfcreative.com 
- 📧 Email: press@ehfcreative.com
🔐 Security
Found a security vulnerability? Please report it to:
- 📧 security@sundawi-lang.com
- Do NOT open public GitHub issues for security vulnerabilities
We take security seriously and will respond within 48 hours.
Made with ❤️ by EHFCreative
Sundawi Programming Language © 2024
Website • Docs • GitHub •
⭐ Jangan lupa star repository jika bermanfaat! ⭐
"Ngahaturkeun nuhun parantos ngangge Sundawi Programming Language"
"Thank you for using Sundawi Programming Language"