Cara memakai interpreter Scheme online
- Tulis atau tempel kode Scheme ke editor. Reset contoh mengembalikan program awal, yang mencetak faktorial, sepuluh bilangan Fibonacci pertama, dan jumlah kuadrat.
- Tekan Jalankan atau gunakan Ctrl + Enter (⌘ + Enter di Mac).
- Teks yang ditulis dengan
display,write, dannewlinemuncul di panel Output. Ketika program selesai, nilai ekspresi terakhir dicetak sebagai=> nilai, kecuali nilainya tidak ditentukan (unspecified). Galat dilaporkan dengan pesan milik BiwaScheme sendiri. - Pilih batas waktu 5, 15, atau 60 detik. Perulangan tanpa akhir dihentikan secara otomatis, dan Hentikan mengakhiri proses seketika.
Interpreter ini hanya berukuran sekitar 0,3 MB, jadi halaman siap hampir seketika. Salin dan main.scm menyimpan program Anda, dan Layar penuh (Ctrl/⌘ + Shift + F, Esc untuk keluar) memberi editor seluruh jendela.
Kode Anda berjalan di Web Worker di dalam browser Anda dan tidak pernah dikirim ke server. Editor menyimpan otomatis program terakhir Anda di penyimpanan lokal browser, terpisah untuk setiap compiler di situs ini.
Tentang Scheme dan BiwaScheme
Scheme adalah dialek kecil dari Lisp. Program berupa ekspresi dalam tanda kurung, fungsi adalah nilai biasa, dan rekursi adalah cara normal untuk melakukan perulangan. Intinya yang sangat ringkas menjadikannya bahasa pengajaran yang populer untuk closure, fungsi tingkat tinggi, dan interpreter.
Halaman ini menjalankan BiwaScheme 0.8.3, interpreter Scheme yang ditulis dalam JavaScript. Interpreter ini mengikuti standar R6RS dan R7RS dalam gayanya dan mencakup fitur Scheme yang paling umum. Namun, ini bukan implementasi lengkap dari salah satu standar tersebut.
Apa saja yang didukung
- Bentuk inti:
define,lambda,let,let*,letrec,if,cond,begin, danset!. - List dan fungsi tingkat tinggi:
cons,car,cdr,list,map,apply, dan data yang di-quote seperti'(1 2 3). - Proper tail call (pemanggilan ekor yang benar), sehingga perulangan yang ditulis sebagai named
letatau fungsi rekursif-ekor berjalan dengan ruang stack konstan.
Keterbatasan:
- Tidak ada kotak input. Letakkan data uji langsung di dalam program.
- Bukan implementasi standar yang lengkap. Prosedur yang khusus untuk Scheme lain, seperti MIT Scheme, Racket, atau Guile, mungkin tidak tersedia.
- Hanya kode di editor yang dijalankan. Tidak ada file yang bisa dimuat dan tidak ada package manager.
Contoh praktis: rekursi vs named let
;; Rekursi biasa: setiap pemanggilan menunggu pemanggilan berikutnya selesai.
(define (sum-list lst)
(if (null? lst)
0
(+ (car lst) (sum-list (cdr lst)))))
;; Named let: perulangan rekursif-ekor dengan akumulator.
(define (sum-to n)
(let loop ((i 1) (acc 0))
(if (> i n)
acc
(loop (+ i 1) (+ acc i)))))
(display (sum-list '(1 2 3 4))) (newline) ; 10
(sum-to 100000) ; => 5000050000
Ekspresi terakhir tidak ditampilkan, jadi nilainya muncul sebagai => 5000050000. sum-list menumpuk penjumlahan yang tertunda, sedangkan sum-to memanggil loop pada posisi ekor dan berperilaku seperti perulangan while.
Kesalahan yang sering terjadi
- Lupa me-quote list.
(1 2 3)mencoba memanggil1sebagai fungsi dan gagal. Tulis'(1 2 3)atau(list 1 2 3). Keduanya berbeda:'(a b)adalah list berisi simboladanb, sedangkan(list a b)mengevaluasi variabelnya. definevslet.definetingkat atas membuat nama global.letmembuat nama lokal yang hanya ada di dalam badannya. Di dalamletbiasa, satu binding tidak bisa merujuk ke binding lain, jadi gunakanlet*ketika nilai yang belakangan bergantung pada nilai sebelumnya.displayvswrite.displaymencetak string tanpa tanda kutip.writemempertahankannya, yang membantu saat Anda men-debug data.- Kesamaan. Gunakan
=untuk bilangan,eq?untuk simbol, danequal?untuk membandingkan list atau string berdasarkan isinya.
Pertanyaan yang sering diajukan
Ini compiler Scheme atau interpreter?
Interpreter. BiwaScheme menjalankan program Anda langsung di browser tanpa langkah kompilasi terpisah.
Standar Scheme mana yang didukung?
BiwaScheme mengikuti R6RS dan R7RS dalam gayanya dan mencakup fitur yang paling umum. Kode buku teks standar yang memakai define, lambda, let, cond, list, dan rekursi berjalan sebagaimana mestinya. Kode yang bergantung pada pustaka implementasi tertentu mungkin perlu diubah.
Bisakah saya memakainya untuk SICP atau latihan kuliah?
Ya, untuk latihan yang dibangun di atas inti Scheme. Jika sebuah latihan memakai prosedur yang tidak didefinisikan, tulis sendiri versi kecilnya di bagian atas program.
Mengapa program saya tidak mencetak apa pun?
Hanya display, write, dan newline yang menghasilkan output, ditambah baris => untuk nilai ekspresi terakhir. Program yang diakhiri dengan define tidak menampilkan nilai, karena hasilnya tidak ditentukan.
Bahasa lain apa yang bisa saya jalankan online?
Coba Compiler Clojure Online untuk Lisp lainnya, Compiler Prolog Online untuk pemrograman logika, atau telusuri semua compiler online.
Diperbarui