이 페이지는 지도처럼 쓰면 됩니다. 각 카드는 “지금 보고 있는 모양이 무엇인가?”에 답하고 정확한 동작을 설명하는 페이지로 이어집니다. 과정을 시작하기 전에 카드 내용을 미리 외울 필요는 없습니다.
리터럴과 주석
값 ; 주석수, 불리언, 문자열, 문자, 인용한 심볼은 예측 가능한 값으로 평가됩니다. 세미콜론이 나오면 그 자리부터 줄 끝까지 주석으로 처리합니다.
(list 42 #t "tea" #\T 'ready)
; 이 줄의 나머지는 무시됩니다호출과 겹친 식
(프로시저 인자 ...)맨 앞의 식이 실행할 프로시저를 정합니다. 연산자와 인자는 왼쪽에서 오른쪽으로 평가하고, 안쪽 호출이 끝난 뒤 바깥 폼이 그 값을 사용합니다.
(+ 10 (* 2 3))이름과 로컬 바인딩
define · let · let* · letrec최상위 이름에는 define을 쓰고, 나란한 로컬 입력에는 let을 씁니다. 앞선
바인딩이 필요한 순차 바인딩에는 let*을, 재귀적인 로컬 이름에는 letrec을
씁니다.
(let ((price 20) (fee 3))
(+ price fee))이름 붙인 프로시저와 lambda
(define (이름 x) 본문) · (lambda (x) 본문)프로시저도 하나의 값입니다. 단축된 정의 형식으로 최상위에 이름을 붙이거나
lambda를 써서 그 자리에서 만들 수 있습니다.
(define (double n) (* n 2))
(double 6)조건
if · cond · case · and · orif는 두 식 중 하나를 고르고, cond는 여러 검사를 위에서부터 확인합니다.
and와 or는 답이 정해지는 순간 멈춥니다. 오직 #f만 거짓입니다.
(if (>= 62 50) 'free 'standard)인용 데이터와 리스트
'데이터 · (list 값 ...)작은따옴표는 폼을 실행하지 않고 데이터 그대로 보존합니다. list 프로시저는
주어진 입력을 평가한 뒤 새로운 올바른 리스트를 만듭니다.
(list 'decision 'allow)문자열, 벡터, 바이트
문자열은 유니코드 텍스트를 담습니다. 벡터는 순서 있는 원소를 인덱스로 꺼내 쓰는
자료이며 현재 프로필에서는 내용을 변경할 수 있습니다. 바이트벡터는 0부터 255까지의
바이트를 담고 변경할 수 없습니다. 아래에서 string-length는 문자열의 길이를 세고,
vector-ref는 0부터 세는 인덱스로 원소 하나를 꺼냅니다.
(list (string-length "Lispex")
(vector-ref #(red green blue) 1))재귀와 고차 작업
재귀 · map · filter · fold · apply데이터 구조를 쪼개어 처리할 때는 입력이 줄어드는 재귀 호출을 쓰고, 반복 변환에는
프로시저를 map, filter, fold에 넘겨줍니다. 올바른 꼬리 호출은 루프 모양
재귀를 지원합니다.
(map (lambda (n) (* n 10)) '(1 2 3))다음 고급 주제
| 궁금한 점 | 이어서 볼 페이지 |
|---|---|
| 클로저가 바뀌는 바인딩을 어떻게 공유하나요? | 바인딩, 셀, 변경과 클로저 |
1/3은 정확한데 (/ 1.0 3)은 왜 부정확한가요? | 정확수와 부정확수 |
| 계산 하나가 결과 두 개를 어떻게 내나요? | 다중 값 |
| 어떤 재귀가 일정한 스택을 쓰나요? | 올바른 꼬리 호출 |
| 탈출 연속은 언제 필요한가요? | 연속과 dynamic-wind |
| 끝없는 계산과 거대한 출력은 어떻게 멈추나요? | 결정성과 자원 |
정확히 허용되는 토큰과 폼 형태는 리더 문법 문서와 핵심 형식 문서에 나와 있습니다. 차근차근 따라가는 안내가 필요하다면 학습 경로로 다시 돌아가면 됩니다.