심볼
심볼 (Symbols)
심볼(symbol)에 대한 소개는 The Racket Guide의 심볼(Symbols) 장에서 다뤄요. 여기서는 Racket 레퍼런스의 심볼 관련 절차들을 자세히 살펴봐요.
출처: Racket Reference
본문
심볼은 불변 문자열과 비슷하지만, 보통 인터닝(interned)돼서 같은 문자 내용을 가진 두 심볼은 보통 eq?이에요. 기본 리더(Reading Symbols 참고)가 만들어내는 모든 심볼은 인터닝돼요.
string->uninterned-symbol과 gensym 두 프로시저는 인터닝되지 않은(uninterned) 심볼, 즉 어떤 다른 심볼과도 eq?, eqv?, equal?가 아닌 심볼을 만들어내요. 다만 다른 심볼과 똑같이 출력될 수는 있어요.
string->unreadable-symbol 프로시저는 부분적으로 인터닝된 읽을 수 없는(unreadable) 심볼을 반환해요. 기본 리더(Reading Symbols 참고)는 읽을 수 없는 심볼을 만들어내지 않지만, equal?인 문자열로 string->unreadable-symbol을 두 번 호출하면 eq? 결과를 만들어내요. 읽을 수 없는 심볼은 인터닝된 심볼이나 인터닝되지 않은 심볼과 똑같이 출력될 수 있어요. 읽을 수 없는 심볼은 소스 코드에 나타나는 심볼과의 충돌을 피하기 위해 확장(expansion)과 컴파일에서 유용해요. 보통 직접 만들어내지는 않지만, identifier-binding 같은 함수의 결과에는 나타날 수 있어요.
인터닝된 심볼과 읽을 수 없는 심볼은 내부 심볼 테이블에 약하게(weakly) 유지돼요. 이 약함은 eq?, eqv?, equal? 판정의 결과에 결코 영향을 줄 수 없지만, 심볼은 약한 상자(Weak Boxes 참고)에 넣어지거나, 약한 해시 테이블(해시 테이블 참고)의 키로 쓰이거나, 에페메론(ephemeron, Ephemerons 참고)의 키로 쓰이면 사라질 수 있어요.
심볼 읽기에 대한 정보는 Reading Symbols, 심볼 출력에 대한 정보는 Printing Symbols 문서를 참고하세요.
(symbol? v) → boolean?
v : any/c
v가 심볼이면 #t, 아니면 #f를 반환해요.
예제:
> (symbol? 'Apple)
#t
> (symbol? 10)
#f
(symbol-interned? sym) → boolean?
sym : symbol?
sym이 인터닝되어 있으면 #t, 아니면 #f를 반환해요.
예제:
> (symbol-interned? 'Apple)
#t
> (symbol-interned? (gensym))
#f
> (symbol-interned? (string->unreadable-symbol "Apple"))
#f
(symbol-unreadable? sym) → boolean?
sym : symbol?
sym이 읽을 수 없는 심볼이면 #t, 아니면 #f를 반환해요.
예제:
> (symbol-unreadable? 'Apple)
#f
> (symbol-unreadable? (gensym))
#f
> (symbol-unreadable? (string->unreadable-symbol "Apple"))
#t
(symbol->string sym) → string?
sym : symbol?
sym과 같은 문자를 가진, 새로 할당된 변경 가능한 문자열을 반환해요.
racket/symbol의 symbol->immutable-string도 함께 보세요.
예제:
> (symbol->string 'Apple)
"Apple"
(string->symbol str) → symbol?
str : string?
str과 같은 문자를 가진 인터닝된 심볼을 반환해요.
예제:
> (string->symbol "Apple")
'Apple
> (string->symbol "1")
'|1|
(string->uninterned-symbol str) → symbol?
str : string?
(string->symbol str)와 같지만, 결과 심볼은 새로운 인터닝되지 않은 심볼이에요. 같은 str로 string->uninterned-symbol을 두 번 호출하면 서로 다른 두 심볼이 반환돼요.
예제:
> (string->uninterned-symbol "Apple")
'Apple
> (eq? 'a (string->uninterned-symbol "a"))
#f
> (eq? (string->uninterned-symbol "a")
(string->uninterned-symbol "a"))
#f
(string->unreadable-symbol str) → symbol?
str : string?
(string->symbol str)와 같지만, 결과 심볼은 새로운 읽을 수 없는 심볼이에요. 같은 str로 string->unreadable-symbol을 두 번 호출하면 같은 심볼이 반환되지만, read는 그 심볼을 만들어내지 않아요.
예제:
> (string->unreadable-symbol "Apple")
'Apple
> (eq? 'a (string->unreadable-symbol "a"))
#f
> (eq? (string->unreadable-symbol "a")
(string->unreadable-symbol "a"))
#t
(gensym [base]) → symbol?
base : (or/c string? symbol?) = "g"
자동으로 생성된 이름을 가진 새 인터닝되지 않은 심볼을 반환해요. 선택적 base 인자는 접두사 심볼이나 문자열이에요.
예제:
> (gensym "apple")
'apple8402245
(symbol<? a-sym b-sym ...) → boolean?
a-sym : symbol?
b-sym : symbol?
인자들이 정렬되어 있으면 #t를 반환해요. 각 심볼 쌍의 비교는 symbol->string으로 얻은 문자열에 string->bytes/utf-8과 bytes<?를 쓰는 것과 같아요.
base 패키지 7.0.0.13 버전에서 변경: 두 개 이상의 인자 외에 인자 하나도 허용하도록 바뀌었어요.
4.7.1 추가적인 심볼 함수
(require racket/symbol) ; package: base
이 섹션에서 다루는 바인딩은 racket/base나 racket이 아니라 racket/symbol 라이브러리가 제공해요.
base 패키지 7.6 버전에서 추가.
(symbol->immutable-string sym) → (and/c string? immutable?)
sym : symbol?
symbol->string과 같지만, 결과는 불변 문자열이고 반드시 새로 할당되지는 않아요.
예제:
> (symbol->immutable-string 'Apple)
"Apple"
> (immutable? (symbol->immutable-string 'Apple))
#t
base 패키지 7.6 버전에서 추가.
더 알아보기
- The Racket Guide의 심볼(Symbols) 장
- Reading Symbols, Printing Symbols
- 약한 상자, 약한 해시 테이블, 에페메론