sicp.io
1.1.5 · 조건식과 술어

술어가 참으로 만드는 작업 경로는 하나뿐이다.

if와 cond와 결합한 술어로 한 갈래를 고르고 and와 or가 더 이상 필요하지 않은 식 앞에서 멈추는 과정을 관찰합니다.

생각해 볼 질문

프로그램은 가능한 모든 갈래의 작업을 먼저 실행하지 않고 어떻게 하나의 결정을 내릴까요?

  • 술어를 뒤의 평가 경로를 제어하는 식으로 읽기
  • 처음 일치하는 cond 절과 else 갈래 따라가기
  • 전제 조건을 만족하지 않는 연산을 if로 보호하기
  • Scheme 호환 리스펙스 코드에서는 #f만 거짓임을 기억하기
  • 명시적인 부작용으로 단락 평가 관찰하기

조건식은 가능한 답을 모두 계산한 뒤 하나를 고르지 않습니다. 검사를 평가하고 한 경로만 선택하며 다른 경로는 평가하지 않습니다. classify는 cond 술어를 위에서 아래로 확인합니다. safe-ratio는 분모가 0일 때 나눗셈을 실행하지 않습니다. 인용한 기호 non-false는 #f가 아니므로 참 갈래를 선택합니다.

and와 or는 평범한 프로시저가 아니라 제어 형식입니다. and는 첫 거짓 값에서 멈추고 or는 첫 #f가 아닌 값에서 멈춥니다. 두 번째 프로그램은 실제로 닿은 피연산자만 기록하여 실행하지 않은 식을 기록의 부재로 드러냅니다. 이 유한 실행은 선택한 경로와 단락 평가 순서를 정확히 기록합니다.

SICP 코드UTF-8 468 / 1,048,576바이트
예제
결과
출력
진단
실행 추적0 / 0 개 이벤트
    실행은 브라우저 안에서 이루어지며 프로그램 결과와 실행 추적을 보여줍니다.
    예상 결과

    첫 프로그램은 (negative zero small-positive large-positive undefined 5 truthy)를 반환합니다. 두 번째 프로그램은 (#f selected (or-ran and-ran))을 반환하며 skipped로 끝나는 두 레이블은 visits에 들어가지 않습니다.

    실행 추적에서 볼 점

    각 술어 뒤에서 선택된 갈래를 찾으세요. 분모가 0일 때 나눗셈 식의 적용이 없는지 확인하세요. 단락 프로그램에서는 and의 첫 #f와 or의 첫 #f가 아닌 값을 찾고 두 skipped record! 호출에 대응하는 적용 이벤트가 없는지 확인하세요.

    직접 해보기

    프로그램을 수정하고 결과를 비교해 보세요.

    between? 술어를 추가하고 cond 안에서 음수, 0, 한 자리 양수, 두 자리 양수, 더 큰 수를 구분하세요. 반드시 거짓인 and 피연산자 뒤에 record! 호출을 하나 더 넣고 실행 여부를 먼저 예상하세요.

    힌트 보기

    하한과 상한 비교를 and로 묶어 도우미 술어를 만들 수 있습니다. 거짓인 and 피연산자 뒤의 식은 그 평가에서 도달하지 않습니다.

    이 수업 완료하기

    이 장의 총 18개 수업 중 0개 완료0%