KRC (Kent Recursive Calculator) とは、イギリス・ケント大学(University of Kent)のデビッド・ターナーによって設計・実装された単純な遅延評価方式の純粋関数型プログラミング言語である[1]1979年11月から1981年10月にかけて、EMAS オペレーティングシステム上に BCPL で実装された[2]

KRC
パラダイム 関数型宣言型
登場時期 1981年
設計者 デビッド・ターナー
型付け 動的型付け
影響を受けた言語 SASL
影響を与えた言語 MirandaOrwell (OL)Haskell
ウェブサイト krc-lang.org
テンプレートを表示

概要 編集

1972年から1976年にかけてデビット・ターナーはスコットランドのセントアンドリュース大学においてSASLSt.Anrews Static Language)という言語を設計・実装し、主に教育に用いていた。ターナーがケント大学に移ってからはこの経験を生かして新たに言語を設計・実装したが、その言語がKRCKent Recursive Calculator)である[3]。KRC は1980年代にケント大学オックスフォード大学で関数型プログラミングの講義に使用された。

KRCはSASLの文法にさらに改良を加えた言語で、パターンマッチガード、等式で表現された再帰可能な関数定義、ZF 表記(リストの内包表記)を備えている。一方で、where 句は省略された。なお、変数の型が実行時に決まる動的型付け言語である。

KRC の後継言語としては Miranda である。Miranda では多相型が導入された他、KRC では省略された where 句が実装されている。

ZF 集合演算機能(ZF set abstraction) 編集

KRCにおいてリストは遅延評価を実現するストリームとして実装されている。そのストリーム処理の延長として容易に実現できる機能としてKRCに実装されているのがツェルメロ=フレンケル集合演算機能(以下、ZF 集合演算機能と言う)である。ツェルメロ=フレンケルの公理系において、集合を内包表記で記述する場合、

 (ただし、S は集合)

と記述するが、この表記法をプログラミング言語に導入したのが、KRC の ZF 集合演算機能である。ただし、KRC では、本来の集合ではなくリスト(ストリーム)によって実現している。

サンプルコード 編集

Hello, World 編集

krc> "Hello, World\n"!
Hello, World

関数定義 編集

krc> I x = x
krc> I 42?
42

遅延評価 編集

krc> answer = const 42 (1 / 0)
krc> answer?
42

パターンマッチ 編集

krc> total [] = 0
krc> total (x:xs) = x + total xs
krc> total [1..10]?
55

リスト 編集

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]

再帰関数 編集

krc> fac 0 = 1
krc> fac n = n * fac (n-1)
krc> fac 10?
3628800

相互再帰関数 編集

krc> ev 0 = "TRUE"
krc> ev n = od (n-1)
krc> od 0 = "FALSE"
krc> od n = ev (n-1)
krc> map ev [1..10]?
["FALSE","TRUE","FALSE","TRUE","FALSE","TRUE","FALSE","TRUE","FALSE","TRUE"]

ガード 編集

krc> fac n = 1,             n == 0
krc>       = n * fac (n-1), n > 0
krc> fac 10?
3628800

文字列の連結 編集

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

脚注 編集

  1. ^ 公式ウェブサイト
  2. ^ BCPL による実装は C 言語にポーティングされ、2018年現在、公式ウェブサイトでソースコードが公開されている。
  3. ^ 新世代(1986) pp.36-37

参考文献 編集

関連項目 編集

外部リンク 編集

公式ウェブサイト