최상위 정의가 기대돼요

최상위 정의가 기대돼요 (E080: Expected Top Level Def)

이 에러는 Scala 3.0.0이 릴리스되기 전에 제거된 에러라, 실제로 스칼라 3 컴파일러가 내보낸 적은 없어요. 초기 Dotty 버전에서 파서가 최상위 정의를 기대했는데 다른 것을 발견했을 때 발생하던 에러예요.

출처: Scala 3 Reference

본문

참고: 이 에러는 Scala 3.0.0이 릴리스되기 전에 제거되었고, 스칼라 3 컴파일러가 실제로 내보낸 적은 없어요.

무엇을 하던 에러였을까요 (What it did)

초기 Dotty 버전에서 파서가 최상위 정의를 기대했는데 그 외의 다른 것을 발견하면 이 에러가 발생했어요.

예시 (Example)

// Invalid top-level statement
42

에러 (Error)

-- [E080] Syntax Error: example.scala:1:0 --------------------------------------
1 |42
  |^^
  |Expected a toplevel definition

설명 (Explanation)

스칼라 소스 파일의 최상위에는 정의만 올 수 있어요.

  • package 선언
  • import
  • class, trait, object, enum 정의
  • type 별칭
  • val, var, def 정의
  • extension 정의
  • given 정의
  • export

42println("hello") 같은 독립된 표현식은 최상위(어떤 정의 밖)에서는 유효하지 않아요.

이 에러는 2e5df79218 커밋(2021년 5월)에서 "Refactor remaining statement and declaration loops"의 일부로 제거되었어요. 파서가 최상위의 잘못된 문법에 대해 다른 방식으로 처리하도록 리팩터링되면서 사라졌죠.

최상위에서 코드를 실행하고 싶다면 main 메서드나 객체 안에 감싸면 돼요.

@main def run(): Unit =
  println("hello")

// Or
object Main:
  def main(args: Array[String]): Unit =
    println("hello")