[Nim 언어 특강] 템플릿
·
Programming Languages/Nim
Templates (템플릿)템플릿(Templates) 은 Nim의 추상 구문 트리(AST, Abstract Syntax Tree) 수준에서 작동하는 단순한 치환(substitution) 메커니즘입니다. 템플릿은 컴파일러의 의미 분석 단계(semantic pass) 에서 처리되며, 언어의 나머지 부분과 자연스럽게 통합됩니다. C언어의 전처리기 매크로(preprocessor macros) 와 달리 템플릿은 구조적이며, 부작용이나 예측 불가능한 문제를 일으키지 않습니다. 템플릿 호출 방법템플릿을 호출할 때는 일반적인 프로시저 호출 문법(proc call) 을 그대로 사용합니다. ```nimtemplate `!=` (a, b: untyped): untyped = # 이 정의는 System 모듈 안에 존재합니다..
[Nim 언어 강좌] 제네릭
·
Programming Languages/Nim
Generics (제네릭)제네릭(Generics) 은 Nim에서 프로시저(proc), 이터레이터(iterator), 또는 타입(type) 을타입 매개변수(type parameters) 로 매개화(parametrize) 하는 기능입니다. 제네릭 매개변수는 대괄호([]) 안에 작성하며, 예를 들어 `Foo[T]` 와 같이 사용합니다.이 기능은 효율적이고 타입 안전한 컨테이너(type-safe container) 를 만들 때 특히 유용합니다. ```nimtype BinaryTree*[T] = ref object # BinaryTree는 제네릭 타입이며, 제네릭 매개변수 T를 가짐 le, ri: BinaryTree[T] # 왼쪽(left), 오른쪽(right) 서브트리 — nil일 수 있음..
[Nim 언어 강좌] 예외처리 - try, raise, 예외발생명시
·
Programming Languages/Nim
Exceptions (예외 처리)Nim에서 예외(Exception) 는 객체(Object) 로 구현됩니다.관례적으로, 예외 타입의 이름은 'Error' 로 끝납니다. 표준 라이브러리의 system 모듈에는 예외 계층 구조(exception hierarchy) 가 정의되어 있으며,보통 여기에 맞춰 정의하는 것이 좋습니다. 모든 예외 타입은 `system.Exception` 을 상속하며,이 기본 클래스가 공통 인터페이스(common interface) 를 제공합니다. 예외의 메모리 관리예외 객체는 힙(heap) 에서 할당되어야 합니다.그 이유는 예외의 생존 기간(lifetime)이 예측 불가능하기 때문입니다.컴파일러는 스택(stack) 에서 생성된 예외를 raise 하려고 하면 오류를 발생시킵니다. 모든 예..
[Nim 언어 강좌] 프로퍼티, 동적 디스패치
·
Programming Languages/Nim
Properties (프로퍼티)앞선 예시에서 볼 수 있듯이, Nim은 get 프로퍼티(get-properties) 가 따로 필요하지 않습니다.일반적인 getter 프로시저(proc) 를 메서드 호출 구문(method call syntax) 으로 호출하면 같은 효과를 얻을 수 있습니다. 하지만 값을 설정(set) 할 때는 다른 문법이 필요합니다 — 이를 위해 setter 전용 구문이 존재합니다. ```nimtype Socket* = ref object of RootObj h: int # 별표(*)가 없으므로 외부 모듈에서 접근 불가 proc `host=`*(s: var Socket, value: int) {.inline.} = ## host 주소 설정자(setter) s.h = value pro..
[Nim 언어 강좌] 형 변환, object variant
·
Programming Languages/Nim
Type Conversions (형 변환)Nim은 형 변환(type conversion) 과 형 캐스팅(type casting) 을 명확히 구분합니다.캐스팅(cast) 은 `cast` 연산자를 사용하여, 비트 패턴(bit pattern) 을 다른 타입으로 강제로 해석하도록 합니다.반면, 형 변환(conversion) 은 값의 의미(abstract value) 를 보존하면서 다른 타입으로 변환합니다. (비트 패턴 자체를 보존할 필요는 없습니다.) 형 변환이 불가능한 경우, 컴파일러가 에러를 발생시키거나 예외(exception) 를 던집니다.형 변환의 문법은 다음과 같습니다: `목표타입이름(변환할 표현식)` 즉, 함수 호출 구문처럼 작성합니다. ```nimproc getID(x: Person): int = ..
[Nim 언어 강좌] OOP - 상속, mutually recursive types
·
Programming Languages/Nim
Pragmas (프라그마)프라그마(pragma) 는 Nim에서 새로운 키워드를 대거 도입하지 않고도컴파일러에 추가 정보나 명령을 전달하는 방법입니다. 프라그마는 특수한 중괄호 구문 `{.` 과 `.}` 안에 작성됩니다. 이 튜토리얼에서는 프라그마에 대해 다루지 않습니다.사용 가능한 프라그마에 대한 자세한 설명은 Nim 매뉴얼이나 사용자 가이드를 참고하세요. 객체지향 프로그래밍 (Object Oriented Programming)Nim의 객체지향 프로그래밍(OOP) 지원은 미니멀하지만 강력합니다.OOP는 프로그램 설계의 한 가지 방법일 뿐, 유일한 접근법은 아닙니다. 대부분의 경우 절차적 접근(procedural approach) 이 더 단순하고 효율적인 코드를 만드는 데 유리합니다. 특히, 상속(inhe..
[Nim 언어 강좌] 모듈
·
Programming Languages/Nim
모듈 (Modules)Nim은 프로그램을 여러 조각으로 분할할 수 있는 모듈(module) 개념을 지원합니다.각 모듈은 하나의 독립된 파일에 존재합니다. 모듈을 사용하면 정보 은닉(information hiding) 과 분리 컴파일(separate compilation) 이 가능합니다.어떤 모듈이 다른 모듈의 심볼(symbol)에 접근하려면 import 문을 사용해야 합니다.단, 별표(`*`)로 표시된 최상위(top-level) 심볼만 외부에 공개(export) 됩니다. ```nim# Module Avar x*, y: int proc `*` *(a, b: seq[int]): seq[int] = # 새로운 시퀀스를 생성 newSeq(result, len(a)) # 두 int 시퀀스를 원소별로 곱함 ..
[Nim 언어 강좌] procedural, distinct type
·
Programming Languages/Nim
프로시저 타입 (Procedural type)프로시저 타입(procedural type)은 프로시저(함수)에 대한 (추상적인) 포인터(pointer) 를 의미합니다.즉, 프로시저를 변수처럼 참조하거나 전달할 수 있게 해주는 타입입니다. 이 타입의 변수는 `nil` 값을 가질 수 있으며,Nim에서는 이러한 프로시저 타입을 이용해 함수형 프로그래밍(functional programming) 기법을 구현할 수 있습니다. ```nimproc greet(name: string): string = "Hello, " & name & "!" proc bye(name: string): string = "Goodbye, " & name & "." proc communicate(greeting: proc (x: stri..
[Nim 언어 강좌] 튜플, 참조형/포인터 타입
·
Programming Languages/Nim
튜플 (Tuples)튜플은 지금까지 봤던 객체(object)와 매우 비슷합니다.튜플도 값(value) 타입이며, 할당 시 각 구성 요소(component)가 복사(copy) 됩니다. 하지만 객체 타입과 달리, 튜플은 구조적 타입(structurally typed) 입니다.즉, 같은 이름과 같은 순서로 같은 타입의 필드를 가진다면, 서로 다른 튜플 타입이라도 동일한 타입으로 간주됩니다. 생성자와 필드 접근튜플은 생성자 `()`를 사용해 만들 수 있습니다.생성자 내 필드의 순서는 정의된 순서와 일치해야 합니다.단, 객체와는 달리 튜플 타입 이름을 생성자에서 사용할 수 없습니다. 객체처럼 `t.field` 문법으로 필드에 접근할 수 있으며,추가로 `t[i]` 문법도 사용할 수 있습니다.이때 `i`는 상수 정수..
[Nim 언어 강좌] slice, object
·
Programming Languages/Nim
슬라이스(Slices)슬라이스는 문법적으로 부분 구간(subrange) 타입과 비슷해 보이지만, 다른 맥락에서 사용됩니다. 슬라이스는 단순히 두 개의 경계값 `a`와 `b`를 담고 있는 Slice 타입의 객체일 뿐입니다. 슬라이스 자체로는 그리 유용하지 않지만, 다른 컬렉션 타입에서 Slice 객체를 받아 구간을 정의하는 연산자를 제공합니다. ```nimvar a = "Nim is a programming language" b = "Slices are useless." echo a[7 .. 12] # --> 'a prog'b[11 .. ^2] = "useful"echo b # --> 'Slices are useful.'``` 위 예시에서 슬라이스는 문자열의 일부를 수정하는 데 사용됩니다. 슬라이스의 ..
sierraKilo
'Programming Languages/Nim' 카테고리의 글 목록