Lisp ซึ่งย่อมาจาก "LISt Processing" เป็นครอบครัวของภาษาการเขียนโปรแกรมที่มีไวยากรณ์ที่โดดเด่นซึ่งใช้วงเล็บเป็นหลัก โดยมุ่งเน้นไปที่การจัดการสัญลักษณ์และรายการ มันเป็นหนึ่งในภาษาการเขียนโปรแกรมระดับสูงที่เก่าแก่ที่สุด ซึ่งถูกคิดค้นขึ้นในช่วงปลายทศวรรษ 1950 และได้พัฒนาอย่างมากในช่วงหลายทศวรรษที่ผ่านมา Lisp เป็นที่รู้จักเป็นพิเศษสำหรับคุณสมบัติที่ทรงพลัง เช่น การกำหนดประเภทแบบไดนามิก การจัดการขยะ และฟังก์ชันระดับหนึ่ง ทำให้มันเหมาะสำหรับการวิจัย AI การคำนวณเชิงสัญลักษณ์ และการสร้างต้นแบบอย่างรวดเร็ว
Lisp ถูกสร้างขึ้นโดย John McCarthy ในปี 1958 เป็นการบันทึกทางคณิตศาสตร์สำหรับโปรแกรมคอมพิวเตอร์และเป็นวิธีการที่ใช้ได้จริงในการนำ AI ไปใช้ ภาษาได้รับการพัฒนามาจากแคลคูลัสแลมบ์ดา ซึ่งเป็นระบบทางการในตรรกะทางคณิตศาสตร์และวิทยาการคอมพิวเตอร์ การนำไปใช้ครั้งแรกเกิดขึ้นบน IBM 704 และไม่นานหลังจากนั้นก็มีการเกิดขึ้นของหลายสำเนียง โดยแต่ละสำเนียงก็ได้เพิ่มคุณสมบัติและความซับซ้อนของตนเอง
สำเนียงที่โดดเด่นหลายตัวของ Lisp ได้เกิดขึ้นในช่วงเวลาต่าง ๆ รวมถึง Common Lisp และ Scheme Common Lisp ได้รับการมาตรฐานในทศวรรษ 1980 เพื่อรวมสำเนียงต่าง ๆ ในขณะที่ Scheme ซึ่งเน้นการเขียนโปรแกรมเชิงฟังก์ชันและความเรียบง่าย ได้รับความนิยมในวงการวิชาการ อิทธิพลของ Lisp สามารถเห็นได้ในหลายภาษาการเขียนโปรแกรมสมัยใหม่ โดยเฉพาะอย่างยิ่งในภาษาที่สนับสนุนพาราไดม์การเขียนโปรแกรมเชิงฟังก์ชัน เช่น Clojure, Racket และแม้แต่ภาษาที่เหมือน Python และ Ruby
ในปัจจุบัน Lisp ไม่ได้เป็นหนึ่งในภาษาการเขียนโปรแกรมที่ได้รับความนิยมมากที่สุด แต่ยังคงมีอิทธิพล โดยเฉพาะในด้านการวิจัย AI และการศึกษา ชุมชนยังคงพัฒนาสำเนียงใหม่ ๆ เช่น Clojure ซึ่งทำงานบน Java Virtual Machine (JVM) และมุ่งเน้นไปที่การเขียนโปรแกรมแบบขนาน
Lisp ใช้ไวยากรณ์ที่ไม่เหมือนใครโดยใช้วงเล็บเพื่อแสดงถึงนิพจน์ โดยมีโค้ดที่แสดงในรูปแบบสัญลักษณ์ (S-expressions) ตัวอย่างเช่น:
(+ 1 2)
นิพจน์นี้แสดงถึงการบวก 1 และ 2
ฟังก์ชันใน Lisp สามารถถูกส่งเป็นอาร์กิวเมนต์ คืนค่าจากฟังก์ชันอื่น และถูกกำหนดให้กับตัวแปร:
(defun square (x) (* x x))
(mapcar #'square '(1 2 3 4)) ; คืนค่า (1 4 9 16)
Lisp มีการกำหนดประเภทแบบไดนามิก ซึ่งอนุญาตให้ตัวแปรเก็บค่าของประเภทข้อมูลใด ๆ โดยไม่ต้องประกาศล่วงหน้า:
(setq x 10) ; x ตอนนี้เป็นตัวเลข
(setq x "hello") ; x ตอนนี้เป็นสตริง
Lisp มีระบบแมโครที่ทรงพลังซึ่งอนุญาตให้นักพัฒนาสร้างโครงสร้างทางไวยากรณ์ที่กำหนดเอง:
(defmacro when (condition &body body)
`(if ,condition
(progn ,@body))
)
รูปแบบ if
และ cond
ช่วยในการควบคุมการไหลใน Lisp:
(if (> x 0)
(print "Positive")
(print "Non-positive"))
Lisp ถือว่ารายการเป็นโครงสร้างข้อมูลพื้นฐาน:
(setq my-list '(1 2 3 4))
(car my-list) ; คืนค่า 1
(cdr my-list) ; คืนค่า (2 3 4)
ฟังก์ชันถูกกำหนดโดยใช้โครงสร้าง defun
:
(defun factorial (n)
(if (= n 0)
1
(* n (factorial (- n 1)))))
Common Lisp รวมถึงระบบวัตถุที่เรียกว่า 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 "Hello, my name is ~A and I'm ~A years old."
(person-name p) (person-age p)))
Lisp มีกลไกการจัดการข้อผิดพลาดที่ซับซ้อนโดยใช้ handler-case
:
(handler-case
(/ 1 0)
(division-by-zero () (print "Caught division by zero!")))
การต่อเนื่องได้รับการสนับสนุนในบางสำเนียง ซึ่งอนุญาตให้โปรแกรมบันทึกและกู้คืนสถานะการทำงาน:
(call-with-current-continuation
(lambda (k)
(k 10)))
มี Integrated Development Environments (IDEs) และคอมไพเลอร์หลายตัวที่รองรับการเขียนโปรแกรม Lisp ตัวเลือกที่ได้รับความนิยม ได้แก่:
ในการสร้างโปรเจกต์ Lisp คุณมักจะสร้างไฟล์ที่มีนามสกุล ".lisp" หรือ ".lsp" โดยใช้ SBCL กระบวนการทำงานทั่วไปอาจเกี่ยวข้องกับการโหลดโปรเจกต์ของคุณจาก REPL:
(load "my-project.lisp")
สำหรับโปรเจกต์ที่ใช้ Quicklisp ซึ่งเป็นผู้จัดการไลบรารี การจัดการและโหลดการพึ่งพาสามารถทำได้อย่างง่ายดาย
Lisp เป็นที่รู้จักเป็นพิเศษสำหรับการใช้งานในด้านปัญญาประดิษฐ์ การคำนวณเชิงสัญลักษณ์ และการศึกษา แต่ยังมีการใช้งานใน:
Lisp มักถูกเปรียบเทียบกับ:
การแปลจาก Lisp ไปยังภาษาอื่นมักทำโดยใช้เครื่องมือการแปลจากแหล่งสู่แหล่ง ตัวอย่างเช่น เครื่องมือดังต่อไปนี้มีอยู่:
เครื่องมือแต่ละตัวนี้มีการแมพเฉพาะที่ทำให้มั่นใจว่าฟังก์ชันหลักของ Lisp สามารถแสดงผลได้อย่างมีประสิทธิภาพในภาษาที่กำหนดเป้าหมาย สำหรับการแปลที่ซับซ้อนมากขึ้น อาจต้องมีการปรับโครงสร้างด้วยตนเอง โดยเฉพาะอย่างยิ่งสำหรับโค้ดที่มีการเพิ่มประสิทธิภาพด้วยแมโครอย่างมาก