표현식과 평가 순서

평가 순서는 관측 가능하며 고정됩니다. 연산자를 먼저, 피연산자를 왼쪽에서 오른쪽으로 평가한 뒤 인자 수를 검사하고 프로시저에 진입합니다.

언제 필요한가요?

식이 셀을 바꾸거나 출력하거나 오류를 내거나 아예 건너뛸 수 있다면 평가 순서가 중요합니다. 리스펙스는 순서를 고정해 같은 소스가 호스트 언어의 피연산자 관습에 좌우되지 않게 합니다.

실행으로 확인하기

LISPEX
(define x 0)
(list (begin (set! x 1) x) (begin (set! x (+ x 1)) x))

관측 결과

OUTPUT
(1 2)

예제 읽기

beginx0에서 1로 바꾸고 1을 돌려줍니다. 그다음에야 두 번째 피연산자가 새 값을 읽어 1을 더하고 2를 저장해 돌려줍니다. 따라서 list는 차례로 12를 받습니다.

이 순서로 생각하세요

  • let 초기식은 바깥 환경에서 왼쪽부터 평가하고 let*은 바인딩마다 확장하며 letrec은 모든 셀을 먼저 할당합니다.
  • 시퀀스는 왼쪽부터 평가하며 마지막이 아닌 값 패킷은 버립니다.
  • andor는 왼쪽부터 단락 평가하며 #f만 거짓입니다.

빠르게 고르기

문맥평가 순서건너뛸 수 있는 것
프로시저 호출연산자, 피연산자를 왼쪽부터없음
begin폼을 왼쪽부터없음; 앞선 값만 버림
if검사식 뒤 선택한 분기 하나선택하지 않은 분기
and / or피연산자를 왼쪽부터답이 정해진 뒤의 나머지
let바깥 스코프에서 초기식을 왼쪽부터없음
let*초기식마다 바인딩하고 스코프 확장없음

흔한 오해

리스펙스는 다른 Scheme 구현의 미지정 피연산자 순서를 상속하지 않습니다.

현재 경계

  • 인자 수 오류는 규정된 연산자·피연산자 평가가 끝난 뒤 발생합니다.

다음으로

let의 스코프 차이는 바인딩에서, 의도적으로 일찍 멈추는 형식은 조건식에서 이어집니다.

바인딩과 스코프 · 조건식