기본 문법 형식

핵심 형식의 문법과 평가 순서, 결과와 오류를 찾아봅니다.

실행으로 확인하기

LISPEX
((lambda (x) (if #t x 0)) 42)

관측 결과

출력
42

lambda는 매개변수 x를 받는 프로시저를 만듭니다. 호출할 때 x에 42를 묶습니다. if는 #t를 검사한 뒤 x만 평가하므로 결과는 42입니다. 다른 분기인 0은 평가하지 않습니다.

플레이그라운드에서 예제를 실행해 보세요. 두 예제 모두 42를 반환합니다.

핵심 형식 읽기

형식은 프로그램을 이루는 문법 단위입니다. 핵심 형식은 리스펙스가 직접 평가하는 형식입니다. 인용과 변수 참조, if, 순차 실행, lambda, 호출, 대입, 정의, 어휘 바인딩, 제어 형식이 여기에 속합니다.

  • if에는 조건과 두 분기가 모두 필요합니다. begin과 프로시저 본문은 왼쪽부터 차례로 실행합니다.
  • lambda는 개수가 정해진 매개변수 리스트와 나머지 인자를 받는 점 표기 리스트를 지원합니다.
  • set!은 기존 셀의 값을 바꿉니다. 셀은 이름에 연결된 저장 공간입니다. define은 최상위 셀을 새로 만들거나 갱신합니다.
  • quote는 요소를 평가하지 않고 바꿀 수 없는 데이터를 반환합니다. 예를 들어 '(+ 1 2)는 리스트 (+ 1 2)를 반환합니다.

datum은 수나 심볼, 리스트처럼 하나로 읽는 데이터입니다. 아래 표의 quote 설명에서 이 용어를 씁니다.

최상위에 모듈 정의하기

LISPEX
(module doubling
  (export twice)
  (define (twice x) (* x 2)))

(twice 21)

관측 결과

출력
42

모듈 본문은 바깥 최상위의 일부가 되므로 (twice 21)을 모듈 밖에서도 호출할 수 있습니다. 본문에서 정의한 이름은 바깥과 같은 범위에서 쓰입니다. 모듈 이름이 별도 이름 공간을 만들지는 않습니다.

모듈은 (module 이름 (export 이름 ...) (import 이름 ...) 본문 ...)으로 씁니다. 선택 사항인 export와 import 절은 본문 앞에 둡니다. 리스펙스는 이 머리 절을 검사한 뒤 버리고 본문의 형식을 최상위에 놓습니다. 다른 형식 안에 module을 넣으면 E130이 납니다.

문법과 평가, 결과

형식인자와 평가결과 또는 오류
quotedatum 1개를 받으며 요소는 평가하지 않음바꿀 수 없는 datum
if조건과 참 분기, 거짓 분기를 받으며 조건을 먼저 평가선택한 분기가 낸 값들. 조건이 정확히 한 값을 내지 않으면 E320
lambda매개변수와 본문 형식 1개 이상클로저. 호출 인자 수가 다르면 E302
set!이름과 값 하나를 내는 식값 0개. 이름이 바인딩되지 않았으면 E303
let / letrec바인딩 리스트와 본문 형식 1개 이상마지막 본문 형식이 낸 값들. 초기화 전 letrec 바인딩을 읽으면 E321
module이름과 머리 절 0~2개, 본문 형식 1개 이상본문의 형식을 최상위에 놓음. 다른 위치에서는 E130

클로저는 자신이 만들어진 곳의 바인딩을 계속 사용할 수 있는 프로시저입니다. 매개변수는 프로시저에서, 셀과 범위는 바인딩에서 자세히 설명합니다. 어휘 바인딩에서는 이름을 찾는 범위를 프로그램 구조로 정합니다.

다음으로

리스펙스는 실행 전에 축약 문법을 핵심 형식으로 바꿉니다. 이 단계를 정규화라고 합니다. 기본 형식으로 풀리는 문법은 이 변환을, 표현식과 평가 순서는 각 부분의 실행 시점을 설명합니다.