Racket에서 symbol과 string

Eden.Yang·2023년 11월 6일
0

PLT

목록 보기
10/14

문자열(strings) vs. 심볼(symbols)

문자열 : 문자열은 문자들의 나열로, 큰 따옴표(")로 묶어 나타냅니다. 예를 들어, "hello"나 "world"와 같이 문자들을 나열한 것이 문자열입니다. 문자열은 내용이 같더라도 서로 다른 객체로 취급됩니다.

심볼 : 심볼은 작은 따옴표(')로 묶어 나타내며, 따옴표 다음에 나오는 단어나 구를 나타냅니다. 예를 들어, 'hello 나 'world와 같이 따옴표로 묶은 것이 심볼입니다. 심볼은 내용이 같으면 항상 동일한 객체로 취급됩니다.


#lang plai
(define sym1 'hello)
(define sym2 (string->uninterned-symbol "hello"))
(define sym3 (string->symbol "hello"))

(symbol=? sym1 sym2) ; Output: #f
(eq? sym1 sym2)     ; Output: #f (not same memory address)

(symbol=? sym1 sym3) ; Output: #t
(eq? sym1 sym3)     ; Output: #t (same memory address)

심볼 인터닝(Symbol Interning):

Racket에서 심볼은 기본적으로 인터닝됩니다. 이는 동일한 내용을 가진 두 개의 심볼이 동일한 객체로 취급된다는 것을 의미합니다. 인터닝된 심볼은 메모리에서 하나의 고유한 위치를 가리킵니다.

예를 들어, sym1과 sym3는 모두 내용이 "hello"인 심볼이므로 같은 객체로 취급됩니다. 따라서 (symbol=? sym1 sym3)와 (eq? sym1 sym3)는 둘 다 참(True)입니다.

eq?는 두 객체의 메모리 주소가 정확히 같은지를 확인합니다. 즉, 두 객체가 동일한 것인지를 검사합니다.

symbol=?는 두 심볼의 내용이 정확히 같은지를 확인합니다. 즉, 두 심볼이 동일한 내용을 가지고 있는지를 검사합니다.

profile
손끝에서 땅끝으로, 골방에서 열방으로

0개의 댓글