Lisp는 "LISt Processing"의 약자로, 기호와 리스트의 조작을 중심으로 한 독특한 괄호 기반 구문을 공유하는 프로그래밍 언어의 가족입니다. Lisp는 1950년대 후반에 처음 발명된 가장 오래된 고급 프로그래밍 언어 중 하나로, 수십 년에 걸쳐 크게 발전해왔습니다. Lisp는 동적 타이핑, 가비지 컬렉션, 일급 함수와 같은 강력한 기능으로 특히 알려져 있으며, AI 연구, 기호 계산 및 신속한 프로토타입 제작에 적합합니다.
Lisp는 1958년 John McCarthy에 의해 컴퓨터 프로그램을 위한 수학적 표기법이자 AI 구현을 위한 실용적인 수단으로 만들어졌습니다. 이 언어는 수학 논리와 컴퓨터 과학의 형식적 시스템인 람다 계산에서 파생되었습니다. 첫 번째 구현은 IBM 704에서 수행되었으며, 곧 여러 방언이 등장하여 각기 다른 기능과 복잡성을 추가했습니다.
시간이 지나면서 Common Lisp와 Scheme을 포함한 여러 주목할 만한 Lisp 방언이 등장했습니다. Common Lisp는 1980년대에 다양한 방언을 통합하기 위해 표준화되었고, 함수형 프로그래밍과 미니멀리즘을 강조하는 Scheme은 학계에서 인기를 얻었습니다. Lisp의 영향은 Clojure, Racket, 심지어 Python과 Ruby와 같은 현대 프로그래밍 언어에서도 볼 수 있습니다.
오늘날 Lisp는 가장 인기 있는 프로그래밍 언어 중 하나는 아니지만, 특히 연구, AI 및 교육 분야에서 여전히 영향력을 발휘하고 있습니다. 커뮤니티는 Java 가상 머신(JVM)에서 실행되며 동시 프로그래밍에 중점을 둔 Clojure와 같은 새로운 방언을 활발히 개발하고 있습니다.
Lisp는 괄호를 사용하여 표현식을 나타내는 독특한 구문을 사용하며, 코드는 기호 표현식(S-표현식)으로 표현됩니다. 예를 들어:
(+ 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 객체 시스템(CLOS)이라는 객체 지향 시스템이 포함되어 있습니다:
(defclass person ()
((name :initarg :name :accessor person-name)
(age :initarg :age :accessor person-age)))
(defmethod say-hello ((p person))
(format t "안녕하세요, 제 이름은 ~A이고 나이는 ~A세입니다."
(person-name p) (person-age p)))
Lisp는 handler-case
를 사용하여 정교한 오류 처리 메커니즘을 제공합니다:
(handler-case
(/ 1 0)
(division-by-zero () (print "0으로 나누기 오류 발생!")))
일부 방언에서는 계속을 지원하여 프로그램이 실행 상태를 저장하고 복원할 수 있습니다:
(call-with-current-continuation
(lambda (k)
(k 10)))
여러 통합 개발 환경(IDE) 및 컴파일러가 Lisp 프로그래밍을 지원합니다. 인기 있는 선택은 다음과 같습니다:
Lisp 프로젝트를 빌드하려면 일반적으로 ".lisp" 또는 ".lsp" 확장자를 가진 파일을 생성합니다. SBCL을 사용하여 일반적인 작업 흐름은 REPL에서 프로젝트를 로드하는 것입니다:
(load "my-project.lisp")
Quicklisp라는 라이브러리 관리자를 사용하는 프로젝트의 경우, 종속성을 쉽게 관리하고 로드할 수 있습니다.
Lisp는 인공지능, 기호 계산 및 학계에서의 응용으로 특히 알려져 있지만, 다음과 같은 분야에서도 사용됩니다:
Lisp는 종종 다음과 비교됩니다:
Lisp에서 다른 언어로의 번역은 종종 소스 투 소스 번역 도구를 사용하여 수행됩니다. 예를 들어, 다음과 같은 도구가 존재합니다:
이 도구들은 각각 특정 매핑을 제공하여 Lisp의 핵심 기능이 대상 언어에서 효과적으로 표현될 수 있도록 합니다. 더 복잡한 번역의 경우, 특히 매크로 최적화된 코드에 대해서는 수동 리팩토링이 필요할 수 있습니다.