(princ "Hello, world!")
커먼 리스프 Common Lisp | |
[clearfix]
1. 개요
- 커먼 리스프(Common Lisp)는 프로그래밍 언어 LISP 방언 중 하나이다.
- 커먼 리스프는 멀티 패러다임 언어이다.
- 커먼 리스프는 lisp-2이다.
2. 목록
- CLISP
- Steel Bank Common Lisp(SBCL)
- Allegro Common Lisp
- LispWorks
- Clozure CL
3. 예제
커먼 리스프에서 리스트의 길이를 확인하는 함수my-length
는 아래와 같이 작성한다.(defun my-length (list)
(if list
(1+ (my-length (cdr list)))
0))
4. 설치
- CLISP
- macOS
- 터미널에서 아래와 같이 입력하면 CLISP를 설치할 수 있다.
{{{brew install clisp
5. 문법
- 전역 변수
- 커먼 리스프에서는 전역 변수를 탑 레벨 정의라고 한다. 명령어
defparameter
를 사용해서 만든다. - 커먼 리스프에서 전역 변수 이름을 지을 때는
*
로 감싼다. 예를 들어*foo*
와 같이 이름을 짓는다.*
두 개로 감싼 것을 귀마개라고 부르기도 한다. 귀마개는 강제 문법은 아니고 그냥 컨벤션이다. 반드시 그래야 하는 것은 아니지만 커먼 리스프에서 전역 변수 이름을 지을 때는 귀마개 쓰기를 권장한다. defvar
로도 전역 변수를 만들 수 있다. 그런데defvar
로 만든 전역 변수는 제일 처음 만든 것으로 고정되고 다시 같은 이름으로 다른 값을 선언할 경우에 변수의 내용이 나중에 선언한 것으로 변경되지 않는다.- 전역 변수를 동적 변수, 특별 변수라 부르기도 한다.
- 전역 함수
- 커먼 리스프에서 함수는 아래와 같이 명령어
defun
으로 만든다.
{{{(defun function_name (arguments)
...)}}} - 커먼 리스프에서는 다른 언어에서와 같이
return
이라는 키워드를 쓰지 않는다. 함수에 적은 표현식의 마지막 평가 결과가 알아서 리턴된다. - 지역 변수
- 커먼 리스프에서는 다음과 같이 명령어
let
으로 지역 변수를 선언한다.
{{{(let (variable declarations)
...body...)}}} - 지역 함수
- 커먼 리스프에서 지역 함수를 선언할 때는 명령어
flet
을 사용한다.
{{{(flet ((function_name (arguments)
...function body...))
...body...)
- 재귀를 하려면 지역 함수 안에서 지역 함수를 호출해야 한다. 이때
flet
으로는 그렇게 하지 못하고 명령어labels
을 써야 한다. - 함수 호출
커먼 리스프에서 함수를 호출할 때 함수 이름을 괄호로 감싼다.
{{{(foo)
- 들여쓰기
- 리스트 함수
cons
car
cdr
list
- 고차 함수
- 커먼 리스프에서 함수를 인자로 넣을 때 연산자
function
을 써야 한다.
{{{(mapcar (function car) '((foo bar) (baz qux)))
커먼 리스프에서 들여쓰기는 신경 쓰지 않아도 된다. 아무 곳에서나 개행해도 되고 몇 칸을 들여쓰기 해도 에러가 나지 않는다.
- 아래와 같이 연산자
function
대신#'
를 써도 된다.
{{{(mapcar #'car '((foo bar) (baz qux)))
- 출력 함수
print
: 개행을 포함하여 문자열을 출력하는 함수이다.prin1
: 개행을 하지 않고 문자열을 출력하는 함수이다.princ
- 커먼 리스프에서 심볼 이름은 대소문자를 구분하지 않는다. 그런데 심볼 이름을 파이프로 감싸면 대소문자를 구분할 수 있다.(
|CaseSensitiveSymbol|
)
6. 코딩 컨벤션
- 전역 변수 이름에 귀마개를 씌운다.(
*foo*
) nil
이나 참값을 리턴하는 함수 이름 뒤에p
를 붙인다.(oddp
) 이런 함수를 predicates라고 한다.