SqueakByExample:3.1
문법 요소
문법은 다음의 구성 요소로 이루어져 있습니다. (i) 여섯개의 준비된 키워드 또는 의사 변수들: self, super, nil, true, false, 그리고 thisContext (ii) 숫자, 문자, 문자열, 심볼 그리고 배열을 포함하는 리터럴 오브젝트[1]에 대한 상수 표현식 (iii) 변수 선언, (iv) 할당문, (v) 블록 클로저, (vi) 메시지 입니다.
Syntax | 의미하는것 |
startPoint | 변수 이름 |
Transcript | 글로벌 변수 이름 |
self | 의사(가짜)Psudo 변수 |
1 | 십진법 정수 |
2r101 | 이진정수 |
1.5 | 부동 소수점 수 |
2.4e7 | 지수 표기법 |
$a | 문자 'a' |
'Hello' | 문자열 'Hello' |
#Hello | 심볼 # Hello |
#(1 2 3) | 문자/리터럴 배열 |
{1. 2. 1+2} | 동적 배열 |
"a comment" | 주석 |
¦ x y ¦ | 변수 x y의 선언 |
x := 1 | 1을 x에 할당 |
[ x + y ] | x y로 계산하는 변수 |
<primitive: 1> | 가상머신의 프리미티브[2] 또는 어노테이션 |
3 factorial | 단항 메시지 |
3+4 | 이항 메시지 |
2 raisedTo: 6 modulo: 10 | 키워드 메시지 |
↑ true | 값을 true로 반환 |
Transcript show: 'hello'. Transcript cr (.) | 선언문(표현식) 구분자(.) |
Transcript show: 'hello'; cr | 메시지 캐스케이드 (;) |
표 3.1: 간단한 스퀵 문법 |
---|
표 3.1에서 다양한 문법 요소의 예를 볼 수 있습니다.
지역 변수
startPoint는 변수 이름 또는 식별자 이름입니다. 관례상, 식별자는 "카멜케이스(camelCase)"로 단어를 구성합니다 (예를 들면, 각각의 단어는 처음 시작하는 단어를 제외하고 첫 글자를 대문자로 시작합니다). 인스턴스 변수, 메서드, 블록 인자, 임시 변수의 첫 번째 글자는 반드시 소문자여야 합니다. 또한 변수의 범위는 스스로에게 한정된다는것을 알 수 있습니다.
공유 변수
대문자로 시작되는 식별자는 전역 변수, 클래스 변수, pool 딕셔너리 또는 클래스 이름입니다. Transcript는 전역 변수이며, TranscriptStream클래스의 인스턴스 입니다.
수신자
self는 실행 중인 현재 메서드 안에 있는 오브젝트를 참조하는 키워드입니다. 이 오브젝트가 보통 실행해야 할 메서드에서 발생한 메시지를 받으므로 이 키워드를 "수신자"라고 합니다. 우리가 self에 할당을 할 수 없으므로 의사 변수라고 합니다.
정수
스퀵은 42와 같은 보통 10진수 정수 뿐만 아니라, 기수 표기법도 제공합니다. 2r101은 2진수의 101이며[예를 들면, 바이너리], 10진수의 5와 동일합니다.
부동 소수점 수
10진 기반 지수와 함께 지정할 수 있습니다: 2.4e7 is 2.4 × 107.
문자
달러 기호는 리터럴 문자임을 의미합니다: $a는 'a' 에 대한 리터럴입니다. 비 출력 문자의 인스턴스는 적절한 이름으로 만든 Character space 와 Character tab과 같은 적절하게 이름 붙인 메시지를 보내어 Character 클래스에서 비출력 문자에 대한 인스턴스를 가져올 수 있습니다.
문자열
작은 따옴표(Single quotes- 혹은 게발톱 따옴표)는 리터럴 문자열을 정의할 때 사용합니다.문자열 안에서 따옴표를 사용하려면, 'Gday' 의 경우와 같이 따옴표를 두 개를 넣으면 됩니다.
심볼
문자의 연속 요소를 포함한다는 점에서 문자열과 비슷합니다. 그러나 문자열과 달리, 리터럴 심볼은 전체적으로 유일해야 합니다. 심볼 오브젝트 #Hello는 하나밖에 없지만, 값이 'Hello' 인 여러가지 문자열 오브젝트가 있을 수도 있습니다.
컴파일 시점 배열
컴파일 시간 배열은 #( )와 공백으로 구분한 리터럴로 둘러쌓아 정의합니다. 괄호 안의 모든 요소는 컴파일 시간 상수여야 합니다. 예를 들어, #( 27#(true false)abc)는 세가지 요소의 리터럴 배열입니다: 정수 27, 두 개의 Boolean 값을 지닌 컴파일 시간 배열, 그리고 심볼 #abc가 들어있습니다.
런타임 시점 배열
중괄호 { }는 실행 시간 동안 동적 배열을 정의합니다. 내부 요소는 구두점으로 구분한 프로그램식이 됩니다. 따라서 {1.2. 1+2}는 1, 2, 그리고 1+2를 처리한 결과 요소가 들어있는 배열을 정의합니다. (중괄호 기호는 스몰토크 스퀵환경의 독자적인 것입니다. 다른 스몰토크에서는 동적 배열을 확실히 만들어야 합니다.)
주석
주석은 큰 따옴표로 둘러싸여 있습니다. 문자열이 아니라 "hello"는 주석이며, 스퀵 컴파일러가 무시합니다. 주석은 여러 줄에 걸쳐 있을 수 있습니다.
지역 변수 정의
수직 바는 | | 메서드(그리고 블록 내에서도)의 하나 이상의 변수 선언을 둘러쌉니다.
할당
:= 는 오브젝트를 변수에 할당합니다. 때로는, ←를 대신 사용하는 모습을 볼 수 있습니다. 안타깝게도, 이 기호가 ASCII 문자가 아니기 때문에, 특별한 글꼴을 쓰기 전에는 밑줄 문자 처럼 나타납니다. 따라서 x:=1은 x1, x_1 또는 x 밑줄 1과 같습니다. 스퀵 3.9 부터 다른 표현 방법을 낡음 처리(deprecated) 해놓았으므로 := 를 사용해야 합니다.
블록
각괄호 [ ]는 블록을 정의하며, 함수를 나타내는 첫 번째 클래스 오브젝트인 블록 구분자block closure 또는 어휘 구분자lexical closure로 알려져 있습니다. 우리가 살펴볼 내용처럼, 블록은 인수를 취하거나 로컬변수를 가질 수 있습니다.
프리미티브
<primitive:…>는 가상 머신 프리미티브의 Call을 나타냅니다. (<primitive: 1>는 SmallInteger>>+.)를 위한 가상 머신 프리미티브를 가리킵니다. 이 프리미티브 다음의 코드는 프리미티브 처리에 실패했을 경우에만 실행합니다. 스퀵 3.9 부터는, 메서드 어노테이션에 동일한 문법을 사용합니다.
단항 메시지
(3과 같은) 수신자로 보내는 (factorial과 같은) 한 개의 단어로 구성됩니다.
바이너리 메시지
(+와 같이) 수신자로 보내며 단일 인자를 취하는 연산자입니다. 3+4에서 수신자는 3이며 인자는 4입니다.
키워드 메시지
(raisedTo:modulo:와 같은) 여러가지 키워드로 구성되어 있으며, 각각 콜론으로 끝나고, 단일 인자를 취합니다. raisedTo: 6 modulo: 10 이라는 프로그램식에서, 메시지 셀렉터 raisedTo:modulo:는 6과 10 두 개의 인자를 취하는데, 각각의 인자는 콜론 뒤에 붙어있습니다. 이 메시지를 수신자 2로 보냅니다.
메서드 반환
↑ 는 메서드에서 값을 반환할 때 사용합니다. ( ↑ 문자를 쓰려면 ^을 입력해야 합니다.)
선언문 순차 배치
마침표는 (.) 선언문 구분자입니다. 두개의 프로그램식 사이에 마침표를 넣으면, 독립된 선언문으로 바뀝니다.
종속
세미콜론은 종속된 여러 메시지를 단일 수신자에 보내는데 사용할 수 있습니다. Transcript show: 'hello'; cr에서 show: ‘hello’ 키워드 메시지를 수신자 Transcript에 먼저 보내고, 단항 메시지 cr를 동일한 수신자에 보냅니다.
Number, Character, String, Boolean 클래스는 8장에서 상세하게 다루겠습니다.
Notes
- ↑ literal - 프로그램 언어에서 문자열 그 자체가 값을 나타내는 것. 예를 들면 X='90' 에서 문자열 90은 90이라는 값을 나타내는 리터럴이다
- ↑ 이 경우 primitive는 squeak VM의 low-level 에 속하는 요소들의 고유명사로 사용됩니다. https://groups.google.com/forum/#!msg/fj.comp.oops/HXzNCQouoaQ/coURkVMiM2cJ 이 주소를 보면 보다 감을 잡기 편할 수 있습니다