필요한 문법 예제와 결과를 찾고 링크를 따라 자세한 규칙을 읽으세요. 프로그램을 작성하면서 참고할 수 있도록 카드별로 묶었습니다.
각 카드의 예제 전체를 플레이그라운드에서 따로 실행하세요. 예제 아래 결과는 그곳에 표시되는 값입니다.
리터럴과 주석
값 ; 주석(list 42 #t "tea" #\T 'ready)
; 이 줄의 나머지는 무시됩니다결과
(42 #t "tea" #\T ready)수와 불리언과 문자열과 문자는 그대로 적을 수 있습니다.
'ready의 작은따옴표는 ready를 심볼 값으로 만듭니다.
세미콜론부터 줄 끝까지는 주석입니다.
호출과 겹친 식
(프로시저 인자 ...)(+ 10 (* 2 3))결과
16안쪽 호출 (* 2 3)의 결과는 6이므로 바깥 호출은 10과 6을 더합니다.
프로시저 호출의 첫 식은 실행할 프로시저를 고릅니다.
그 식과 인자는 왼쪽에서 오른쪽으로 평가합니다.
이름과 지역 값
define · let · let* · letrec(let ((재단-너비 20) (도련 3))
(+ 재단-너비 도련))결과
23let은 값에 지역 이름을 붙입니다. 여기서 재단-너비는 20, 도련는 3입니다.
초깃값 식은 바깥 범위의 이름을 사용하므로 서로의 새 이름을 참조할 수 없습니다.
최상위 이름에는 define을 씁니다.
뒤의 지역 값이 앞의 이름을 참조해야 하면 let*을 쓰고 재귀적인 지역 정의에는 letrec을 씁니다.
이름 붙인 프로시저와 lambda
(define (이름 x) 본문) · (lambda (x) 본문)(define (double n) (* n 2))
(double 6)결과
12define은 프로시저 이름과 인자를 정합니다. 여기서 double은 받은 인자에 2를 곱합니다.
프로시저도 값입니다. 이름 없이 만들려면 lambda를 씁니다.
조건
if · cond · case · and · or(if (< 1 2) 'next-page 'keep)결과
next-pageif는 남은 1줄이 2줄보다 적으므로 'next-page를 고릅니다.
cond는 여러 조건을 차례로 확인하고 case는 일치하는 값으로 분기를 고릅니다.
and와 or는 결과가 정해지면 멈춥니다. #f만 거짓으로 취급합니다.
인용 데이터와 리스트
'데이터 · (list 값 ...)(list 'decision 'allow)결과
(decision allow)작은따옴표는 데이터를 평가하지 않고 유지합니다.
여기서 'decision과 'allow는 심볼 값입니다.
list는 인자를 평가한 값을 새 리스트에 담습니다.
문자열, 벡터, 바이트
(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(map (lambda (n) (* n 10)) '(1 2 3))결과
(10 20 30)map은 리스트의 각 원소에 프로시저를 적용하고 결과를 리스트로 돌려줍니다.
filter는 원소를 고르고 fold는 원소를 누적 값으로 합칩니다.
apply는 리스트에 든 값들을 인자로 삼아 프로시저를 호출합니다.
재귀 프로시저는 자신을 호출합니다. 꼬리 호출은 호출 스택을 늘리지 않고 재귀 호출을 반복하게 합니다.
더 자세히 알아보기
| 궁금한 점 | 이어서 볼 페이지 |
|---|---|
| 프로시저끼리 바뀌는 값을 어떻게 공유하나요? | 바인딩, 셀, 변경과 클로저 |
1/3은 정확한데 (/ 1.0 3)은 왜 부정확한가요? | 정확한 수와 근삿값 |
| 계산 하나가 결과 두 개를 어떻게 내나요? | 다중 값 |
| 어떤 재귀가 일정한 스택을 쓰나요? | 올바른 꼬리 호출 |
| 계산 도중에 어떻게 빠져나오나요? | 연속과 dynamic-wind |
| 끝없는 계산과 거대한 출력은 어떻게 멈추나요? | 결정성과 자원 |
정확히 허용되는 토큰과 형식은 코드 읽기 규칙 참조 문서와 기본 문법 형식 문서에 나와 있습니다. 차근차근 따라가는 안내가 필요하다면 학습 경로로 다시 돌아가면 됩니다.