오류의 위치와 코드를 보고 토큰 표기를 고칠지, 식의 구조를 고칠지 판단할 수 있습니다. 인용한 리스트를 읽어 보고 읽기와 형식 검사와 평가에서 나는 오류를 비교해 보세요. 소스를 읽어 토큰과 값으로 바꾸는 단계를 리더라고 부릅니다.
리스트를 데이터로 읽기
아래 프로그램 전체를 플레이그라운드에 붙여 넣으세요.
'(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를 설치한 뒤 실행합니다.
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은 읽기 전에 거부합니다. 리스펙스는 줄바꿈과 경로와 호출 애플리케이션의 인코딩을 자동 변환하지 않고 소스 표기를 유지합니다.