리스펙스

리스프의 본질을 일관된 언어로 만든 리스펙스. 브라우저에서도 CLI에서도 같은 기준 인터프리터로 실행됩니다.

이전 문서입니다. 현재 소개와 수업은 소개와 학습 경로에서 확인하세요.

명료함과 쓰는 즐거움을 위해 설계된 리스프인 리스펙스에 오신 것을 환영합니다.

리스펙스는 리스프의 강력함과 단순함을 현대적으로 다시 읽은 언어입니다. "코드가 곧 데이터"라는 핵심은 이어받고, 그 둘레에 쌓이기 쉬운 장치들은 덜어냈습니다. 규칙적이고 일관된 문법은 손에 익고 나면 좀처럼 길을 막지 않습니다.

하나의 언어, 하나의 문법

리스펙스는 특별한 구문을 버리고 원칙 하나만 따릅니다. 모든 것을 괄호 ()로 감싸 적습니다. 숫자 계산, 함수 정의, 조건문, 데이터 목록까지 전부 같은 'S-표현식' 모양을 씁니다.

문법이 하나면 코드 자체가 구조를 그대로 드러내는 '데이터'가 됩니다. 코드를 읽고 분석하기 쉬워지고, 프로그램이 다른 프로그램을 만들고 고치는 메타프로그래밍도 자연스러워집니다. 리스프의 오랜 생각인 '코드가 곧 데이터'를 리스펙스는 이렇게 가장 수수한 모양으로 구현합니다.

리스펙스란?

리스펙스는 '리스프 익스프레션' 의 줄임말입니다. 이름 그대로 프로그램을 리스프 표현식으로 적고, 그 표현식을 데이터처럼 읽고 다룰 수 있게 둡니다.

외워야 할 특별한 구문은 많지 않습니다. 값, 호출, 조건문, 정의, 인용된 데이터가 모두 같은 S-표현식 모양을 씁니다.

리스펙스는 소스의 구조를 직접 검사할 수 있도록 문법을 명시적으로 유지합니다.

리스펙스 맛보기

리스펙스의 일관된 문법이 어떻게 동작하는지 완전한 예제로 확인해 보세요. 아래 코드는 숫자 리스트에서 짝수만 필터링한 후 각 숫자에 10을 곱합니다. 리스펙스는 브라우저에서 그대로 실행되는 기준 인터프리터를 제공하므로 아래 코드는 플레이그라운드에서 바로 실행해 볼 수 있습니다.

LISPEX
;; 모든 코드는 핵심 구문과 표준 라이브러리 함수로 구성됩니다.

(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)

예제는 위에서 아래로 하나의 데이터 파이프라인처럼 읽힙니다. 필터를 거쳐 맵으로 이어지고, 그 사이를 가로막는 다른 문법은 없습니다.

주요 강점

  • 바로 실행. 리스펙스는 브라우저에서 바로 실행됩니다. 설치 없이 플레이그라운드에서 코드를 쓰고 결과를 바로 봅니다.
  • 예측 가능한 코어. 핵심 폼과 결정론적 변환 규칙 덕분에 배우기 쉽고 동작을 내다보기 쉽습니다.
  • 갱신된 v1.4 런타임 경로. 플레이그라운드, npm CLI, 네이티브 인터프리터가 다중 값, apply, modulo, 문자열 포맷 경로까지 함께 넓어진 실행 표면을 씁니다.
  • 통일된 S-표현식. 코드와 데이터가 같은 구조라서 코드 분석, 변환, 생성이 단순해집니다.
  • 실용적인 표준 라이브러리. 순수한 코어 언어와 명시적인 입출력, 시스템 모듈을 분리해 코어는 안정되게, 실제 프로그램은 실용적이게 지켰습니다.

다음 단계

이제 리스펙스로 여정을 시작할 준비가 되셨나요?

  • 플레이그라운드에서 레퍼런스 인터프리터로 리스펙스 코드를 브라우저에서 바로 실행해 보세요.
  • 시작하기에서 환경을 갖추고 첫 프로그램을 돌려 보세요.
  • 구문에서 입력 문법의 토큰, 리터럴, 코어 폼과 파생 폼, 정규화 규칙을 확인하세요.
  • v1.3에서 시작된 리스펙스 바우치에서 고정 검사 프로필의 결정 규칙이 어떻게 오프라인으로 검사할 수 있는 영수증을 남기는지 살펴보세요.
  • 연구 트랙은 코어 시맨틱 커널에서 살펴보세요.

리스펙스로 무엇을 만들어낼지 기대됩니다.