프로그램

프로그램 (The Program)

Crystal 프로그램은 컴파일러가 다루는 전체 소스 코드예요. 소스는 파싱되어 프로그램의 실행 가능한 버전으로 컴파일돼요.

출처: Crystal 공식 문서

본문

프로그램은 컴파일러가 작업하는 전체 소스 코드예요. 소스는 파싱되어 실행 가능한 프로그램 버전으로 컴파일되는데, 프로그램의 소스 코드는 반드시 UTF-8로 인코딩돼야 해요.

최상위 스코프 (Top-level scope)

타입·상수·매크로·메서드처럼 다른 네임스페이스 밖에 정의된 기능들은 최상위 스코프에 있게 돼요.

# Defines a method in the top-level scope
def add(x, y)
  x + y
end

# Invokes the add method on the top-level scope
add(1, 2) # => 3

최상위 스코프의 지역 변수는 파일-로컬이라 메서드 본문 안에서는 보이지 않아요.

x = 1

def add(y)
  x + y # error: undefined local variable or method 'x'
end

add(2)

private 기능도 현재 파일에서만 보여요.

이중 콜론 접두사(::)는 최상위 스코프의 네임스페이스·상수·메서드·매크로를 명확하게 참조해요.

def baz
  puts "::baz"
end

CONST = "::CONST"

module A
  def self.baz
    puts "A.baz"
  end

  # Without prefix, resolves to the method in the local scope
  baz

  # With :: prefix, resolves to the method in the top-level scope
  ::baz

  CONST = "A::Const"

  p! CONST   # => "A::CONST"
  p! ::CONST # => "::CONST"
end

메인 코드 (Main code)

메서드·매크로·상수·타입 정의가 아니거나, 메서드나 매크로 본문에 있지 않은 모든 표현식은 메인 코드에 속해요. 메인 코드는 프로그램이 시작될 때 소스 파일이 포함된 순서대로 실행돼요.

메인 코드를 위한 특별한 진입점(예: main 메서드)이 필요하지 않아요.

# This is a program that prints "Hello Crystal!"
puts "Hello Crystal!"

메인 코드는 네임스페이스 안에도 있을 수 있어요.

# This is a program that prints "Hello"
class Hello
  # 'self' here is the Hello class
  puts self
end

더 알아보기

  • 최상위 스코프의 지역 변수는 메서드 본문에서 볼 수 없다는 점을 주의하세요. 메서드에서 쓰려면 별도로 넘겨줘야 해요.
  • :: 접두사가 붙으면 최상위 스코프를 가리키므로, 같은 이름이 로컬에 있어도 최상위 것을 정확히 참조할 수 있어요.
  • 메인 코드는 별도 진입점 없이 파일 포함 순서대로 실행된다는 점이 C의 main과 다른 점이에요.