Bahasa Pemrograman Lisp

Ikhtisar

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.

Aspek Sejarah

Penciptaan dan Evolusi

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.

Dialek dan Hubungannya dengan Bahasa Lain

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.

Keadaan Saat Ini

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.

Fitur Sintaksis

Tanda Kurung dan S-ekspresi

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 Kelas Satu

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)

Pengetikan Dinamis

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

Makro

Lisp memiliki sistem makro yang kuat yang memungkinkan pengembang untuk membuat konstruksi sintaksis kustom:

(defmacro when (condition &body body)
  `(if ,condition
       (progn ,@body))
)

Ekspresi Kondisional

Bentuk if dan cond memfasilitasi alur kontrol dalam Lisp:

(if (> x 0)
    (print "Positif")
    (print "Tidak positif"))

Daftar sebagai Warga Kelas Satu

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)

Definisi Fungsi

Fungsi didefinisikan menggunakan konstruksi defun:

(defun factorial (n)
   (if (= n 0)
       1
       (* n (factorial (- n 1)))))

Sistem Objek

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)))

Penanganan Kesalahan

Lisp menyediakan mekanisme penanganan kesalahan yang canggih menggunakan handler-case:

(handler-case 
   (/ 1 0)
   (division-by-zero () (print "Menangkap pembagian dengan nol!")))

Kontinuitas

Kontinuitas didukung dalam beberapa dialek, memungkinkan program untuk menyimpan dan memulihkan status eksekusi:

(call-with-current-continuation
  (lambda (k)
    (k 10)))

Alat dan Runtime Pengembang

IDE dan Kompiler

Beberapa Integrated Development Environment (IDE) dan kompiler melayani pemrograman Lisp. Pilihan populer termasuk:

Pembangunan Proyek dan Kode Sumber

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.

Aplikasi Lisp

Lisp dikenal terutama karena aplikasinya dalam kecerdasan buatan, komputasi simbolik, dan akademisi, tetapi juga menemukan penggunaan dalam:

Perbandingan dengan Bahasa Lain

Lisp sering dibandingkan dengan:

Tips Terjemahan Sumber ke Sumber

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.