LISP
LISP
- 표현 기능이 대단히 뛰어난 언어, 가장 복잡한 프로그래밍 아이디어를 명확하고 적절하게 표현할 수 있도록 설계.
- 많은 대기업이 핵심적인 업무에 리스프를 사용.
- 리스프는 작은 노력으로도 배울 수 있지만 컴퓨터 프로그래밍에 대해 깊은 통찰력을 갖게 한다.
- 확장성 있는 라이브러리를 비롯한 수많은 언어 기능을 지원하며 컴파일러/인터프리터를 무척 쉽게 수정할 수 있다. 리스프의 주된 원리를 따르는 모든 언어는 리스프의 변종이라 하고 그래서 리스프는 변종이 많다.
- 가장 많이 사용하는 리스프는 안시 커먼 리스프와 스킴
- 안시 커먼 리스프
- 1981년 많은 리스프 변종에 대응하고자 리스프 단체에서 커먼 리스프라는 리스프 명세서를 발표.
- 1986년 커먼 리스프가 좀 더 다듬어져 안시 커먼 리스프 규격으로 바뀌었다.
- 리스프 사상 최고의 인기를 끌며 현재까지 최고의 점유율을 유지.
- 주된 설계 목표는 다양한 개념을 아우르는 언어를 만드는 것이며 이 말은 다양한 프로그래밍 방식을 지원을 뜻한다. 객체 지향 프로그래밍, 함수형 프로그래밍, 제네릭 프로그래밍, 특정 도메인 언어 프로그래밍 등 이 모두 커먼 리스프에서는 막힘없이 지원되고 있다. 다중 프레임 언어
앞날이 기대되는 리스프
- 하스켈
- 안시 커먼 리스프와 스킴, 둘 다 완벽히 만족하는 리스프가 없지만 대체 언어로 하스켈이 있다.
- 하스켈은 리스프 변종으로 분류되지 않지만 리스퍼 사이에 널리 퍼진 개념을 따른다.
- 하스켈은 스킴보다도 더한 고도의 수학적 엄격함을 갖추고 있는데, 이 엄격함은 매우 깔금한 외형 이면에 강력한 기능을 감출 수 있게 한다. 양의 탈을 쓴 늑대
- 클로저
- 자바로 작성
- 검증된 수많은 자바 라이브러리를 사용할 수 있다.
- 멀티코어 프로그래밍에 유용하다.
- 아크
- 진정한 리스프
- 개발 진도가 매우 느리다.
LISP 맛보기
내 숫자를 맞춰봐 게임.
마음속으로 1~100사이의 숫자를 정하고 컴퓨터에게 맞추게 하는 게임이다.
(defparameter *small* 1)
(defparameter *big* 100)
(defun guess-my-number()
(ash (+ *small* *big*) -1))
(defun smaller ()
(setf *big* (1- (guess-my-number)))
(guess-my-number))
(defun bigger ()
(setf *small* (1+ (guess-my-number)))
(guess-my-number))
(defun start-over ()
(defparameter *small* 1)
(defparameter *big* 100)
(guess-my-number))
기본 수칙
- 리스프는 괄호로 명령어를 둘러싸야 한다. 이 괄호 없이는 명령어가 실행되지 않는다.
- 리스프는 코드를 읽을때, 공백과 줄넘김은 완전히 무시된다.
- 그러므로 유연한 형태로 코드를 작성할 수 있다.
전역변수
- 리스프에서 전역으로 선언된 변수를 최상위 정의(top-level definition)라 부른다.
defparameter
함수를 이용해 새로운 최상위 정의를 할 수 있다. (전역변수) - 전역변수
*big*
과*small*
이름을 둘러싼*
기호는(귀마개라는 애칭을 사용) 선택 사항이고 마음껏 써도 된다. 리스프는*
기호를 변수 이름의 일부분으로 인식하고 이를 무시한다. 리스퍼는 관습처럼 전역변수에*
기호를 붙여서 지역변수와 구분하기 쉽게 한다. defparameter
는 전역변수에 값을 쓰면 이전에 저장된 모든 값을 덮어쓴다. 전역변수를 정의하는 다른 함수defvar
는 이전 값을 덮어쓰지 않는다.
전역 함수
- 커먼 리스프에서 함수는
defun
명령으로 정의한다. - 리스프에서는 return이 필요 없으며, 함수 몸체에서 계산된 마지막 값이 자동으로 반환된다.
etc
- 지역변수와 지역함수를 선언하려면 각각
let
과flet
명령을 사용한다. labels
함수는flet
과 비슷하나 함수 자신을 호출할 수 있게 한다.