Scheme adalah dialek minimalis dari bahasa pemrograman Lisp, yang dirancang untuk memfasilitasi gaya pemrograman fungsional sambil mempromosikan sintaks yang sederhana dan bersih. Bahasa ini ditandai dengan penggunaan tanda kurung, sistem makro yang kuat, dan penekanan yang kuat pada rekursi serta prosedur kelas satu. Bahasa ini mendorong paradigma pemrograman fungsional dan mendukung berbagai teknik pemrograman, termasuk pemrograman fungsional, imperatif, dan logika.
Scheme diciptakan pada tahun 1970-an oleh Gerald Jay Sussman dan Guy L. Steele Jr. di Massachusetts Institute of Technology (MIT). Bahasa ini dikembangkan sebagai upaya untuk menyederhanakan dan memperbaiki bahasa Lisp asli, yang telah menjadi kompleks seiring waktu. Motivasi di balik Scheme adalah untuk menciptakan bahasa yang lebih mudah diimplementasikan dan diajarkan, sambil tetap cukup kuat untuk mengekspresikan ide-ide kompleks.
Selama bertahun-tahun, Scheme telah mengalami berbagai revisi dan upaya standarisasi. Standar yang paling terkenal adalah RnRS (Revisedn Reports on the Algorithmic Language Scheme), yang memformalkan bahasa dan fitur-fiturnya. Komunitas Scheme sejak itu terus mengembangkan bahasa ini, yang mengarah pada standar baru seperti R6RS dan R7RS, yang memperkenalkan fitur dan perbaikan baru.
Hingga saat ini, Scheme tetap populer di lingkungan akademis, terutama dalam pendidikan ilmu komputer, karena keanggunan dan sintaksnya yang bersih. Pengaruhnya dapat dilihat di banyak bahasa pemrograman dan paradigma modern. Scheme sering diasosiasikan dengan komunitas pemrograman fungsional dan telah menginspirasi bahasa-bahasa seperti Clojure dan Racket, yang dibangun berdasarkan prinsip-prinsipnya dan memperluas kemampuannya.
Scheme menggunakan sintaksis yang sepenuhnya berkurung di mana kode ditulis dalam notasi prefiks; misalnya, operasi penjumlahan ditulis sebagai (+ 1 2)
.
Fungsi dalam Scheme adalah warga kelas satu, yang berarti mereka dapat diteruskan sebagai argumen atau dikembalikan dari fungsi lain. Contoh:
(define (make-adder x)
(lambda (y) (+ x y)))
(define add5 (make-adder 5))
(add5 10) ; mengembalikan 15
Scheme mendukung optimisasi panggilan ekor, memungkinkan fungsi untuk menggunakan kembali bingkai tumpukan saat panggilan rekursif terjadi di posisi ekor, mencegah tumpukan meluap.
Scheme memungkinkan penggunaan penerusan, memungkinkan pemrogram untuk menangkap keadaan komputasi saat ini dan memanipulasi alur kontrol:
(call-with-current-continuation
(lambda (exit)
(exit 'done)))
Scheme memiliki sistem makro yang kuat yang memungkinkan pemrogram untuk membuat ekstensi sintaksis. Makro sederhana dapat didefinisikan sebagai berikut:
(define-syntax my-if
(syntax-rules ()
((_ test then else)
(if test then else))))
Scheme mendukung abstraksi data melalui struktur seperti daftar, pasangan, dan fungsi tingkat tinggi, memungkinkan manipulasi data yang efisien.
Scheme menerapkan lingkup leksikal, di mana lingkup variabel ditentukan oleh lokasi fisiknya dalam kode sumber. Ini menghasilkan perilaku yang dapat diprediksi terkait dengan pengikatan variabel.
Scheme memiliki tipe dinamis, memungkinkan variabel untuk menyimpan nilai dari tipe apa pun tanpa perlu deklarasi tipe eksplisit.
Sebagai dialek Lisp, Scheme dioptimalkan untuk pemrosesan daftar, membuatnya mudah untuk melakukan operasi pada daftar:
(define my-list (list 1 2 3 4))
(car my-list) ; mengembalikan 1
(cdr my-list) ; mengembalikan (2 3 4)
Fungsi Scheme dapat didefinisikan secara rekursif dengan posisi ekor untuk mengoptimalkan penggunaan memori dan kinerja. Misalnya:
(define (factorial n)
(define (fact-helper n acc)
(if (zero? n)
acc
(fact-helper (- n 1) (* n acc))))
(fact-helper n 1))
Aplikasi Scheme umumnya dapat dibangun menggunakan lingkungan runtime dari implementasi yang dipilih. Misalnya, di Racket, Anda dapat menggunakan alat baris perintah racket
untuk menjalankan file .rkt
atau mengompilasinya menjadi executable.
Beberapa kompiler dan interpreter tersedia untuk Scheme, termasuk:
Scheme banyak digunakan di akademia untuk mengajarkan prinsip-prinsip pemrograman dan sebagai alat untuk penelitian dalam ilmu komputer. Ini memiliki aplikasi dalam kecerdasan buatan, desain bahasa, dan scripting, serta dalam berbagai domain yang memerlukan komputasi simbolik atau manipulasi data kompleks.
Kedua bahasa mendukung gaya pemrograman fungsional, tetapi Python menekankan keterbacaan dan kesederhanaan, sementara Scheme fokus pada ekspresi yang kuat dan ringkas. Sintaks Scheme yang banyak menggunakan tanda kurung mungkin dianggap sebagai penghalang bagi pemula, sedangkan sintaks berbasis indentasi Python umumnya lebih mudah diakses.
JavaScript juga mendukung pemrograman fungsional dan memiliki fungsi kelas satu. Namun, JavaScript memiliki sistem objek berbasis prototipe, sementara Scheme bergantung pada paradigma fungsional. Sistem makro Scheme menawarkan kemampuan yang tidak ada di JavaScript.
C adalah bahasa tingkat rendah yang diketik statis yang dirancang untuk pemrograman sistem, sementara Scheme adalah bahasa tingkat tinggi yang diketik dinamis. C fokus pada kinerja dan manipulasi tingkat perangkat keras, sementara Scheme menekankan abstraksi dan aspek teoretis dari komputasi.
Kedua bahasa berakar pada pemrograman fungsional. Haskell menggunakan sistem tipe yang lebih kaku dan mendukung evaluasi malas, sedangkan tipe dinamis dan evaluasi cepat Scheme memungkinkan pemrograman yang lebih fleksibel dengan mengorbankan beberapa kinerja.
Ruby adalah bahasa pemrograman berorientasi objek yang mencampurkan fitur pemrograman fungsional, sementara Scheme adalah murni fungsional. Sintaks Ruby lebih verbose, sementara kesederhanaan Scheme berasal dari desain minimalisnya.
Penerjemahan kode Scheme ke bahasa lain dapat difasilitasi oleh alat yang memahami sintaks Scheme dan bahasa target. Beberapa alat penerjemahan kode sumber ke sumber yang berguna termasuk:
Chicken Scheme menyediakan kompiler yang dapat menerjemahkan kode Scheme menjadi C, memungkinkan untuk memanfaatkan pustaka C dan membuat executable yang efisien.
Racket, turunan dari Scheme, memiliki kemampuan bawaan untuk mentransformasi dan mengompilasi kode menjadi JavaScript, membuatnya lebih mudah untuk menerapkan aplikasi web.
Gambit Scheme dapat mengompilasi kode Scheme menjadi C dan executable native, menyediakan opsi penerjemahan yang efisien untuk aplikasi yang kritis terhadap kinerja.