Lisp, singkatan dari "LISt Processing," adalah keluarga bahasa pemrograman yang memiliki sintaks berbasis tanda kurung yang khas, terutama berfokus pada manipulasi simbol dan daftar. Ini adalah salah satu bahasa pemrograman tingkat tinggi tertua, yang awalnya ditemukan pada akhir 1950-an, dan telah berkembang secara signifikan selama beberapa dekade. Lisp dikenal karena fitur-fitur kuatnya seperti pengetikan dinamis, pengumpulan sampah, dan fungsi kelas satu, menjadikannya cocok untuk penelitian AI, komputasi simbolik, dan prototyping cepat.
Lisp diciptakan oleh John McCarthy pada tahun 1958 sebagai notasi matematis untuk program komputer dan sebagai cara praktis untuk menerapkan AI. Bahasa ini berasal dari kalkulus lambda, sebuah sistem formal dalam logika matematis dan ilmu komputer. Implementasi pertama dilakukan pada IBM 704, dan segera setelah itu, muncul berbagai dialek, masing-masing menambahkan fitur dan kompleksitasnya sendiri.
Beberapa dialek Lisp yang terkenal telah muncul seiring waktu, termasuk Common Lisp dan Scheme. Common Lisp distandarisasi pada tahun 1980-an untuk menyatukan berbagai dialek, sementara Scheme, yang menekankan pemrograman fungsional dan minimalisme, mendapatkan popularitas di kalangan akademisi. Pengaruh Lisp dapat dilihat di banyak bahasa pemrograman modern, terutama yang mendukung paradigma pemrograman fungsional, seperti Clojure, Racket, dan bahkan bahasa seperti Python dan Ruby.
Saat ini, Lisp tidak termasuk dalam bahasa pemrograman yang paling populer tetapi tetap berpengaruh, terutama dalam penelitian, AI, dan pendidikan. Komunitas secara aktif mengembangkan dialek-dialek baru seperti Clojure, yang berjalan di Java Virtual Machine (JVM) dan fokus pada pemrograman konkuren.
Lisp menggunakan sintaks unik dengan tanda kurung untuk menunjukkan ekspresi, dengan kode yang direpresentasikan dalam ekspresi simbolik (S-ekspresi). Sebagai contoh:
(+ 1 2)
Ekspresi ini merepresentasikan penjumlahan 1 dan 2.
Fungsi dalam Lisp dapat diteruskan sebagai argumen, dikembalikan dari fungsi lain, dan ditugaskan ke variabel:
(defun square (x) (* x x))
(mapcar #'square '(1 2 3 4)) ; mengembalikan (1 4 9 16)
Lisp memiliki pengetikan dinamis, memungkinkan variabel untuk menyimpan nilai dari tipe data apa pun tanpa deklarasi sebelumnya:
(setq x 10) ; x sekarang adalah angka
(setq x "hello") ; x sekarang adalah string
Lisp memiliki sistem makro yang kuat yang memungkinkan pengembang untuk membuat konstruksi sintaksis kustom:
(defmacro when (condition &body body)
`(if ,condition
(progn ,@body))
)
Bentuk if
dan cond
memfasilitasi alur kontrol dalam Lisp:
(if (> x 0)
(print "Positif")
(print "Tidak positif"))
Lisp memperlakukan daftar sebagai struktur data dasar:
(setq my-list '(1 2 3 4))
(car my-list) ; mengembalikan 1
(cdr my-list) ; mengembalikan (2 3 4)
Fungsi didefinisikan menggunakan konstruksi defun
:
(defun factorial (n)
(if (= n 0)
1
(* n (factorial (- n 1)))))
Common Lisp mencakup sistem berorientasi objek yang dikenal sebagai Common Lisp Object System (CLOS):
(defclass person ()
((name :initarg :name :accessor person-name)
(age :initarg :age :accessor person-age)))
(defmethod say-hello ((p person))
(format t "Halo, nama saya ~A dan saya berumur ~A tahun."
(person-name p) (person-age p)))
Lisp menyediakan mekanisme penanganan kesalahan yang canggih menggunakan handler-case
:
(handler-case
(/ 1 0)
(division-by-zero () (print "Menangkap pembagian dengan nol!")))
Kontinuitas didukung dalam beberapa dialek, memungkinkan program untuk menyimpan dan memulihkan status eksekusi:
(call-with-current-continuation
(lambda (k)
(k 10)))
Beberapa Integrated Development Environment (IDE) dan kompiler melayani pemrograman Lisp. Pilihan populer termasuk:
Untuk membangun proyek Lisp, Anda biasanya membuat file dengan ekstensi ".lisp" atau ".lsp". Menggunakan SBCL, alur kerja yang umum mungkin melibatkan memuat proyek Anda dari REPL:
(load "my-project.lisp")
Untuk proyek yang menggunakan Quicklisp, manajer pustaka, ketergantungan dapat dengan mudah dikelola dan dimuat.
Lisp dikenal terutama karena aplikasinya dalam kecerdasan buatan, komputasi simbolik, dan akademisi, tetapi juga menemukan penggunaan dalam:
Lisp sering dibandingkan dengan:
Menerjemahkan dari Lisp ke bahasa lain sering dilakukan menggunakan alat terjemahan sumber ke sumber. Misalnya, alat berikut ada:
Setiap alat ini menyediakan pemetaan spesifik yang memastikan bahwa fungsionalitas inti Lisp dapat diwakili secara efektif dalam bahasa target. Untuk terjemahan yang lebih kompleks, refactoring manual mungkin diperlukan, terutama untuk kode yang sangat dioptimalkan dengan makro.