S-표현식
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
S-표현식(S-expression)은 존 매카시가 리스프 프로그래밍 언어에서 사용하기 위해 개발한 표기법이다. 리스프 계열 언어에서 코드와 데이터를 표현하는 데 사용되며, 괄호로 묶인 구문을 사용하여 원자 또는 쌍으로 구성된다. S-표현식은 DSSSL, IMAP, WebAssembly 등 다양한 분야에서 활용되었으며, 론 리베스트는 S-표현식의 표준화를 시도했다. S-표현식은 XML과 비교되기도 하며, 리스프에서는 READ 함수를 통해 읽고 PRINT 함수를 통해 출력할 수 있다.
더 읽어볼만한 페이지
- 리스프 - AI 겨울
AI 겨울은 인공지능 연구에 대한 자금 지원과 관심이 크게 감소했던 시기를 가리키며, 기계 번역의 어려움, 신경망의 한계, 전문가 시스템 문제, 5세대 컴퓨터 실패 등의 요인으로 여러 차례 침체기를 겪었으나, 2000년대 이후 음성 및 이미지 인식 분야에서 성과를 거두며 부흥했고, 2022년 이후 대규모 언어 모델 등장으로 관심과 투자가 폭발적으로 증가했다. - 리스프 - 리스프 머신
리스프 머신은 Lisp 언어의 효율적인 실행을 위해 설계된 컴퓨터 시스템으로, 인공지능 연구와 컴퓨터 그래픽스 분야에 영향을 미쳤으나 상업적 성공은 거두지 못했고, 기술적 유산은 현재까지 연구되고 있다. - 데이터 직렬화 포맷 - XML
XML은 태그 중첩 방식 구문을 사용하는 범용 언어로서, 인터넷을 통한 구조화된 문서 및 데이터 공유를 용이하게 하고, 웰 폼 및 유효 XML 문서 개념을 통해 구문 정확성을 검사하며, 데이터 교환 등 다양한 분야에서 널리 사용된다. - 데이터 직렬화 포맷 - YAML
YAML은 2001년에 제안된 데이터 직렬화 형식으로, 가독성이 좋고 다양한 프로그래밍 언어에서 사용되며 JSON과 유사하지만, 주석 및 확장 기능 등을 제공하며 직렬화 속도가 느리다는 특징을 갖는다.
S-표현식 | |
---|---|
기본 정보 | |
유형 | 데이터 직렬화 형식 |
개발자 | 존 매카시 마빈 민스키 |
첫 번째 구현 | 1950년대 후반 |
설계 영감 | 람다 대수 |
확장자 | .sexp, .scm, .lisp, .lsp, .cl |
MIME 형식 | application/x-sexp |
특징 | |
기본 데이터 유형 | 원자 리스트 |
일반적인 사용 분야 | 데이터 표현 구성 파일 프로그래밍 언어 통신 프로토콜 |
설명 | |
정의 | S-표현식(영어: S-expression, symbolic expression의 줄임말) 또는 S식(S式)은 컴퓨터 과학에서 데이터를 표현하는 표기법이다. |
역사 | S-표현식은 존 매카시가 1950년대 후반에 인공지능 연구를 위해 개발한 프로그래밍 언어인 LISP에서 처음 사용되었다. 현재는 LISP의 파생어인 Scheme과 같은 언어에서 데이터를 표현하는 데 사용된다. 또한 EMACS LISP와 같은 구성 파일과 통신 프로토콜과 같은 마크업 언어로도 사용된다. |
형식 | S-표현식은 원자 또는 리스트로 구성된다. 원자는 숫자, 기호, 문자열 등이 될 수 있다. 리스트는 괄호 안에 묶인 S-표현식의 시퀀스이다. |
예시 | (foo bar baz) (1 2 (3 4)) (define (fact x) (if (= x 0) 1 (* x (fact (- x 1))))) |
장점 | 단순하고 일관된 구문 사람이 읽고 쓰기 쉬움 기계가 구문 분석하고 처리하기 쉬움 |
단점 | 괄호가 많아서 가독성이 떨어질 수 있음 데이터 유형을 명시적으로 지정하지 않음 |
관련 용어 | |
관련 용어 | 추상 구문 트리 |
2. 역사
1997년 5월, 론 리베스트는 S-표현식을 위한 인터넷 초안[10]을 RFC로 출판하고자 제출했다. 이 초안은 리스프 S-표현식에 기반을 둔 문법을 정의했지만, 특정 프로그래밍 언어를 위한 것이 아닌, 일반적인 데이터 저장 및 교환[11]을 목적으로 설계되었다. 비록 RFC로 승인되지는 않았지만, 다른 RFC 문서들[12]과 여러 출판물[13]에서 참조되거나 인용되었다.
리베스트의 형식은 S-표현식을 옥텟 문자열(바이트의 나열) 또는 다른 S-표현식의 유한 리스트로 정의한다. 이 구조를 표현하기 위한 세 가지 교환 형식을 제시했는데, 다음과 같다.
- 향상된 전달(advanced transport): 매우 유연한 형식으로, 리스프 표현식과 문법적으로 유사하지만 완전히 동일하지는 않다. 옥텟 문자열을 표현할 때, verbatim 문자열, 이스케이프 문자를 허용하는 따옴표로 묶인 형식, 십육진법, 베이스64 인코딩, 또는 특정 조건을 만족하는 "토큰"을 사용할 수 있다. 리베스트의 토큰은 편의를 위해 만들어졌고 다른 문자열과 동일하게 취급되지만, 리스프의 토큰은 문법적인 의미를 가진다는 점에서 차이가 있다.
- 정규 표현(canonical representation): 간결하고 분석이 용이하며, 모든 추상 S-표현식에 대해 유일한 표현을 의도한 형식이다. 이 형식은 verbatim 문자열만 허용하며, 문자열 외부의 공백 사용을 금지한다.
- 기본 전달 표현(basic transport representation): 정규 표현이거나, 정규 표현을 베이스64로 인코딩하고 대괄호로 둘러싼 형태이다. 이는 정규적으로 인코딩된 S-표현식을 문자열 간격을 변경하는 시스템(예: 80글자를 초과하는 줄을 줄바꿈하는 이메일 시스템)에서 안전하게 전달하기 위해 사용된다.
이 형식은 SPKI 외에는 널리 채택되지 않았다. 리베스트의 [http://theory.lcs.mit.edu/~rivest/sexp.html S-expressions 웹페이지]에서는 C로 작성된 파서와 생성기 소스 코드를 제공한다. 이 파서와 생성기는 저작권이 불분명하지만, 이론적으로 다른 시스템에 적용될 수 있다. 그러나 이 형식을 독립적으로 구현하는 데 제약은 없다.
Common Lisp(ANSI 표준 문서 ANSI INCITS 226-1994 (R2004)), Scheme (R5RS 및 R6RS[5]), ISLISP 등 일부 리스프 계열 언어들의 표준에는 S-표현식 구문 사양이 포함되어 있다.
2. 1. 표준화 노력
1997년 5월, 론 리베스트는 S-표현식을 위한 인터넷 초안[10]을 RFC로 출판하고자 제출했다. 이 초안은 리스프 S-표현식에 기반을 둔 문법을 정의했지만, 특정 프로그래밍 언어를 위한 것이 아닌, 일반적인 데이터 저장 및 교환을 목적[11]으로 설계되었다. 비록 RFC로 승인되지는 않았지만, 다른 RFC 문서들[12]과 여러 출판물[13]에서 참조되거나 인용되었다.리베스트의 형식은 S-표현식을 옥텟 문자열(바이트의 나열) 또는 다른 S-표현식의 유한 리스트로 정의한다. 이 구조를 표현하기 위한 세 가지 교환 형식을 제시했는데, 다음과 같다.
- 향상된 전달(advanced transport): 매우 유연한 형식으로, 리스프 표현식과 문법적으로 유사하지만 완전히 동일하지는 않다. 옥텟 문자열을 표현할 때, verbatim 문자열, 이스케이프 문자를 허용하는 따옴표로 묶인 형식, 십육진법, 베이스64 인코딩, 또는 특정 조건을 만족하는 "토큰"을 사용할 수 있다. 리베스트의 토큰은 편의를 위해 만들어졌고 다른 문자열과 동일하게 취급되지만, 리스프의 토큰은 문법적인 의미를 가진다는 점에서 차이가 있다.
- 정규 표현(canonical representation): 간결하고 분석이 용이하며, 모든 추상 S-표현식에 대해 유일한 표현을 의도한 형식이다. 이 형식은 verbatim 문자열만 허용하며, 문자열 외부의 공백 사용을 금지한다.
- 기본 전달 표현(basic transport representation): 정규 표현이거나, 정규 표현을 베이스64로 인코딩하고 대괄호로 둘러싼 형태이다. 이는 정규적으로 인코딩된 S-표현식을 문자열 간격을 변경하는 시스템(예: 80글자를 초과하는 줄을 줄바꿈하는 이메일 시스템)에서 안전하게 전달하기 위해 사용된다.
이 형식은 SPKI 외에는 널리 채택되지 않았다. 리베스트의 [http://theory.lcs.mit.edu/~rivest/sexp.html S-expressions 웹페이지] 에서는 C로 작성된 파서와 생성기 소스 코드를 제공한다. 이 파서와 생성기는 저작권이 불분명하지만, 이론적으로 다른 시스템에 적용될 수 있다. 그러나 이 형식을 독립적으로 구현하는 데 제약은 없다.
Common Lisp(ANSI 표준 문서 ANSI INCITS 226-1994 (R2004)), Scheme (R5RS 및 R6RS[5]), ISLISP 등 일부 리스프 계열 언어들의 표준에는 S-표현식 구문 사양이 포함되어 있다.
3. 구조 및 구문
1997년 5월, 론 리베스트는 RFC로 출판하기 위해 인터넷 드래프트[10]를 제출하였다. 이 문서는 리스프 S-표현식에 기초하여 문법을 정의했지만, 특정 프로그래밍 목적이 아닌 일반적인 데이터 저장 및 교환을 위해 작성되었다.[11] 비록 RFC로 인정받지는 못했지만, 다른 RFC 문서들[12]과 여러 문서에서 참조되거나 인용되었다.[13]
리베스트의 형식은 S-표현식을 octet-문자열 (바이트의 나열) 또는 다른 S-표현식의 유한한 리스트로 정의한다. 이 구조를 표현하기 위한 세 가지 교환 형식은 다음과 같다.
- 향상된 전달(advanced transport): 매우 유연하며 리스프의 표현식과 문법적으로 유사하지만 완전히 동일하지는 않다. 예를 들어, octet-문자열을 verbatim (문자열의 길이 뒤에 콜론이 나오고 그 뒤에 원래의 문자열 전체가 나오는 형식), escape 문자들을 허용하는 따옴표로 둘러싸인 형식, 십육진법, 베이스64로 나타내거나 특정한 조건을 만족하는 "토큰"으로 바로 나타낼 수 있다. (리베스트의 토큰은 편의를 위해 만들어졌고 다른 문자열들과 정확히 같게 취급되지만, 리스프의 토큰은 명확한 문법적인 의미를 가진다는 점에서 다르다.)
- 정규 표현(canonical representation): 더 간결하고 분석하기 쉬우며, 모든 추상 S-표현식에 대해 유일하게 표현하기 위해 만들어졌다. 이 형식은 오직 verbatim 문자열만 허용하고 문자열 바깥에서 whitespace 사용을 금지한다.
- 기본 전달 표현(basic transport representation): 정규 표현이거나 정규 표현을 베이스64로 인코딩하고 대괄호로 둘러싼 것이다. 후자는 정규적으로 인코딩된 S-표현식을 문자열 간격을 바꾸는 시스템 (예를 들어, 80 글자를 넘는 줄은 줄바꿈을 하는 이메일 시스템)에서 안전하게 전달하기 위한 것이다.
이 형식은 SPKI 이외에는 널리 받아들여지지 않았다. 리베스트의 [http://theory.lcs.mit.edu/~rivest/sexp.html S-expressions 웹페이지]에서 C로 작성된 파서와 생성기 소스 코드를 제공한다.
S-표현식은 리스프 계열 프로그래밍 언어에서 소스 코드와 데이터를 모두 표현하는 데 사용된다. 또한 DSSSL과 같은 Lisp 파생 언어, IMAP 및 존 매카시의 CBCL과 같은 통신 프로토콜의 마크업 언어, 그리고 WebAssembly의 텍스트 표현으로도 사용된다. 구문 및 지원되는 데이터 타입의 세부 사항은 언어마다 다르지만, 이러한 언어에서 가장 일반적인 특징은 S-표현식 및 접두사 표기법을 사용한다는 것이다.
3. 1. 기본 구조
S-표현식은 고전적으로 다음과 같이 정의된다.[1]#
'x'
형태의 원자, 또는#
(''x'' . ''y'')
형태의 표현식. 여기서 ''x''와 ''y''는 S-표현식이다.이 정의는 LISP가 리스트를 각기 순서쌍인 일련의 "셀"로 표현하는 방식을 반영한다. 일반적인 리스트에서 ''y''는 다음 셀(있는 경우)을 가리키며, 이를 통해 리스트를 형성한다. 이 정의의 재귀 조항은 이 표현 방식과 S-표현식 표기법 모두 임의의 이진 트리를 표현할 수 있음을 의미한다. 그러나 이 표현 방식은 원칙적으로 순환 참조를 허용할 수 있으며, 이 경우 구조는 트리가 아니라 순환 그래프가 된다.
존 매카시의 원래 정의[1]에서는 "단일 삽입 공백이 있는 대문자 라틴 문자 및 숫자의 문자열" (문자열 및 숫자 리터럴의 하위 집합)로 표현되는 "구별 가능한 원자 기호의 무한 집합"이 존재한다고 가정했다.
대부분의 현대 sexpr 표기법은 보다 일반적인 인용 문자열을 허용하며, 2개 이상의 멤버가 있는 리스트를 표현하기 위해 축약된 표기법을 사용한다.
:
(''x'' ''y'' ''z'')
는 다음을 의미한다.
:
(''x'' . (''y'' . (''z'' . NIL)))
NIL
은 특수한 리스트 종료 객체이다 (또는 ()
로 작성하며, 이는 Scheme에서 유일한 표현이다.[4]).3. 2. 데이터 타입
S-표현식 형식은 다양한 데이터 형식을 지원하며, 여러 변형이 존재한다. 가장 널리 사용되는 데이터 형식은 다음과 같다.- 리스트와 쌍(Lists and Pairs): `(1 () (2 . 3) (4))`
- 심볼(Symbols): `with-hyphen` `?@!$` `|a symbol with spaces|`
- 문자열(Strings): `"Hello, world!"`
- 정수(Integers): `-9876543210`
- 부동 소수점 수(Floating-point numbers): `-0.0` `6.28318` `6.022e23`
`#` 문자는 구문 확장을 위해 접두사로 사용되는 경우가 많다. 예를 들어, `#x10`은 16진수 정수를, `#\C`는 문자를 나타낸다.
3. 3. 확장 구문
문자 `#`는 종종 구문 확장을 나타내는 데 사용된다. 예를 들어 16진수 정수는 `#x10`으로, 문자는 `#\C`와 같이 표현한다.[1]S-표현식 형식은 다양한 데이터 형식을 지원하며, 여러 변형된 형태를 가진다. 다음은 가장 널리 지원되는 형식이다.
형식 | 예시 |
---|---|
리스트와 쌍 | (1 () (2 . 3) (4)) |
심볼 | with-hyphen ?@!$ >a symbol with spaces| |
문자열 | "Hello, world!" |
정수 | -9876543210 |
부동 소수점 숫자 | -0.0 6.28318 6.022e23 |
Common Lisp[2] 및 Scheme[3]과 같은 현대 Lisp 방언은 ''데이터 레이블''을 통해 공유 구조나 순환 참조를 표현하는 구문을 제공한다. 데이터 레이블은 객체를 표시하여 다른 곳에서 재귀적으로 나타날 때 중복된 구조가 아닌 공유된 구조임을 나타낸다. 이를 통해 리더 또는 프린터가 순환을 감지하고 무한 재귀 없이 평가 또는 표시를 할 수 있도록 한다. 데이터 레이블 구문은 다음과 같다.
: `#n=(''x'' ''y'' . #n#)`
4. 리스프(Lisp)에서의 활용
리스프(Lisp)에서 S-표현식은 코드와 데이터를 모두 나타내는 데 사용된다. 리스프의 괄호로 묶인 구문에서 S-표현식은 고전적으로 다음과 같이 정의된다:[1]
# `''x''` 형태의 원자
# `(''x'' . ''y'')` 형태의 표현식 (여기서 ''x''와 ''y''는 S-표현식)
이 정의는 리스프가 리스트를 순서쌍인 "셀"들의 연속으로 표현하는 방식을 반영한다. 일반적인 리스트에서 ''y''는 다음 셀(있는 경우)을 가리켜 리스트를 형성한다. 이 정의의 재귀는 이 표현 방식과 S-표현식 표기법 모두 임의의 이진 트리를 표현할 수 있음을 의미한다. 그러나 이 방식은 원칙적으로 순환 참조를 허용할 수 있으며, 이 경우 구조는 트리가 아닌 순환 그래프가 된다. Common Lisp[2] 및 Scheme[3]과 같은 현대 리스프 방언은 ''데이터 레이블''을 통해 이러한 구문을 제공한다.
원자의 정의는 문맥에 따라 다르다. 존 매카시의 원래 정의[1]에서는 "단일 삽입 공백이 있는 대문자 라틴 문자 및 숫자의 문자열"로 표현되는 "구별 가능한 원자 기호의 무한 집합"이 있다고 가정했다.
대부분의 현대 sexpr 표기법은 더 일반적인 인용 문자열을 허용하며, 축약 표기법을 사용해 2개 이상의 멤버가 있는 리스트를 표현한다. 예를 들어, `(''x'' ''y'' ''z'')`는 `(''x'' . (''y'' . (''z'' . NIL)))`를 의미한다. 여기서 `NIL`은 특수한 리스트 종료 객체이다(`()`로 쓰기도 하며, Scheme에서는 이것이 유일한 표현이다[4]).
S-표현식은 DSSSL과 같은 리스프 파생 언어, IMAP 및 존 매카시의 CBCL과 같은 통신 프로토콜의 마크업 언어, 그리고 WebAssembly의 텍스트 표현 등에도 사용된다.
4. 1. 표현 방식
리스프(Lisp) 계열 프로그래밍 언어에서 소스 코드는 S-표현식(S-expression)으로 표현된다. S-표현식의 첫 번째 요소는 보통 연산자나 함수 이름이고, 나머지 요소들은 인수로 처리된다. 이러한 방식을 "전위 표기법" 또는 "폴란드 표기법"이라고 부른다.예를 들어, C에서 `4 == (2 + 2)`로 표현되는 부울식은 리스프의 S-표현식 전위 표기법으로는 `(= 4 (+ 2 2))`와 같이 표현된다.[1]
S-표현식을 데이터로 취급하기 위해 `quote` 연산자를 사용하거나, 더 간결하게는 작은따옴표(`'`)를 S-표현식 앞에 붙여 사용할 수 있다. 예를 들어, `(quote x)`는 `'x`와 동일하게 S-표현식 `x`를 데이터로 취급한다.
4. 2. 동형성(Homoiconicity)
리스프는 코드와 데이터를 모두 S-표현식으로 표현하기 때문에 동형성(Homoiconicity)을 가진다. 즉, 프로그램의 주요 표현이 언어 자체의 기본 데이터 구조와 동일한 형태를 띤다.[1]S-표현식은 원래 M-표현식으로 조작될 데이터만을 위해 사용될 예정이었다. 그러나 리스프의 첫 구현은 M-표현식을 S-표현식으로 인코딩한 인터프리터였고, 리스프 프로그래머들은 곧 코드와 데이터 모두에 S-표현식을 사용하는 데 익숙해졌다.
예를 들어, C에서 `4 == (2 + 2)`로 작성되는 부울 표현식은 리스프에서는 `(= 4 (+ 2 2))`와 같이 표현된다. 여기서 `=`는 같음을 비교하는 연산자이고, `+`는 덧셈 함수이다. 이처럼 S-표현식의 첫 번째 요소는 연산자 또는 함수 이름이 되고, 나머지 요소들은 인수로 취급되는 "접두사 표기법"(또는 "폴란드 표기법")을 사용한다.
이러한 동형성 덕분에 리스프는 매우 강력하고 유연한 언어가 되었다. 코드가 데이터와 같은 방식으로 표현되므로, 코드를 생성하고 조작하는 코드를 쉽게 작성할 수 있다.
4. 3. 예제 코드
lisp(defun factorial (x)
(if (zerop x) 1
(* x (factorial (- x 1)))))
```
```scheme
(define (factorial x)
(if (zero? x) 1
(* x (factorial (- x 1)))))
```
Common Lisp[2]과 Scheme[3] 같은 현대 리스프 방언들은 데이터 레이블을 통해 객체를 표시하여 공유 구조를 나타낼 수 있게 한다.
존 매카시의 원래 정의[1]에서는 "단일 삽입 공백이 있는 대문자 라틴 문자 및 숫자의 문자열" (문자열 및 숫자 리터럴의 하위 집합)로 표현되는 "구별 가능한 원자 기호의 무한 집합"이 존재한다고 가정했다.
현대 sexpr 표기법은 (구두점 또는 전체 유니코드를 포함하는) 보다 일반적인 인용 문자열을 허용하며, 2개 이상의 멤버가 있는 리스트를 표현하기 위해 축약된 표기법을 사용한다.
(''x'' ''y'' ''z'')
는 (''x'' . (''y'' . (''z'' . NIL)))
을 의미한다.NIL
은 특수한 리스트 종료 객체이다 (또는 ()
로 작성하며, 이는 Scheme에서 유일한 표현이다.[4]).Common Lisp 예제:
```lisp
(defun factorial (x)
(if (zerop x)
1
(* x (factorial (- x 1)))))
```
S-표현식으로 작성된 영어의 작은 하위 집합에 대한 간단한 문맥 자유 문법 예시는 다음과 같다.
```lisp
(((S) (NP VP))
((VP) (V))
((VP) (V NP))
((V) died)
((V) employed)
((NP) nurses)
((NP) patients)
((NP) Medicenter)
((NP) "Dr Chan"))
5. 파싱(Parsing)
Lisp에서 소스 코드를 나타낼 때 S-표현식의 첫 번째 요소는 보통 연산자 또는 함수 이름이며, 나머지 요소는 인수로 취급된다. 이를 "폴란드 표기법" 또는 "접두사 표기법"이라고 한다. 예를 들어, C에서 `4 == (2 + 2)`로 작성되는 부울 표현식은 Lisp의 S-표현식 기반 접두사 표기법에서는 `(= 4 (+ 2 2))`로 표시된다.
"원자"의 정확한 정의는 LISP와 같은 언어마다 다르다. 인용된 문자열은 보통 따옴표를 제외한 모든 것을 포함할 수 있으며, 인용되지 않은 식별자 원자는 일반적으로 따옴표, 공백 문자, 괄호, 대괄호, 중괄호, 백슬래시 및 세미콜론을 제외한 모든 것을 포함할 수 있다. 금지된 문자는 앞에 백슬래시를 붙여 이스케이프하여 포함할 수 있다. 유니코드 지원은 다양하다.
S-표현식 정의의 재귀적 사례는 전통적으로 cons 셀을 사용하여 구현된다.
S-표현식은 원래 M-표현식에 의해 조작될 데이터에만 사용하기 위한 것이었지만, Lisp의 첫 번째 구현은 M-표현식의 S-표현식 인코딩의 인터프리터였으며, Lisp 프로그래머는 곧 코드와 데이터 모두에 S-표현식을 사용하는 데 익숙해졌다. 이는 Lisp가 동형성을 가지고 있음을 의미한다. 즉, 프로그램의 주요 표현은 언어 자체의 기본 유형의 데이터 구조이기도 하다.
중첩된 목록은 S-표현식으로 작성할 수 있다. 예를 들어 `((milk juice) (honey marmalade))`는 요소가 2-요소 S-표현식이기도 한 2-요소 S-표현식이다. Lisp(및 이 문서)에서 사용되는 공백으로 구분된 표기법이 일반적이다. 줄 바꿈(개행 문자)은 일반적으로 구분 기호로 간주된다.
프로그램 코드는 일반적으로 접두사 표기법을 사용하여 S-표현식으로 작성할 수 있다.
5. 1. 파싱 알고리즘
S-표현식은 XML과 비교되는데, S-표현식은 점으로 구분된 쌍이라는 단일 형태의 포함 관계를 갖는 반면, XML 태그는 간단한 속성, 다른 태그 또는 CDATA를 포함할 수 있으며 각각 다른 구문을 사용한다는 점이 주요 차이점이다. 또 다른 차이점은 S-표현식은 참조 메커니즘을 정의하지 않는 반면, XML은 고유 식별자와 이에 대한 참조 개념을 제공한다는 것이다. 간단한 사용 사례의 경우 S-표현식이 XML보다 간단하지만, 더 발전된 사용 사례의 경우 XML은 XPath라는 쿼리 언어와 XML 데이터 처리를 단순화하는 많은 도구 및 타사 라이브러리를 가지고 있다.5. 2. Lisp Read 함수
S-표현식은 `READ` 함수를 사용하여 Lisp에서 읽을 수 있다. `READ`는 S-표현식의 텍스트 표현을 읽고 Lisp 데이터를 반환한다. `PRINT` 함수를 사용하여 S-표현식을 출력할 수 있다. 모든 인쇄된 데이터 객체가 읽을 수 있는 표현을 가질 때 `READ` 함수로 출력을 읽을 수 있다. Lisp는 숫자, 문자열, 심볼, 목록 및 기타 많은 데이터 유형에 대한 읽을 수 있는 표현을 가지고 있다. 프로그램 코드는 `PPRINT` 함수 (''예쁘게''-인쇄의 약자)를 사용하여 예쁘게 인쇄된 S-표현식으로 형식화할 수 있다.6. 다른 형식과의 비교
S-표현식은 XML과 자주 비교된다. S-표현식은 점(.
)을 이용한 쌍이라는 한 가지 포함 형식만 있는 반면, XML 태그는 속성, 다른 태그, CDATA영어 등 다양한 요소를 포함할 수 있어 구문이 더 복잡하다. 간단하게 사용할 때는 S-표현식이 XML보다 단순하지만, 복잡한 작업에는 XPath 등의 쿼리 언어와 다양한 도구, 라이브러리를 제공하는 XML이 더 유리하다.[10]
6. 1. XML과의 비교
S-표현식은 XML과 비교되는데, 주요 차이점은 S-표현식은 점으로 구분된 쌍이라는 단일 형태의 포함 관계만 가지는 반면, XML 태그는 속성, 다른 태그, CDATA를 포함할 수 있으며 각각 다른 구문을 사용한다는 것이다. 또 다른 차이점은 S-표현식은 참조 메커니즘을 정의하지 않는 반면, XML은 고유 식별자와 이에 대한 참조 개념을 제공한다는 것이다. 간단한 사용 사례에서는 S-표현식이 XML보다 간단하지만, 더 발전된 사용 사례에서는 XML이 XPath라는 쿼리 언어와 XML 데이터 처리를 단순화하는 다양한 도구 및 타사 라이브러리를 제공한다.[10]7. 한국에서의 현황 (한국 특화)
현재 한국어 위키백과를 포함한 한국의 인터넷 환경에서는 S-표현식에 대한 정보가 제한적이며, 주로 영어권 자료를 번역하거나 참고하는 경우가 많다.
참조
[1]
웹사이트
Recursive functions of symbolic expressions
http://www-formal.st[...]
Communications of the ACM
2004-02-02
[2]
웹사이트
Common Lisp HyperSpec: 22.4 - The Printer Dictionary: *PRINT-CIRCLE*
http://clhs.lisp.se/[...]
2018-12-28
[3]
웹사이트
Revised7 Report on the Algorithmic Language Scheme: Section 2.4: Datum Labels
https://small.r7rs.o[...]
2013-07-06
[4]
웹사이트
Revised^5 Report on the Algorithmic Language Scheme
https://schemers.org[...]
[5]
간행물
Revised6 Report on the Algorithmic Language Scheme
2009-08-12
[6]
문서
S-expressions
https://web.archive.[...]
Network Working Group, Internet Draft
1997-05-04
[7]
웹사이트
rivest sexp
https://scholar.goog[...]
Google Scholar
[8]
웹사이트
SEXP (S-expressions)
http://people.csail.[...]
2023-05-05
[9]
웹사이트
Recursive functions of symbolic expressions
http://www-formal.st[...]
Communications of the ACM
2004-02-02
[10]
웹인용
보관된 사본
http://people.csail.[...]
2013-07-05
[11]
문서
XML과 비슷하다.
[12]
문서
예: RFC 2693
[13]
URL
http://scholar.googl[...]
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com