최근 수정 시각 : 2024-10-11 21:19:20

Common Lisp


(princ "Hello, world!")
커먼 리스프
Common Lisp
파일:512px-Lisplogo.png
파일:홈페이지 아이콘.svg
1. 개요2. 목록3. 예제4. 설치5. 문법6. 코딩 컨벤션7. 관련 문서8. 외부 링크

[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라고 한다.

7. 관련 문서

8. 외부 링크

분류