코드를 읽는 방법

토큰 표기 오류와 형식 오류를 구분하고 평가가 시작되는 시점을 알아봅니다.

오류의 위치와 코드를 보고 토큰 표기를 고칠지, 식의 구조를 고칠지 판단할 수 있습니다. 인용한 리스트를 읽어 보고 읽기와 형식 검사와 평가에서 나는 오류를 비교해 보세요. 소스를 읽어 토큰과 값으로 바꾸는 단계를 리더라고 부릅니다.

리스트를 데이터로 읽기

아래 프로그램 전체를 플레이그라운드에 붙여 넣으세요.

LISPEX
'(alpha 1 2/3 #u8(4 5))

결과

출력
(alpha 1 2/3 #u8(4 5))

맨 앞의 인용 부호는 리스트를 데이터로 유지합니다. 리스트에는 심볼 alpha와 정수와 유리수와 바이트벡터가 들어 있습니다. 인용 부호를 빼면 프로시저를 호출하기 위해 alpha의 값을 찾습니다.

세 단계 구분하기

토큰은 alpha나 2/3처럼 소스 텍스트를 이루는 한 조각입니다. 리더는 토큰을 읽고 리스트 같은 데이터 구조로 묶습니다.

정규화기는 식의 구조를 검사하고 축약 문법을 핵심 형식으로 바꿉니다. 예를 들어 if에 검사식과 두 분기가 모두 있는지 확인합니다. 그다음 평가 단계에서 이름의 값을 찾고 프로시저를 호출해 결과를 계산합니다.

아래 예제는 각각 따로 실행하세요. 표에는 전체 메시지 대신 진단 코드를 적었습니다.

소스오류가 나는 단계고칠 부분
(list 01)리더, E100앞의 0을 빼고 1로 씁니다
(if #t 1)정규화기, E130(if #t 1 0)처럼 나머지 분기를 넣습니다
(alpha 1)평가, E300호출 전에 alpha를 정의합니다

마지막 행은 alpha를 정의하지 않은 경우입니다. 이 예제의 괄호와 토큰 표기는 올바릅니다.

소스 파일을 실행하면 리스펙스는 파일 전체를 읽고 정규화한 뒤 평가합니다. 읽기나 형식 검사에서 오류가 나면 앞에 적은 display도 실행하지 않습니다.

표기 고르기

원하는 것표기뜻
이름alpha값을 찾는 데 쓰는 심볼
텍스트"alpha"불변 문자열
데이터인 리스트'(alpha 1)빈 리스트 ()로 끝나는 연결된 쌍
다른 꼬리를 가진 쌍'(alpha . 1)꼬리가 1인 쌍 하나
인덱스로 찾을 값#(1 2)벡터
바이트#u8(1 2)불변 바이트벡터

리더는 문자와 준인용과 주석도 읽습니다. 각 표기와 수의 규칙은 코드 읽기 규칙 참조에 있습니다.

오류 위치 읽기

네이티브 진단은 코드와 파일과 줄과 열과 메시지를 보여 줍니다. bad-token.lspx 파일에 (list 01) 한 줄만 저장하세요. 네이티브 CLI를 설치한 뒤 실행합니다.

SH
lispex run bad-token.lspx

명령은 표준 오류에 다음 진단을 씁니다.

E100 bad-token.lspx:1:7 malformed numeric literal: `01`

종료 코드는 1입니다. 표준 출력은 비어 있고 새 파일은 만들지 않습니다. 열 번호 7은 01의 시작을 가리킵니다.

잘못된 토큰은 E100, 잘못된 이스케이프는 E150을 낼 수 있습니다. 유한한 범위를 벗어난 실수 표기는 읽기 중에 E314를 냅니다. 코드와 메시지를 함께 확인하세요.

소스는 UTF-8로 저장하세요. 잘못된 UTF-8은 읽기 전에 거부합니다. 리스펙스는 줄바꿈과 경로와 호출 애플리케이션의 인코딩을 자동 변환하지 않고 소스 표기를 유지합니다.

평가 순서 · 예약어와 금지 형식