고차 프로시저

map, filter, reduce, fold, for-each, 벡터·문자열 변형, apply는 규칙을 실행하는 프로그램이 쓰는 것과 같은 적용 경로로 게스트 프로시저를 호출합니다.

실행으로 확인하기

LISPEX
(fold-right cons (list) (list 1 2 3))

관측 결과

OUTPUT
(1 2 3)

이 순서로 생각하세요

  • 목록·문자열·벡터는 왼쪽부터 순회합니다. fold-right만 예외로, 오른쪽부터 (f element accumulator)를 호출합니다.
  • reducefold-left는 같은 왼쪽 fold이며 (f accumulator element)를 호출합니다.
  • all?any?는 답이 정해지는 즉시 멈추고 술어의 결과로 #t#f만 받습니다. filter는 일반 리스펙스 참값 규칙을 씁니다.
  • for-each는 효과를 내려고 실행합니다. 콜백이 값을 몇 개 내든 버리고, 자신은 0개 값을 반환합니다.
  • 콜백 오류와 일회용 탈출은 규칙을 실행하는 프로그램 안에서 처리됩니다. LIL은 프로시저를 호스트의 apply나 호스트 콜백으로 넘기지 않습니다.

콜백 계약

시그니처순회 / 결과값 컨텍스트
(map proc list)왼쪽부터, 새 올바른 리스트콜백 정확히 한 값
(filter predicate list)왼쪽부터, 유지 요소술어 정확히 한 값, #f만 제외
(all? predicate list), (any? predicate list)왼쪽부터 보다가 답이 나오면 중단, 엄격 불리언술어가 정확히 한 불리언
(reduce proc init list), (fold-left proc init list)왼쪽 누산콜백 정확히 한 값
(fold-right proc init list)오른쪽 누산콜백 정확히 한 값
(string-map proc string), (vector-map proc vector)왼쪽부터, 새 결과콜백 정확히 한 값, 문자열 결과는 문자여야 함
문자열/벡터/목록 for-each왼쪽부터 효과, 전체 0개 값콜백 결과를 버림
(apply proc arg ... final-list)공통 적용 디스패처, 꼬리 안전프로시저가 낸 값이 그대로 보존됨

흔한 오해

이 프로시저들은 컬렉션을 하나만 받습니다. 일부 Scheme이 주는 여러 목록 변형은 여기에 없습니다. 문자열 문자와 벡터 원소는 첫 콜백 전에 스냅샷하므로, 순회 도중 원본 벡터를 바꿔도 방문할 원소는 달라지지 않습니다.

다음으로

이 프로시저들을 하나의 파이프라인으로 엮는 과정은 가이드에 있고, 다른 계열과의 위치 관계는 색인에 있습니다.

map, filter, fold, apply 사용하기 · 프로시저 색인