HTDP 스터디 블로그
Source: Dev.to
이 블로그는 과거 시험(2019–2024)과 HTDP / Racket 강의 규칙을 종합하여 정리한 학습 가이드입니다. 평가, 함수 설계, 데이터‑구동 템플릿, 재귀, 추상화, 로컬/클로저, 그리고 흔히 나오는 시험 함정을 중점적으로 다룹니다.
저자 주
이 블로그는 시험 준비 중 매일 기록한 노트와 실수 정리를 바탕으로 요약한 것입니다. 명확하고 가독성이 높으며 협업에 친화적인 코드를 작성하고, Racket 프로그램의 기본 실행 모델을 이해하는 데에 목적이 있습니다. 그래프, 누산기, 탐색 등 알고리즘 중심의 세 챕터는 다루지 않습니다. 해당 부분에 대해서는 가장 중요한 조언이: 직접 과거 문제지를 풀어보라는 것입니다. 알고리즘 내용에 특화된 별도의 블로그 포스트를 추후에 작성할 예정입니다.
Evaluation Questions (Step‑by‑Step Reduction)
Core Rules
- 모든 매개변수를 한 번에 대입한다.
define으로 정의된 상수는 순서대로 하나씩 대입한다.cond의 경우, 먼저 조건을 축소한 뒤 선택된 분기를 평가한다.or의 경우, 첫 번째 true 값이 나오면 평가를 중단한다.- 최종 값을 확인하기 위해 항상 프로그램을 실행한다.
함수 디버깅 질문
일반적인 수정 사항
- 프레디케이트 함수는
?로 끝나야 합니다.
자주 발생하는 버그
- 셀렉터에서 좌표가 뒤바뀜.
HTDD (데이터 설계 방법)
규칙
cond의 마지막 조건은else를 사용해야 합니다.
HTDW (월드 프로그램)
핵심 이벤트
- 키 값을 기준으로
cond를 사용해 키 이벤트를 처리하고, 마지막else케이스에서는 변경되지 않은 월드를 반환합니다.
팁
big-bang보다 먼저 렌더 함수가 정의되어야 합니다.
참조와 재귀 질문
자기 vs. 상호 참조
- Self‑recursive: 함수가 자신을 호출한다.
자연 재귀 신뢰
- 첫 번째 요소가 올바르면 나머지를 신뢰한다.
빈 기본 사례 (매우 중요)
- 빈 리스트의 합은
0을 반환한다.
추상화와 고차 함수
올바른 추상 함수 선택
- 리스트를 생성하는 것이 목표일 때
map또는filter를 사용합니다. - 값을 집계하는 것이 목표일 때
foldr또는foldl을 사용합니다. - 인덱스를 기반으로 리스트를 생성할 때
build-list를 사용합니다.
함수 시그니처
map:(X → Y) → (Listof X) → (Listof Y)filter:(X → Boolean) → (Listof X) → (Listof X)foldr:(X Y → Y) → Y → (Listof X) → Ybuild-list:Natural → (Natural → X) → (Listof X)
일반적인 오류
- 함수를 인수로 전달할 때 호출하지 말아야 합니다.
로컬, 클로저, 그리고 리프팅
클로저 정의
함수가 클로저가 되려면:
- 함수여야 한다.
- 매개변수에 명시되지 않은 변수를 사용한다.
- 그 변수들은 외부 스코프에서 온다.
평가 비용
- 루프 밖에서 정의된 것은 한 번 평가된다.
- 루프 안에서 정의된 것은 매 반복마다 평가된다.
Genrec (Generative Recursion)
포함해야 할 내용
- 기본 사례.
- 감소 단계.
- 종료 논증.
흔한 실수
- 잘못된 기본 사례는 잘못된 이미지나 값을 초래한다.
잘 형성된 데이터 정의
- 잘 형성되지 않음: (잘못된 정의의 예시)
- 잘 형성됨: (올바른 정의의 예시)
헬퍼 함수 — 언제 필요할까?
헬퍼 함수를 사용하는 경우:
- 비원시(primitive) 중첩 데이터를 참조할 때.
- 두 단계 처리 수행 시.
- 지식 영역을 전환할 때.
- 리스트나 트리와 같은 임의 크기의 데이터를 처리할 때.
Parameters vs. Arguments vs. Operands
- Parameter: 함수 정의에 있는 이름.
- Argument: 호출 지점에서 제공되는 실제 값.
- Operand: 연산자가 작동하는 값 (예:
+의 두 숫자).
시험 생존 체크리스트
- 템플릿을 엄격히 따르세요.
최종 조언
디자인을 올바르게 하고, 재귀를 신뢰하세요. HTDP 시험은 규율, 템플릿, 정확성을 보상합니다—교묘한 해킹이 아니라. 초보자로서 저는 이러한 기본 설계 원칙을 배우고, 앞으로의 프로그래밍에서 행동하고 협력적인 프로그래머로서 이를 확장함으로써 큰 보람을 느꼈습니다.