맨위로가기

Nemerle

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

Nemerle는 객체 지향 프로그래밍과 함수형 프로그래밍 스타일을 혼합하여 사용할 수 있는 프로그래밍 언어이다. 강력한 형식 추론, 유연한 메타프로그래밍 시스템, C#, Java, C++ 스타일의 객체 지향 프로그래밍 지원, ML, OCaml, Haskell 스타일의 함수형 프로그래밍 지원 등의 특징을 갖는다. Nemerle은 메타프로그래밍 시스템을 통해 컴파일러 확장성, 특정 도메인 언어 임베딩, 부분 평가, 관점 지향 프로그래밍을 지원하며, .NET 또는 Mono 플랫폼의 라이브러리에 접근하는 것이 용이하다. 또한, 변수 선언 시 타입을 명시하지 않아도 컴파일러가 자동으로 타입을 추론하며, 매크로 시스템을 통해 컴파일 시점에 코드 생성, 분석 및 수정을 수행한다. Nemerle은 튜플, 패턴 매칭, 함수형 프로그래밍 기능, 그리고 오프사이드 규칙 기반의 공백에 민감한 구문을 선택적으로 사용할 수 있으며, ASP.NET에 직접 통합되어 웹 개발에 활용될 수 있다.

더 읽어볼만한 페이지

  • 2003년 개발된 프로그래밍 언어 - 스칼라 (프로그래밍 언어)
    스칼라는 마틴 오더스키가 설계한 객체 지향 및 함수형 프로그래밍 언어이며, 자바 플랫폼에서 실행되고 자바 코드와 상호 운용이 가능하며, 아파치 스파크 등 다양한 곳에서 활용된다.
  • 2003년 개발된 프로그래밍 언어 - 아파치 그루비
    아파치 그루비는 자바 가상 머신에서 실행되는 동적 타이핑 프로그래밍 언어이며, 자바와 파이썬 등의 특징을 결합하여 웹 애플리케이션 개발 등 다양한 분야에서 활용된다.
  • 관점 지향 프로그래밍 - DTrace
    DTrace는 시스템과 애플리케이션의 실시간 동작 추적 및 분석을 위한 동적 트레이싱 프레임워크로, 'D' 언어를 사용하여 작성된 스크립트를 통해 다양한 시스템 이벤트 계측 및 분석을 지원하며 여러 운영체제에 적용되어 시스템 분석 및 문제 해결에 기여한다.
  • 관점 지향 프로그래밍 - 스프링 프레임워크
    스프링 프레임워크는 로드 존슨의 코드에서 시작된 자바 플랫폼용 오픈 소스 애플리케이션 프레임워크로, IoC 컨테이너와 AOP 등의 핵심 기능과 다양한 모듈 및 템플릿을 통해 엔터프라이즈 자바 개발의 생산성을 향상시키고 확장성을 제공하며 웹 개발, 보안, 데이터 접근 등 다양한 기능을 지원한다.
  • 닷넷 프로그래밍 언어 - 파워셸
    파워셸은 마이크로소프트에서 개발한 작업 자동화 솔루션으로, 명령줄 셸과 스크립트 언어의 기능을 결합하여 윈도우 시스템 관리를 위해 설계되었으며, .NET 프레임워크 기반의 객체 지향적 특징을 갖고 다양한 플랫폼에서 자동화 스크립트 작성 및 실행, 시스템 구성 관리 등에 활용된다.
  • 닷넷 프로그래밍 언어 - 코볼
    코볼은 1959년 CODASYL에 의해 개발된 공통 사무 처리용 프로그래밍 언어이며, 사무 처리 시스템의 표준 언어로 널리 사용되면서 객체 지향 기능과 새로운 기능이 추가된 표준이 발표되었다.
Nemerle - [IT 관련 정보]에 관한 문서
기본 정보
종류프로그래밍 언어
패러다임멀티 패러다임
관점 지향 프로그래밍
사건 기반 프로그래밍
함수형 프로그래밍
제네릭 프로그래밍
명령형 프로그래밍
메타프로그래밍
객체 지향 프로그래밍
반영
계열C#
설계자Kamil Skalski
Michał Moskal
Leszek Pacholski 교수
Paweł Olszta (브로츠와프 대학교)
개발자JetBrains (과거)
RSDN
최초 공개2003년
최신 버전1.2.507.0
최신 버전 출시일2016년 8월 6일
형식 체계형식 추론
명목
정적
강한
구현체Nemerle
영향을 준 언어C#
리스프
ML
플랫폼CLI
파일 확장자.n
웹사이트Nemerle 공식 웹사이트

2. 특징

Nemerle는 객체 지향 프로그래밍함수형 프로그래밍 스타일을 혼합한 하이브리드 언어이다.[1] 프로그램은 클래스 및 네임스페이스와 같은 객체 지향 개념을 사용하여 구조화할 수 있으며, 메서드는 (선택적으로) 함수형 스타일로 작성할 수 있다.[1]

Nemerle의 주요 특징은 다음과 같다.

기능설명
객체 지향 프로그래밍C#, Java, C++와 같은 문법을 지원.
함수형 프로그래밍ML, OCaml, Haskell과 같은 문법을 지원하며, 고차 함수, 패턴 매칭, 대수적 데이터 형식, 지역 함수, 튜플과 익명 형식, 함수의 부분 적용 등의 기능을 제공.
기타공통 언어 인프라 (CLI) 표준 기능, 매개변수 다형성, 람다식, 확장 메서드 등을 모두 결합. .NET 또는 Mono 플랫폼에 포함된 라이브러리에 C#에서와 마찬가지로 쉽게 접근 가능.



Nemerle는 객체 지향 프로그래밍과 함수형 프로그래밍을 모두 혼합하여 사용할 수 있다는 점이 가장 큰 특징이다.[1] 프로그램의 최상위 수준에서는 객체 지향 구조를 사용하지만, 메서드 본문에는 함수형 스타일을 사용할 수도 있다.

2. 1. 강력한 형식 추론

nemerle

def x = 1; // int

def myList = List(); // 제네릭 형식 List[T]로 선언되며, 이후 사용 방식에 따라 추론됨

myList.Add(x); // 컴파일러에 의해 myList는 List[int]로 추론됨

```

이 코드는 Nemerle의 강력한 형식 추론 기능을 보여준다.

  • `def x = 1;`에서 변수 `x`는 `int` 형으로 추론된다.
  • `def myList = List();`에서 `myList`는 제네릭 형식 `List[T]`로 선언되지만, 구체적인 타입 `T`는 명시되지 않는다.
  • `myList.Add(x);`에서 `myList`에 `int` 형 변수 `x`를 추가함으로써, 컴파일러는 `T`를 `int`로 추론하고, 결과적으로 `myList`의 형식을 `List[int]`로 결정한다.


이러한 형식 추론은 코드의 간결성을 높이고 개발자의 편의성을 증대시킨다.

2. 2. 유연한 메타프로그래밍

Nemerle의 매크로 시스템은 컴파일 시점에 프로그램 코드를 생성, 분석 및 수정할 수 있도록 한다. 매크로는 메서드 호출 형식 또는 새로운 언어 구성으로 사용할 수 있다. 언어 내의 많은 구성 요소는 매크로(if, for, foreach, while, using 등)를 사용하여 구현된다.

매크로는 컴파일러가 수행하는 추가적인 정적 검사를 통해 상용구 코드를 생성할 수 있게 해준다. 이는 손으로 작성해야 하는 코드의 양을 줄여주고, 코드 생성의 안전성을 높이며, 소스 코드를 비교적 작고 읽기 쉽게 유지하면서 컴파일러 검사를 통해 코드를 생성할 수 있도록 해준다.

"'''if'''" 매크로 예시:

```nemerle

macro @if (cond, e1, e2)

syntax ("if", "(", cond, ")", e1, Optional (";"), "else", e2)

{

/*

<[ ]>는 준인용 영역을 정의하며, Nemerle 컴파일러는 해당 영역 내의 코드를 AST로 변환한다. 이러한 변환은 C#에서 식을 컴파일하는 것과 다소 유사하다.

  • /

<[

match ($cond : bool)

{

| true => $e1

| _ => $e2

}

]>

}

// 코드에서 이 매크로를 사용:

def max = if (a > b) a else b;

// 컴파일 시점에 위의 줄은 다음과 같이 변환된다:

def max = match (a > b)

{

| true => a

| _ => b

}

2. 3. 함수형 프로그래밍 지원

Nemerle는 고차 함수, 패턴 매칭, 대수적 데이터 형식, 지역 함수, 튜플, 익명 형식 등 다양한 함수형 프로그래밍 기능을 완벽하게 지원한다.[1] 이러한 기능들은 ML, OCaml, Haskell과 같은 함수형 프로그래밍 언어에서 주로 사용되는 기능들이다.[1] Nemerle는 함수의 부분 적용을 지원하여 코드 재사용성을 높인다.[1]

다음은 Nemerle 코드 예시이다.

```nemerle

def next(x) { x + 1 }; // x 인수와 다른 함수 인수의 유형은 사용법에서 유추할 수 있다.

def mult(x, y) { x * y };

def fibonacci(i)

{

| 0 => 0

| 1 => 1

| other => fibonacci(i - 1) + fibonacci(i - 2)

};

WriteLine(next(9)); // 10 "Console.WriteLine(next(9));"와 유사하다.

WriteLine(mult(2, 2)); // 4

WriteLine(fibonacci(10)); // 55

2. 4. 기타 특징

Nemerle은 괄호 없는 구문(Braceless syntax)을 지원하여 코드 가독성을 높일 수 있다. 프로그래머는 오프사이드 규칙을 기반으로 하는 공백에 민감한 구문을 선택적으로 사용할 수 있는데, 이는 파이썬과 유사하다.[1] 이 구문을 활성화하려면 파일 상단에 `#pragma indent`를 추가하거나 컴파일러 옵션 `-i`를 사용해야 한다.[1]

아래는 괄호 없는 구문을 사용한 Nemerle 코드 예시이다.

```nemerle

using System.Console;

[Qux] \

class FooBar

public static Main(): void

WriteLine("Hello")

static Foo (x: int): void

if (x == 3)

def y = x * 42;

Foo (x)

else

[x].Map (fun (x) {

x * 2

})

static Bar(): int

def foo = 2 + 7 * 13

foo

```

Nemerle은 .NET 또는 Mono 플랫폼에 포함된 라이브러리에 쉽게 접근할 수 있다.[1] ASP.NET에 직접 내장될 수 있으며,[1] P/Invoke를 통해 네이티브 플랫폼 라이브러리를 활용할 수도 있다.[1]

3. 문법

Nemerle은 기본적으로 C#과 유사한 문법을 사용한다. 선택적으로 파이썬과 유사하게 오프사이드 규칙을 기반으로 하는 공백에 민감한 구문을 사용할 수 있는데, 이는 스칼라에 나중에 추가된 괄호 없는 구문과 유사하다.[1]

다음 중괄호 코드 조각은:

```nemerle

using System.Console;

[Qux]

class FooBar {

public static Main(): void {

WriteLine("Hello")

}

static Foo (x: int): void {

if (x == 3) {

def y = x * 42;

Foo (x)

} else {

[x].Map (fun (x) {

x * 2

})

}

}

static Bar(): int {

def foo = 2 + 7 * 13;

foo

}

}

```

다음과 같이 다시 작성할 수 있다.

```nemerle

using System.Console;

[Qux] \

class FooBar

public static Main(): void

WriteLine("Hello")

static Foo (x: int): void

if (x == 3)

def y = x * 42;

Foo (x)

else

[x].Map (fun (x) {

x * 2

})

static Bar(): int

def foo = 2 + 7 * 13

foo

```

특히, 백슬래시 \를 사용하지 않고 여러 줄에 걸쳐 표현식이나 대체 절을 나누는 것은 불가능하다.

```nemerle

// This will not compile ...

static Bar(): int

def foo = 2

+ 7


  • 13

foo

match (s)

| "a"

| "aa" => 1

| "b"

| "bb" => 2

| _ => 0

// But this will:

static Bar(): int

def foo = 2 \

+ 7 \

  • 13

foo

match (s)

| "a" \

| "aa" => 1

| "b" \

| "bb" => 2

| _ => 0

```

이 구문을 활성화하려면 파일 상단에 #pragma indent를 추가하거나 컴파일러 옵션 -i를 사용해야 한다.

3. 1. 표현식

Nemerle에서는 모든 것이 표현식이다. `if`, `using`, `try` 등도 표현식으로 사용되어 값을 반환할 수 있다.[1]

```nemerle

def x =

{ // x = 3과 동일

def y = 1;

def z = 2;

y + z // 마지막으로 평가된 값이 반환됨

};

def x =

if (DateTime.Now.DayOfWeek == DayOfWeek.Monday) // if, using, try 등도 모두 식이다.

"Monday"

else

"other day";

def x = try int.Parse(someString)

catch { | FormatException() => 0 };

def x = returnBlock :

{

foreach (i in [1, 2, 3])

when (i > 2)

returnBlock(true); // 블록을 빠져나옴 ( x = true 가 됨 )

false // x = false

};

3. 2. 튜플

nemerle

def k = (1, "one"); // k : (int * string)

def (a, b) = k; // a = 1, b = "one"

```

튜플은 여러 개의 값을 묶어서 하나의 값으로 취급할 수 있도록 한다. 위의 예시에서 `k`는 정수(int)와 문자열(string)을 묶어 (int * string) 형식으로 정의되었다. `(a, b) = k`와 같이 튜플의 각 요소를 분리하여 변수에 할당할 수도 있다.

3. 3. 패턴 매칭

Nemerle은 값의 구조에 따라 다른 코드를 실행하는 패턴 매칭을 지원한다. 변수 바인딩, 튜플 패턴 매칭, 정규 표현식 매칭 등 다양한 패턴을 사용할 수 있다.

```nemerle

def result = match (number)

{

| 0 => "zero"

| 1 => "one"

| x when x < 0 => "negative"

| _ => "more than one"

}

3. 4. 함수

nemerle

// 클래스와 모듈(정적 클래스)은 네임스페이스에 넣을 수 있습니다.

using System.Console;

// x 인수와 다른 함수 인수의 유형은 사용법에서 유추할 수 있습니다.

def next(x) { x + 1 };

def mult(x, y) { x * y };

def fibonacci(i)

{

| 0 => 0

| 1 => 1

| other => fibonacci(i - 1) + fibonacci(i - 2)

};

WriteLine(next(9)); // 10 "Console.WriteLine(next(9));"와 유사합니다.

WriteLine(mult(2, 2)); // 4

WriteLine(fibonacci(10)); // 55

3. 5. 배리언트 (Variants)

배리언트(SML과 OCaml에서는 데이터 타입 또는 합 타입이라고 부름)는 여러 종류의 데이터를 표현하는 형식이다.[1] 배리언트(대수적 자료형이라고도 함)는 여러 종류의 값을 표현할 수 있다.[1]

```nemerle

variant RgbColor {

| Red

| Yellow

| Green

| Different {

red : float;

green : float;

blue : float;

}

}

```

```csharp

variant RgbColor{

| Red

| Yellow

| Green

| Different {

red : float;

green : float;

blue : float;

}

}

4. 메타프로그래밍

Nemerle의 매크로 시스템은 컴파일 시간에 코드를 생성, 분석, 수정할 수 있게 해준다. 메서드 호출 형식 또는 새로운 언어 구성으로 사용할 수 있다. `if`, `for`, `foreach`, `while`, `using` 등 많은 언어 구성 요소가 매크로로 구현되어 있다.

```nemerle

macro @if (cond, e1, e2)

syntax ("if", "(", cond, ")", e1, Optional (";"), "else", e2)

{

/*

<[ ]>는 준인용 영역을 정의하며, Nemerle 컴파일러는 해당 영역 내의 코드를 AST로 변환한다. 이러한 변환은 C#에서 식을 컴파일하는 것과 다소 유사하다.


  • /

<[

match ($cond : bool)

{

| true => $e1

| _ => $e2

}

]>

}

// 코드에서 이 매크로를 사용:

def max = if (a > b) a else b;

// 컴파일 시점에 위의 줄은 다음과 같이 변환된다:

def max = match (a > b)

{

| true => a

| _ => b

}

4. 1. 매크로 예시

Nemerle 매크로는 컴파일 시간에 코드를 생성, 분석 및 수정할 수 있게 해주는 강력한 기능이다. 요약에서 제시된 주요 기능들을 중심으로 Nemerle 매크로의 예시들을 살펴본다.
문자열 서식`$` 표기법을 사용하여 변수를 문자열 안에 간단하게 삽입할 수 있다.

```nemerle

def s = $"숫자는 $i 입니다."; // $i가 있는 위치에 변수 i의 값을 삽입한다.

def s = $"$x + $y = $(x+y)"; // $(...)는 계산을 하거나 멤버에 접근하는 데 사용할 수 있다.

```
코드 생성 매크로`StructuralEquality`, `Memoize`, `json`, `with` 등은 컴파일 시간에 코드를 생성하는 매크로이다.

```nemerle

[StructuralEquality] // 요소 비교 동등성을 사용하여 IEquatable[Sample] .Net 인터페이스를 구현한다.

class Sample

{

[Memoize] // 첫 번째 평가 결과를 기억한다.

public static SomeLongEvaluations() : int

{

MathLib.CalculateNthPrime(10000000)

}

[DependencyProperty] // WPF 종속성 속성

public DependencyPropertySample { get; set; }

public static Main() : void

{

/* syntax macro "json" generates code:

JObject.Object([("a", JValue.Number(SomeLongEvaluations())), ("b", JValue.Number(SomeLongEvaluations() + 1))])

  • /

def jObject = json { a: SomeLongEvaluations(); b: (SomeLongEvaluations() + 1)}

// object initialization macro "<-" is development of C# curly brackets object initialization

def k = Diagnostics.Process() <-

{

StartInfo <- // 생성자 호출 없이 내부 객체 속성을 초기화할 수 있다.

{

FileName = "calc.exe";

UseShellExecute = true;

}

Exited += () => WriteLine("Calc done"); // 이벤트 및 대리자

}

ReadLine();

}

}

```

  • `StructuralEquality`: `IEquatable[Sample] .Net` 인터페이스를 자동으로 구현하여 요소 비교를 통한 동등성 검사를 가능하게 한다.
  • `Memoize`: 함수의 첫 번째 호출 결과를 저장하여 이후 동일한 입력에 대한 재호출 시 저장된 결과를 반환, 불필요한 연산을 줄인다.
  • `json`: JSON 객체를 생성하는 코드를 간결하게 작성하도록 돕는다.
  • `<-`: C#의 객체 초기화 기능을 확장하여 생성자 호출 없이도 내부 객체 속성을 초기화할 수 있게 한다.

데이터베이스 접근SQL 쿼리를 작성하고 컴파일 타임에 검사할 수 있는 매크로를 제공한다.

```nemerle

ExecuteReaderLoop("SELECT firstname, lastname FROM employee WHERE firstname = $myparm", dbcon,

{

WriteLine ($"Name: $firstname $lastname")

});

```

위 코드는 아래 코드와 동일한 기능을 수행하지만, `ExecuteReaderLoop` 매크로를 사용하여 더 간결하고 가독성이 높으며, 컴파일 타임에 SQL 쿼리의 유효성을 검사할 수 있다.

```nemerle

string sql = "SELECT firstname, lastname FROM employee WHERE firstname = :a";

using (NpgsqlCommand dbcmd = new NpgsqlCommand (sql, dbcon, dbtran))

{

dbcmd.Parameters.Add("a", myparm);

using (NpgsqlReader reader = dbcmd.ExecuteReader())

{

while(reader.Read())

{

var firstname = reader.GetString (0);

var lastname = reader.GetString (1);

Console.WriteLine ("Name: {0} {1}", firstname, lastname)

}

}

}

```
새로운 언어 구문기존 언어에 새로운 구문을 추가하는 매크로를 정의할 수 있다.

```nemerle

macro ReverseFor (i, begin, body)

syntax("ford", "(", i, ";", begin, ")", body)

{

<[ for ($i = $begin; $i >= 0; $i--) $body ]>

}

```

위 매크로는 `ford`라는 새로운 반복문 구문을 정의한다. 이 구문은 `for` 반복문과 유사하지만, 반복 변수(`i`)가 감소하는 방식으로 동작한다.

```nemerle

ford (i ; n) print (i); // n부터 0까지 i를 출력

5. 통합 개발 환경 (IDE)

비주얼 스튜디오 2008에 통합될 수 있다. 비주얼 스튜디오 익스프레스 에디션과 같은 비주얼 스튜디오 2008 셸 기반의 완전 무료 IDE와 SharpDevelop도 지원한다.[6][10]

SharpDevelop용 플러그인([https://code.google.com/archive/p/nemerle/source#svn%2Fnemerle%2Ftrunk%2Fsnippets%2Fsharpdevelop 플러그인 페이지])도 제공된다.

애드인을 통해 비주얼 스튜디오 (2017년까지)에도 통합될 수 있다.[6] Visual Studio 2010용 애드인은 [http://visualstudiogallery.msdn.microsoft.com/5d93dc0a-0ce9-4b97-970c-ab1993eb934a 여기]에서, Visual Studio 2013 버전은 [http://visualstudiogallery.msdn.microsoft.com/fb29c7b2-d1e5-42e4-8a56-9b9c022c22a9 여기]에서 받을 수 있다.

6. 예제 코드

Nemerle은 C#과 유사한 방식으로 전통적인 헬로 월드!를 출력할 수 있다. 다음은 그 예시이다.

```nemerle

class Hello

{

static Main () : void

{

System.Console.WriteLine ("Hello, world!");

}

}

```

더 간단하게는 아래와 같이 작성할 수도 있다.

```nemerle

System.Console.WriteLine("Hello, world!");

```

Nemerle 코드는 ASP.NET 페이지에 직접 내장하거나 별도 파일로 작성할 수 있다.

Nemerle은 네이티브 플랫폼 라이브러리를 활용할 수 있는데, 구문은 C# 및 기타 .NET 언어와 매우 유사하다.[1]

```csharp

using System;

using System.Runtime.InteropServices;

class PlatformInvokeTest

{

[DllImport("msvcrt.dll")]

public extern static puts(c : string) : int;

[DllImport("msvcrt.dll")]

internal extern static _flushall() : int;

public static Main() : void

{

_ = puts("Test");

_ = _flushall();

}

}

6. 1. Hello, World!

nemerle

class Hello

{

static Main () : void

{

System.Console.WriteLine ("Hello, world!");

}

}

```

또는 더 간단하게:

```nemerle

System.Console.WriteLine("Hello, world!");

```

위와 같이 C#과 유사한 방식으로 전통적인 헬로 월드!를 출력할 수 있다.

6. 2. ASP.NET 통합













```
코드 예시 (별도 파일):```aspx-cs

<%@ Page Language="Nemerle" Src="test.n" Inherits="Test" %>

6. 3. P/Invoke

Nemerle은 네이티브 플랫폼 라이브러리를 활용할 수 있다. 구문은 C# 및 기타 .NET 언어와 매우 유사하다. 다음은 가장 간단한 예시이다.[1]

```csharp

using System;

using System.Runtime.InteropServices;

class PlatformInvokeTest

{

[DllImport("msvcrt.dll")]

public extern static puts(c : string) : int;

[DllImport("msvcrt.dll")]

internal extern static _flushall() : int;

public static Main() : void

{

_ = puts("Test");

_ = _flushall();

}

}

참조

[1] 웹사이트 Nemerle 1.2.507.0 http://nemerle.org/D[...]
[2] 웹사이트 Twitter / orangy: We've decided to bring Nemerle https://twitter.com/[...] Twitter.com 2013-09-05
[3] 웹사이트 JetBrains .NET Tools Blog » JetBrains and Nemerle http://blogs.jetbrai[...] Blogs.jetbrains.com 2012-06-27
[4] 웹사이트 Google Discussiegroepen https://groups.googl[...] 2013-09-05
[5] 웹사이트 Nemerle Studio Microsoft Setup Installer https://code.google.[...]
[6] 웹사이트 Visual Studio 2010 add-in http://visualstudiog[...]
[7] 웹사이트 Twitter / orangy: We've decided to bring Nemerle https://twitter.com/[...] Twitter.com 2013-09-05
[8] 웹사이트 JetBrains .NET Tools Blog » JetBrains and Nemerle http://blogs.jetbrai[...] Blogs.jetbrains.com 2012-06-27
[9] 웹사이트 Google Discussiegroepen https://groups.googl[...] Groups.google.com 2013-09-05
[10] 웹사이트 Nemerle Studio Microsoft Setup Installer https://code.google.[...]
[11] 웹사이트 Nemerle 1.2.507.0 http://nemerle.org/D[...]



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com