나무모에 미러 (일반/밝은 화면)
최근 수정 시각 : 2025-11-10 23:50:23

S-표현식

S-expression에서 넘어옴

프로그래밍 언어 문법
{{{#!folding [ 펼치기 · 접기 ]
{{{#!wiki style="margin: 0 -10px -5px; word-break: keep-all"
프로그래밍 언어 문법
C(포인터 · 구조체 · size_t) · C++(이름공간 · 클래스 · 특성 · 상수 표현식 · 람다 표현식 · 템플릿/제약조건/메타 프로그래밍) · C# · Forth · Java · Python(함수 · 모듈) · Kotlin · MATLAB · SQL · PHP · JavaScript(표준 내장 객체, this) · Haskell(모나드) ·
마크업 언어 문법
HTML · CSS
개념과 용어
함수(인라인 함수 · 고차 함수 · 콜백 함수 · 람다식) · 리터럴 · 문자열 · 식별자(예약어) · 상속 · 예외 · 조건문 · 반복문 · 비트 연산 · 참조에 의한 호출 · eval · 네임스페이스 · 호이스팅
기타
#! · == · === · deprecated · GOTO · NaN · null · undefined · S-표현식 · 배커스-나우르 표기법 · 콰인(프로그래밍)
}}}}}}
프로그래밍 언어 목록 · 분류 · 문법 · 예제

1. 개요2. 특징3. 사용처4. 관련 문서

1. 개요

Symbolic expression, S-expression, sexpr

LISP 계열 프로그래밍 언어에서 사용되는 동형적(homoiconic) 문법 구조 및 자료구조.

2. 특징

기본적으로 heterogeneous한 배열들로 구현된 추상 구문 트리라고 생각할 수 있다. 소괄호를 사용해 각각의 배열을 구성하며, 각각의 배열은 트리의 node, 배열이 아닌 가장 작은 요소(atom이라 한다)들은 트리의 잎에 대응된다. 이 때 보통 맨 앞의 원소를 해당 노드의 타입으로 본다. 소괄호 안쪽의 원소끼리는 공백으로 구분한다.

아무 요소도 가지지 않는 배열 ()도 있을 수 있는데, 리스프 언어들에선 이를 흔히 nil이라고 한다.

배커스-나우르 표기법으로는 다음과 같이 간단하게 나타낼 수 있다.
<atom> ::= <ident> | <symbol> | <number> | <string>
<list> ::= ( <list-inner> )
<list-inner> ::= <list-inner> <s-expr> | ""
<s-expr> ::= <atom> | <list>
S-표현식의 일부는 아니지만 주석은 주로 ;으로 쓰는 편.

상술한 바와 같이 해당 소스의 AST의 문법 구조를 그대로 나타내는 동시에 자료구조로도 쓰일 수 있기에 동형적(homoiconic) 문법이라고 불린다. 이 특징을 활용해 '(quote)를 붙혀 문법 그대로 데이터를 나타낼 수도 있다. 가령 (f a b)f 함수에 인자 ab를 각각 넣어 호출하는 문법이지만, '(f a b)와 같이 쓰면 f, a, b를 요소로 가지는 배열이 된다.

이러한 특징을 가지는 S-표현식 또는 이에 기반한 문법을 사용하는 프로그래밍 언어를 전반적으로 LISP 방언(dialect), 또는 LISP-family라고 부른다.

3. 사용처

프로그래밍 언어가 아니더라도 여러 용도로 사용된다. 가령 쿼리 언어로 쓰이거나 AST 시각화, 때로는 명령어 집합을 나타내는 데 쓰이기도 한다. 단순 프로그래밍 언어의 경우 LISP 문서의 방언 문단 참고.

4. 관련 문서