문법 한눈에 보기

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

이 페이지는 지도처럼 쓰면 됩니다. 각 카드는 “지금 보고 있는 모양이 무엇인가?”에 답하고 정확한 동작을 설명하는 페이지로 이어집니다. 과정을 시작하기 전에 카드 내용을 미리 외울 필요는 없습니다.

리터럴과 주석

값 ; 주석

수, 불리언, 문자열, 문자, 인용한 심볼은 예측 가능한 값으로 평가됩니다. 세미콜론이 나오면 그 자리부터 줄 끝까지 주석으로 처리합니다.

LISPEX
(list 42 #t "tea" #\T 'ready)
; 이 줄의 나머지는 무시됩니다
소스와 리더 매뉴얼 보기

호출과 겹친 식

(프로시저 인자 ...)

맨 앞의 식이 실행할 프로시저를 정합니다. 연산자와 인자는 왼쪽에서 오른쪽으로 평가하고, 안쪽 호출이 끝난 뒤 바깥 폼이 그 값을 사용합니다.

LISPEX
(+ 10 (* 2 3))
평가 순서 배우기

이름과 로컬 바인딩

define · let · let* · letrec

최상위 이름에는 define을 쓰고, 나란한 로컬 입력에는 let을 씁니다. 앞선 바인딩이 필요한 순차 바인딩에는 let*을, 재귀적인 로컬 이름에는 letrec을 씁니다.

LISPEX
(let ((price 20) (fee 3))
  (+ price fee))
바인딩과 스코프 배우기

이름 붙인 프로시저와 lambda

(define (이름 x) 본문) · (lambda (x) 본문)

프로시저도 하나의 값입니다. 단축된 정의 형식으로 최상위에 이름을 붙이거나 lambda를 써서 그 자리에서 만들 수 있습니다.

LISPEX
(define (double n) (* n 2))
(double 6)
프로시저와 인자 수 배우기

조건

if · cond · case · and · or

if는 두 식 중 하나를 고르고, cond는 여러 검사를 위에서부터 확인합니다. andor는 답이 정해지는 순간 멈춥니다. 오직 #f만 거짓입니다.

LISPEX
(if (>= 62 50) 'free 'standard)
조건 형식 고르기

인용 데이터와 리스트

'데이터 · (list 값 ...)

작은따옴표는 폼을 실행하지 않고 데이터 그대로 보존합니다. list 프로시저는 주어진 입력을 평가한 뒤 새로운 올바른 리스트를 만듭니다.

LISPEX
(list 'decision 'allow)
데이터와 집합 배우기

문자열, 벡터, 바이트

문자열은 유니코드 텍스트를 담습니다. 벡터는 순서 있는 원소를 인덱스로 꺼내 쓰는 자료이며 현재 프로필에서는 내용을 변경할 수 있습니다. 바이트벡터는 0부터 255까지의 바이트를 담고 변경할 수 없습니다. 아래에서 string-length는 문자열의 길이를 세고, vector-ref는 0부터 세는 인덱스로 원소 하나를 꺼냅니다.

LISPEX
(list (string-length "Lispex")
      (vector-ref #(red green blue) 1))
텍스트와 바이트 레퍼런스 보기

재귀와 고차 작업

재귀 · map · filter · fold · apply

데이터 구조를 쪼개어 처리할 때는 입력이 줄어드는 재귀 호출을 쓰고, 반복 변환에는 프로시저를 map, filter, fold에 넘겨줍니다. 올바른 꼬리 호출은 루프 모양 재귀를 지원합니다.

LISPEX
(map (lambda (n) (* n 10)) '(1 2 3))
데이터 파이프라인 만들기

다음 고급 주제

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

정확히 허용되는 토큰과 폼 형태는 리더 문법 문서와 핵심 형식 문서에 나와 있습니다. 차근차근 따라가는 안내가 필요하다면 학습 경로로 다시 돌아가면 됩니다.