문법 한눈에 보기

일상적인 리스펙스 문법을 완전한 예제와 결과로 한 페이지에서 훑고 필요한 매뉴얼로 바로 이동합니다.

필요한 문법 예제와 결과를 찾고 링크를 따라 자세한 규칙을 읽으세요. 프로그램을 작성하면서 참고할 수 있도록 카드별로 묶었습니다.

각 카드의 예제 전체를 플레이그라운드에서 따로 실행하세요. 예제 아래 결과는 그곳에 표시되는 값입니다.

리터럴과 주석

값 ; 주석
LISPEX
(list 42 #t "tea" #\T 'ready)
; 이 줄의 나머지는 무시됩니다

결과

출력
(42 #t "tea" #\T ready)

수와 불리언과 문자열과 문자는 그대로 적을 수 있습니다. 'ready의 작은따옴표는 ready를 심볼 값으로 만듭니다. 세미콜론부터 줄 끝까지는 주석입니다.

소스와 리더 매뉴얼 보기

호출과 겹친 식

(프로시저 인자 ...)
LISPEX
(+ 10 (* 2 3))

결과

출력
16

안쪽 호출 (* 2 3)의 결과는 6이므로 바깥 호출은 10과 6을 더합니다. 프로시저 호출의 첫 식은 실행할 프로시저를 고릅니다. 그 식과 인자는 왼쪽에서 오른쪽으로 평가합니다.

평가 순서 배우기

이름과 지역 값

define · let · let* · letrec
LISPEX
(let ((재단-너비 20) (도련 3))
  (+ 재단-너비 도련))

결과

출력
23

let은 값에 지역 이름을 붙입니다. 여기서 재단-너비는 20, 도련는 3입니다. 초깃값 식은 바깥 범위의 이름을 사용하므로 서로의 새 이름을 참조할 수 없습니다. 최상위 이름에는 define을 씁니다. 뒤의 지역 값이 앞의 이름을 참조해야 하면 let*을 쓰고 재귀적인 지역 정의에는 letrec을 씁니다.

이름과 유효 범위 배우기

이름 붙인 프로시저와 lambda

(define (이름 x) 본문) · (lambda (x) 본문)
LISPEX
(define (double n) (* n 2))
(double 6)

결과

출력
12

define은 프로시저 이름과 인자를 정합니다. 여기서 double은 받은 인자에 2를 곱합니다. 프로시저도 값입니다. 이름 없이 만들려면 lambda를 씁니다.

프로시저와 인자 수 배우기

조건

if · cond · case · and · or
LISPEX
(if (< 1 2) 'next-page 'keep)

결과

출력
next-page

if는 남은 1줄이 2줄보다 적으므로 'next-page를 고릅니다. cond는 여러 조건을 차례로 확인하고 case는 일치하는 값으로 분기를 고릅니다. and와 or는 결과가 정해지면 멈춥니다. #f만 거짓으로 취급합니다.

조건 형식 고르기

인용 데이터와 리스트

'데이터 · (list 값 ...)
LISPEX
(list 'decision 'allow)

결과

출력
(decision allow)

작은따옴표는 데이터를 평가하지 않고 유지합니다. 여기서 'decision과 'allow는 심볼 값입니다. list는 인자를 평가한 값을 새 리스트에 담습니다.

데이터와 복합 값 배우기

문자열, 벡터, 바이트

LISPEX
(list (string-length "Lispex")
      (vector-ref #(red green blue) 1))

결과

출력
(6 green)

string-length는 "Lispex"의 문자 수를 셉니다. vector-ref는 0부터 세는 인덱스로 원소를 고르므로 인덱스 1의 값은 green입니다. 문자열은 유니코드 텍스트를 담습니다. 벡터는 순서 있는 원소를 담으며 현재 언어 프로파일에서 변경할 수 있습니다. 바이트벡터는 0부터 255까지의 값을 담으며 변경할 수 없습니다.

텍스트와 바이트 참조 보기

리스트 처리와 재귀

재귀 · map · filter · fold · apply
LISPEX
(map (lambda (n) (* n 10)) '(1 2 3))

결과

출력
(10 20 30)

map은 리스트의 각 원소에 프로시저를 적용하고 결과를 리스트로 돌려줍니다. filter는 원소를 고르고 fold는 원소를 누적 값으로 합칩니다. apply는 리스트에 든 값들을 인자로 삼아 프로시저를 호출합니다. 재귀 프로시저는 자신을 호출합니다. 꼬리 호출은 호출 스택을 늘리지 않고 재귀 호출을 반복하게 합니다.

리스트 처리 배우기

더 자세히 알아보기

궁금한 점이어서 볼 페이지
프로시저끼리 바뀌는 값을 어떻게 공유하나요?바인딩, 셀, 변경과 클로저
1/3은 정확한데 (/ 1.0 3)은 왜 부정확한가요?정확한 수와 근삿값
계산 하나가 결과 두 개를 어떻게 내나요?다중 값
어떤 재귀가 일정한 스택을 쓰나요?올바른 꼬리 호출
계산 도중에 어떻게 빠져나오나요?연속과 dynamic-wind
끝없는 계산과 거대한 출력은 어떻게 멈추나요?결정성과 자원

정확히 허용되는 토큰과 형식은 코드 읽기 규칙 참조 문서와 기본 문법 형식 문서에 나와 있습니다. 차근차근 따라가는 안내가 필요하다면 학습 경로로 다시 돌아가면 됩니다.