맨위로가기

Kent Recursive Calculator

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

1. 개요

Kent Recursive Calculator (KRC)는 데이비드 터너가 SASL의 경험을 바탕으로 설계한 함수형 프로그래밍 언어이다. 1980년대 켄트 대학교와 옥스퍼드 대학교에서 교육용으로 사용되었으며, 지연 평가를 지원하고 ZF 집합 연산 기능을 갖춘 것이 특징이다. KRC는 리스트를 스트림으로 구현하여 지연 평가를 실현하고, 팩토리얼, 상호 재귀 함수, 가드, 문자열 연결 등 다양한 프로그래밍 기능을 제공한다.

더 읽어볼만한 페이지

  • 함수형 프로그래밍 언어 - XQuery
    XQuery는 함수형 프로그래밍 패러다임을 지원하며 XPath 식 구문의 상위 집합을 포함하는 XML 데이터 추출 및 조작을 위한 쿼리 언어로서, FLWOR 식을 통해 XML 데이터 조작 및 새로운 XML 문서 구성을 지원하고 XQuery 및 XPath 데이터 모델(XDM)을 기반으로 한다.
  • 함수형 프로그래밍 언어 - 코틀린 (프로그래밍 언어)
    코틀린은 젯브레인즈에서 개발한 정적 타입 언어로, 자바 가상 머신에서 동작하며 자바와의 호환성을 갖고, 안드로이드 공식 지원 언어로 채택되어 다양한 분야에서 활용되고 있으며, 이름은 러시아의 코틀린 섬에서 유래되었다.
Kent Recursive Calculator - [IT 관련 정보]에 관한 문서
기본 정보
이름KRC (켄트 재귀 계산기)
패러다임함수형 프로그래밍
디자인데이비드 터너
최초 출시 연도1981년
자료형동적 자료형
영향을 받은 언어SASL
영향을 준 언어Miranda, Orwell (OL), Haskell
웹사이트http://krc-lang.org

2. 역사

1972년부터 1976년까지 데이비드 터너는 스코틀랜드의 세인트앤드루스 대학교에서 SASL(St.Andrews Static Language)라는 언어를 설계·구현하여 주로 교육에 사용했다. 터너가 켄트 대학교로 옮겨간 후에는 이 경험을 살려 새로운 언어를 설계·구현했는데, 그 언어가 바로 KRC(Kent Recursive Calculator)이다[5]. KRC는 1980년대에 켄트 대학교옥스퍼드 대학교에서 함수형 프로그래밍 강의에 사용되었다.

3. 특징

KRC는 SASL의 문법을 개선한 언어로, 패턴 매칭, 가드, 등식으로 표현된 재귀 가능한 함수 정의를 지원한다. ZF 표기법(리스트 컴프리헨션)을 갖추고 있으며, 변수의 형이 실행 시점에 결정되는 동적 타이핑 언어이다. where 절은 생략되었다.[5]

3. 1. 지연 평가

KRC에서 리스트는 지연 평가를 실현하는 스트림으로 구현되어 있다. 스트림 처리의 연장선상에서 KRC에 구현된 것이 체르멜로-프렝켈 집합 연산 기능(ZF 집합 연산 기능)이다. 체르멜로-프렝켈 공리계에서 집합을 내포 표기법으로 기술하는 경우,

:\{ f(a)|a \in S \} (단, S는 집합)

로 기술하지만, 이 표기법을 프로그래밍 언어에 도입한 것이 KRC의 ZF 집합 연산 기능이다. 단, KRC에서는 원래의 집합이 아닌 리스트(스트림)로 실현하고 있다.

3. 2. ZF 집합 연산 기능

체르멜로-프렝켈 공리계에서 집합을 내포 표기법으로 기술할 때 사용하는 다음의 식을 프로그래밍 언어에 도입한 것이 KRC의 ZF 집합 연산 기능이다.

:\{ f(a)|a \in S \} (단, S는 집합)

KRC에서는 원래의 집합이 아닌 리스트(스트림)로 이 기능을 실현한다.[1]

4. 후속 언어

KRC의 후속 언어로는 Miranda가 있다.[5] Miranda에서는 다형 타입이 도입되었으며, KRC에서 생략된 where 절이 구현되었다.

5. 샘플 코드

haskell

krc> "Hello, World\n"!

```

Hello, World영어

```haskell

krc> I x = x

```

위 코드는 항등 함수 I를 정의하는 예제이다. I는 입력값 x를 그대로 반환한다.[1]

```haskell

krc> answer = const 42 (1 / 0)

```

const영어 함수는 두 개의 인수를 받아 첫 번째 인수를 반환하고 두 번째 인수는 무시하는 함수이다. 위 코드는 `answer`에 `const 42 (1 / 0)`을 할당한다. `answer`의 값을 확인하려고 시도하면(`krc> answer?`) 42가 반환된다. const영어 함수는 첫 번째 인수를 반환하고 두 번째 인수는 평가하지 않으므로, `1 / 0`은 계산되지 않고 오류가 발생하지 않는다. 이는 지연 평가의 예시이다.[1]

```haskell

krc> total [] = 0

krc> total (x:xs) = x + total xs

```

리스트의 총합을 구하는 함수 `total`은 패턴 매칭을 사용하여 정의할 수 있다. 빈 리스트 `[]`에 대한 `total`의 값은 0이다. `x:xs` 패턴은 리스트의 첫 번째 요소 `x`와 나머지 리스트 `xs`로 분리한다. 이 경우 `total` 함수는 `x`와 `xs`에 대한 `total` 함수의 결과를 더한 값을 반환한다. 즉, 리스트의 모든 요소를 재귀적으로 더하는 방식으로 동작한다. `[1..10]`은 1부터 10까지의 숫자를 포함하는 리스트를 생성한다. `total` 함수를 이 리스트에 적용하면(`krc> total [1..10]?`), 1부터 10까지의 모든 숫자를 더한 결과인 55를 반환한다.[1]

```haskell

krc> take 20 [10, 14..]?

[10,14,18,22,26,30,34,38,42,46,50,54,58,62,66,70,74,78,82,86]

```

`take` 함수를 사용하여 리스트의 일부분을 추출하는 예시이다.

```haskell

fac 0 = 1

fac n = n * fac (n-1)

```

factorial|팩토리얼영어 함수 fac을 재귀 함수로 정의하는 예제이다.[1]

```haskell

ev 0 = "TRUE"

ev n = od (n-1)

od 0 = "FALSE"

od n = ev (n-1)

```

위 코드는 짝수와 홀수를 판별하는 함수 `ev`와 `od`를 상호 재귀 함수로 정의한 것이다. `ev` 함수는 입력값이 0이면 `"TRUE"`를 반환하고, 그렇지 않으면 `od (n-1)`을 호출한다. `od` 함수는 입력값이 0이면 `"FALSE"`를 반환하고, 그렇지 않으면 `ev (n-1)`을 호출한다. 이렇게 두 함수가 서로를 호출하면서 짝수와 홀수를 판별한다. `map ev [1..10]?`를 실행하면 `["FALSE","TRUE","FALSE","TRUE","FALSE","TRUE","FALSE","TRUE","FALSE","TRUE"]`가 반환된다.[1]

```haskell

fac n = 1, n == 0

= n * fac (n-1), n > 0

```[1]

```haskell

krc> implode ["Hello, ", "World", "\n"]?

"Hello, World\n"

```

`implode` 함수를 사용하여 문자열 리스트를 연결하는 예제이다.

5. 1. Hello, World

haskell

krc> "Hello, World\n"!

```

Hello, World영어

5. 2. 함수 정의

haskell

krc> I x = x

```

위 코드는 항등 함수 I를 정의하는 예제이다. I는 입력값 x를 그대로 반환한다.[1]

5. 3. 지연 평가

haskell

krc> answer = const 42 (1 / 0)

```

const영어 함수는 두 개의 인수를 받아 첫 번째 인수를 반환하고 두 번째 인수는 무시하는 함수이다. 위 코드는 `answer`에 `const 42 (1 / 0)`을 할당한다.

```haskell

krc> answer?

```

`answer`의 값을 확인하려고 시도한다.

```

42

```

`answer`의 값은 42이다. const영어 함수는 첫 번째 인수를 반환하고 두 번째 인수는 평가하지 않으므로, `1 / 0`은 계산되지 않고 오류가 발생하지 않는다. 이는 지연 평가의 예시이다.[1]

5. 4. 패턴 매칭

haskell

krc> total [] = 0

krc> total (x:xs) = x + total xs

```

리스트의 총합을 구하는 함수 `total`은 패턴 매칭을 사용하여 정의할 수 있다. 빈 리스트 `[]`에 대한 `total`의 값은 0이다. `x:xs` 패턴은 리스트의 첫 번째 요소 `x`와 나머지 리스트 `xs`로 분리한다. 이 경우 `total` 함수는 `x`와 `xs`에 대한 `total` 함수의 결과를 더한 값을 반환한다. 즉, 리스트의 모든 요소를 재귀적으로 더하는 방식으로 동작한다.

```haskell

krc> total [1..10]?

55

```

`[1..10]`은 1부터 10까지의 숫자를 포함하는 리스트를 생성한다. `total` 함수를 이 리스트에 적용하면, 1부터 10까지의 모든 숫자를 더한 결과인 55를 반환한다.[1]

5. 5. 리스트

haskell

krc> take 20 [10, 14..]?

[10,14,18,22,26,30,34,38,42,46,50,54,58,62,66,70,74,78,82,86]

```

`take` 함수를 사용하여 리스트의 일부분을 추출하는 예시이다.

5. 6. 재귀 함수

haskell

fac 0 = 1

fac n = n * fac (n-1)

```

factorial|팩토리얼영어 함수 fac을 재귀 함수로 정의하는 예제이다.[1]

5. 7. 상호 재귀 함수

haskell

ev 0 = "TRUE"

ev n = od (n-1)

od 0 = "FALSE"

od n = ev (n-1)

```

위 코드는 짝수와 홀수를 판별하는 함수 `ev`와 `od`를 상호 재귀 함수로 정의한 것이다. `ev` 함수는 입력값이 0이면 `"TRUE"`를 반환하고, 그렇지 않으면 `od (n-1)`을 호출한다. `od` 함수는 입력값이 0이면 `"FALSE"`를 반환하고, 그렇지 않으면 `ev (n-1)`을 호출한다. 이렇게 두 함수가 서로를 호출하면서 짝수와 홀수를 판별한다.[1]

`map ev [1..10]?`를 실행하면 `["FALSE","TRUE","FALSE","TRUE","FALSE","TRUE","FALSE","TRUE","FALSE","TRUE"]`가 반환된다.[1]

5. 8. 가드

haskell

fac n = 1, n == 0

= n * fac (n-1), n > 0

```[1]

5. 9. 문자열 연결

haskell

krc> implode ["Hello, ", "World", "\n"]?

"Hello, World\n"

```

다음은 `implode` 함수를 사용하여 문자열 리스트를 연결하는 예제이다.

```haskell

krc> implode ["Hello, ", "World", "\n"]?

"Hello, World\n"

참조

[1] 문서 Dates in the commentary to the BCPL KRC source code for EMAS
[2] FOLDOC Kent Recursive Calculator
[3] 웹사이트 公式ウェブサイト http://krc-lang.org
[4] 문서 BCPL による実装は C 言語にポーティングされ、2018年現在、公式ウェブサイトでソースコードが公開されている。
[5] 문서 新世代(1986) pp.36-37
[6] 문서 Dates in the commentary to the BCPL KRC source code for EMAS



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

문의하기 : help@durumis.com