명료함과 쓰는 즐거움을 위해 설계된 작은 리스프, 리스펙스에 오신 것을 환영합니다.
리스펙스는 리스프의 강력함과 단순함을 현대적으로 다시 읽은 언어입니다. "코드가 곧 데이터"라는 핵심은 이어받고, 그 둘레에 쌓이기 쉬운 장치들은 덜어냈습니다. 작고 일관된 문법은 손에 익고 나면 좀처럼 길을 막지 않습니다.
하나의 언어, 하나의 문법
리스펙스는 특별한 구문을 버리고 원칙 하나만 따릅니다. 모든 것을 괄호 ()로 감싸 적습니다. 숫자 계산, 함수 정의, 조건문, 데이터 목록까지 전부 같은 'S-표현식' 모양을 씁니다.
문법이 하나면 코드 자체가 구조를 그대로 드러내는 '데이터'가 됩니다. 코드를 읽고 분석하기 쉬워지고, 프로그램이 다른 프로그램을 만들고 고치는 메타프로그래밍도 자연스러워집니다. 리스프의 오랜 생각인 '코드가 곧 데이터'를 리스펙스는 이렇게 가장 수수한 모양으로 구현합니다.
리스펙스란?
리스펙스는 '리스프 익스프레션' 의 줄임말입니다. 이름 그대로 프로그램을 리스프 표현식으로 적고, 그 표현식을 데이터처럼 읽고 다룰 수 있게 둡니다.
외워야 할 특별한 구문은 많지 않습니다. 값, 호출, 조건문, 정의, 인용된 데이터가 모두 같은 S-표현식 모양을 씁니다.
리스펙스가 바라는 것은 소박하고 구체적입니다. 소스가 검사하기 쉬울 만큼 문법을 작게 유지하는 일입니다.
리스펙스 맛보기
리스펙스의 일관된 문법이 어떻게 동작하는지 간단한 예제로 확인해 보세요. 아래 코드는 숫자 리스트에서 짝수만 필터링한 후, 각 숫자에 10을 곱하는 예제입니다. 리스펙스는 브라우저에서 그대로 실행되는 레퍼런스 인터프리터를 제공하므로, 아래 코드는 플레이그라운드에서 바로 실행해 볼 수 있습니다.
;; 모든 코드는 핵심 구문과 표준 라이브러리 함수로 구성됩니다.
(define numbers '(1 2 3 4 5 6))
;; 짝수만 필터링합니다.
(define evens
(filter (lambda (n) (= (modulo n 2) 0))
numbers))
;; 각 짝수에 10을 곱합니다.
(map (lambda (n) (* n 10)) evens)
;; ⇒ (list 20 40 60)예제는 위에서 아래로 하나의 데이터 파이프라인처럼 읽힙니다. 필터를 거쳐 맵으로 이어지고, 그 사이를 가로막는 다른 문법은 없습니다.
주요 강점
- 바로 실행. Rust로 짠 레퍼런스 인터프리터가 WebAssembly로 컴파일되어 브라우저에서 그대로 돌아갑니다. 설치 없이 플레이그라운드에서 코드를 쓰고 결과를 바로 봅니다.
- 작고 예측 가능한 코어. 최소한의 핵심 구문과 결정론적 변환 규칙 덕분에 배우기 쉽고 동작을 내다보기 쉽습니다.
- 통일된 S-표현식. 코드와 데이터가 같은 구조라서 코드 분석, 변환, 생성이 단순해집니다.
- 실용적인 표준 라이브러리. 순수한 코어 언어와 명시적인 입출력, 시스템 모듈을 분리해 코어는 안정되게, 실제 프로그램은 실용적이게 지켰습니다.
다음 단계
이제 리스펙스로 여정을 시작할 준비가 되셨나요?
- 플레이그라운드에서 레퍼런스 인터프리터로 리스펙스 코드를 브라우저에서 바로 실행해 보세요.
- 시작하기에서 환경을 갖추고 첫 프로그램을 돌려 보세요.
- 구문에서 입력 문법의 토큰, 리터럴, 코어 폼과 파생 폼, 정규화 규칙을 확인하세요.
- v1.3에 더해진 리스펙스 바우치에서 검사 가능한 부분집합 위의 결정 규칙이 어떻게 오프라인으로 검사할 수 있는 영수증을 남기는지 살펴보세요.
- 연구 트랙은 CSKernel™에서 살펴보세요.
리스펙스로 무엇을 만들어낼지 기대됩니다.