언제 필요한가요?
식이 셀을 바꾸거나 출력하거나 오류를 내거나 아예 건너뛸 수 있다면 평가 순서가 중요합니다. 리스펙스는 순서를 고정해 같은 소스가 호스트 언어의 피연산자 관습에 좌우되지 않게 합니다.
실행으로 확인하기
LISPEX
(define x 0)
(list (begin (set! x 1) x) (begin (set! x (+ x 1)) x))관측 결과
OUTPUT
(1 2)예제 읽기
첫 begin이 x를 0에서 1로 바꾸고 1을 돌려줍니다. 그다음에야 두 번째 피연산자가 새 값을 읽어 1을 더하고 2를 저장해 돌려줍니다. 따라서 list는 차례로 1과 2를 받습니다.
이 순서로 생각하세요
let초기식은 바깥 환경에서 왼쪽부터 평가하고let*은 바인딩마다 확장하며letrec은 모든 셀을 먼저 할당합니다.- 시퀀스는 왼쪽부터 평가하며 마지막이 아닌 값 패킷은 버립니다.
and와or는 왼쪽부터 단락 평가하며#f만 거짓입니다.
빠르게 고르기
| 문맥 | 평가 순서 | 건너뛸 수 있는 것 |
|---|---|---|
| 프로시저 호출 | 연산자, 피연산자를 왼쪽부터 | 없음 |
begin | 폼을 왼쪽부터 | 없음; 앞선 값만 버림 |
if | 검사식 뒤 선택한 분기 하나 | 선택하지 않은 분기 |
and / or | 피연산자를 왼쪽부터 | 답이 정해진 뒤의 나머지 |
let | 바깥 스코프에서 초기식을 왼쪽부터 | 없음 |
let* | 초기식마다 바인딩하고 스코프 확장 | 없음 |
흔한 오해
리스펙스는 다른 Scheme 구현의 미지정 피연산자 순서를 상속하지 않습니다.
현재 경계
- 인자 수 오류는 규정된 연산자·피연산자 평가가 끝난 뒤 발생합니다.
다음으로
각 let의 스코프 차이는 바인딩에서, 의도적으로 일찍 멈추는 형식은 조건식에서 이어집니다.