- 前文 - Preamble
- 概要- Abstract
- 名称 - Name
- 主要方針 - Main Policy
- 主要要件 - Main Requirement
- マルチパラダイム言語 - Multi-Paradigm Language
- オブジェクト - The Object
- 識別名 - Modified Name
- 名前空間
- 代数 - Aljebraics(Algebraic Models)
- 関数
- 代数的データ構造
- リテラル表現
- 基本構文
- 関数型
- 文字列処理
- 数理計算
- グラフィック・空間モデル処理
- 附属子類
- 並行処理・並列処理・分散処理
- 例外処理
- 言語間グルー機能
この言語は、外観はシンプルであり、かつそれでいて内側は複雑である。
Ruby を超える楽しさ、C 言語の速度、MATRAB や Mathematica のような数式になじんだ記述、Julia や Haskell、Octave のような強力な数式処理、Ruby のような関数型プログラミングと命令型プログラミングが絶妙に調和されたデザイン、Dart のようなクロスプラットフォーム、Ruby や Dart のような実用性、LISP(Scheme)から受け継いだ強力な記号操作と推論能力、Ruby のような強力な正規表現とそれに裏付けられた文字列処理、Ruby や Lua のようなグルー性、Dart のようなクラウドコンピューティング、Dart のような簡潔な UI 記述、Scala のような継続、HSP のような専用開発環境を併せ持つ言語を求めてこの言語を設計した。
我々は美的であり、貪欲である。果てしない可能性を追い求めて。
この言語は、Julia ,Dart ,及び Ruby に触発されて製作されたものであり、Julia, Dart, Ruby, Ada, LISP(Scheme), Haskell, Oz, D, Chestnut,Lury, Scala, Nemerle, HSP 及び OCaml の影響を強く受けている。また、これらの言語及びその他の数多の諸言語を参考にしている。
汎用機能と特化型機能を兼ね備えている超高級言語である。分散処理・並列処理や数理数式処理・科学技術計算・知的推論・統計解析に特化しているほか、グラフィック・空間モデル処理、ハードウェア(インターフェース等)制御、組込システム(センサ/アクチュエータ)制御、文字列処理、データ(構造データ/データベース)処理、サーバ処理等にも幅広くフォーカスされている。手続き型と関数型の性質を兼ね合わせた真のクロスプラットフォーム言語である。
簡潔かつ分かりやすい記法で扱いやすく、また数式処理等はそれぞれになじんだ記法が採用されており、複雑な数式やアルゴリズムをストレスなく自然、シンプルかつリーダブルに記述できる。加えて-O3/-O4 C lang に匹敵する高速性(処理系への最上級要求事項)がある。
本文書ではこの言語の全てを体系的に説明する。
「FunCobal」という名前はすわわ氏により命名された。氏によると、「Fun」は「関数型的なスタイルによる言語」に由来し、またこの言語が楽しい言語になるようにとの希望も含まれている。「Cobal」は、筆頭製作者である Haruka Sato(Takuya Matsunaga)のニックネームの一つである「Cobaltia」に由来する。
「Functional UNiversal Common Object-Based Algorithmic Language」の頭字でもある。
The name "FunCobal" is named by Mr. Suwawa. According to his saying, the origin is "Fun" from "with Some Functional Style" and hope that the language will be fantastic, and "Cobal" from "Cobaltia" , the alias name of Haruka Sato(Takuya Matsunaga), chief developer of the language.
- 小規模開発から大規模開発まで
- フロントエンドからバックエンドまで
- 汎用から科学技術計算,計算科学,数値解析まで
- リスク耐性
- コーディング効率よりも可読性を重視すること
- プリプロセッサマクロを持たないこと
- マルチパラダイム言語
- 強い型検査(コンパイル時および(オプションとして)実行時)
- 自動ビルド(処理系への要求項目)
- -O3/-O4 C lang に匹敵する高速性(処理系への最上級要求事項)
命令型プログラミング
Imperative Programming
├ オブジェクト指向プログラミング
│Object-Oriented Programming
│ ├ アスペクト指向プログラミング
│ │ Aspect Oriented Programming
│ ├ アクターモデル
│ │ Actor Model
│ └ プロトタイプベース
│ Prototype-Based
└ 手続き型プログラミング
Procedural Programming
└ モジュラープログラミング
Modular Programming
宣言型プログラミング
Declarative Programming
└ 関数型プログラミング
Functional Programming
契約プログラミング
Programming by Contract
文芸的プログラミング
Literate Programming
目的プログラミング
Intentional Programming
総てのリテラルはオブジェクトである。
ソースコードは総て Unicode で記述され処理される。 代数や関数などの総ての識別子は Unicode で記述し、UTF-8 で保存する。対して ASCII や ANSI、S-JIS はゴミであり、使用できず、また使用してはならない。
識別子は内部的には Symbol 型で評価・処理される。識別子のシンボルは symbol アノテーションで得られる。シンボルから識別子の取得は Symbol.getString ()メソッドで得られる。
同一オブジェクト種別間のみならず、異なるオブジェクト種別の間でも識別名の衝突は許さない。多重定義(異なる引数構成について異なる振舞いをさせること)は、オプショナル引数及び共用体、Type アノテーション、null チェックによって実現する。
本言語はグルー性をもっており、(後述する)@using
アノテーションで他の言語を組み込むことができる。FunCobal のコンパイラ・インタプリタ・REPL はこのアノテーションに当たったらその配下のコードをそれぞれの言語処理系の API に投げ、意味論解読した構文木をうけとる。
主な系列言語形式名前空間は次の通りである。
- Bantra : FC/Ches LL Langs : ex. Yezi-diki, Chestnut Bytecode
- Hardin: FC HL Langs : ex. FunCobal, Hjerbata, FC-Shell
- Tolte : Ches HL Langs : ex. Chestnut
- Google: Google Langs : ex. Dart, Go lang
また、記述されているファイルの主たる言語との関係性により、以下の特別指定句にて名前空間を指定することができる。
- This : 自らの属する名前空間を示す
- Sub : 配下の名前空間(DSL など)を示す
- Super : Sub の逆を示す
プログラム単位名前空間として、次の
- library: レポジトリ又はディレクトリ。最上位のプログラム単位で、単独で置かれる。複数の package を統合するもので、一つの library 内に複数の package が置かれる。構成設定ファイルは
<LibName>.fpub
- package: レポジトリ又はディレクトリ。最も基本的なプログラム単位で、library 下又は単独で置かれる。構成設定ファイルは
<PkgName>.tsaaspec
- module: ディレクトリ。package を分割するもので、package 下にのみ置かれる。構成設定ファイルは
<ModName>.mod
package 又は module に含まれる任意ファイルの中で、一または複数の代数的データ構造を抱合する名前空間として、次の内部名前空間を
- namespace
- group
代数的データ構造は名前空間も構成する。代数的データ構造の詳細は代数的データ構造を参照。
型(データ型)はオブジェクトであり、オブジェクトにより定義される集合である。データ型は包含的派生型による型ツリーを構築する。
詳細はFunCobal 型システム.md(あるいはFunCobal 型システム.pptx)を参照のこと。型システム .md の方が最新である。
スコープ | 常数 | 定数 | 変数 | 微数 | 関数 |
---|---|---|---|---|---|
ブロックスコープ | Readonly | Final | Let | ||
ファイルスコープ | ConstExpr | FixedExpr | Auto | ||
グローバルスコープ | Const | Fixed | Var | ||
常に等値 | 再代入不可 | 制約なし | |||
実行時定数 | コンパイル時定数 | 通常変数 |
代数は、変数種名と型名を::
で結合し、宣言するべき代数の識別名と半角空白を開けて前置する。
Let::Int a;
FixedExpr::Int b = 30;
関数は、データ型からデータ型への写像であり、具体的には計算や処理の定義である。独立代数を引数、従属代数を返り値とする。
引数及び返り値はいついかなる時でも一つである。複数の代数を受け渡しする必要がある場合はタプル型を、受け渡しする代数がない場合は Void 型を用いる。
@function
アノテーション影響下では参照透過性をもち、副作用をもたない。
この言語においては、いかなる関数も任意に合成することができ、関数を引数に渡すこと、及び関数チェーンにより実装できる。数学(代数学)の関数合成と同じである。関数チェーンは、代数学における合成演算子(∘)がドット(.
)になっただけである。
関数チェーンを行った場合、返り値が次の第一引数となる。この返り値と第一引数の型が違う場合(キャストが指定されている場合を除く)には、普通の代入と同様にエラーが吐かれる。関数の引数渡しと関数チェーンは次のように対応する。
- 引数渡し:
f (g (x))
- 関数チェーン:
x . g () . f ()
代数的データ構造は則ち集合である.
- 集合:集合オブジェクト。エイリアスとして set をもち、set 文によって定義される。
- 連続体:コンストラクタのみの列挙型オブジェクト。エイリアスとして enum をもち、enum 文によって定義される。コンストラクタ必須である。内包的表記、外延的表記のどちらも可能である。構造体・共用体・多様体に紐付けし、その生成・解放を行うことができる。コンストラクタを省略して暗黙的に単純代入コンストラクタを自動構築することできる。
- 構造体:フィールドのみでメソッドのない直積型オブジェクト。エイリアスとして struct をもち、struct 文によって定義される。コンストラクタは任意である。コンストラクタのない場合は、フィールド宣言時のデータがインスタンス作成時にインスタンスにコピーされる。
- 共用体:フィールドのみでメソッドのない直和型オブジェクト。F#の判別共用体に相当。エイリアスとして union をもち、union 文によって定義される。
- 関数体:メソッドのみの直和型オブジェクト。構造体・共用体・多様体に実装を紐付けし、主たるメソッド基盤となることができる。
- [廃止]
- 多様体:少なくとも局所的には座標系が定義できるオブジェクト。エイリアスとして fold をもち、fold 文によって定義される。シェイプ、コンポーネントやウィジェット、CG モデルや地理空間データなどがある。多様体を参照。
主たるメソッド基盤である関数体はモジュールをミクスイン(Mixin)し、トレイトやプロトタイプのすべてのメソッドを自由に受け取ることができる。
- プロトタイプ: 抽象メソッド宣言であり、実装をもたない。Java 言語などのインターフェースに相当する。この場合のプロトタイプは プロトタイプベースのプロトタイプとは異なるので注意のこと。
- トレイト: 拡張メソッド基盤であり、実装をもつ。識別子が衝突する場合、ミクスイン先におけるエイリアス定義によって解決されるが、欠缺のある場合は、トレイト側の衝突するメソッドが無視(除外)される。
enum {}
struct
クラスの定義。基本表記と簡略表記がある
--- 基本表記
funs クラス名 extends 継承元クラス impl プロトタイプ with トレイト <- {
}
--- 簡略表記
funs クラス名 < 継承元クラス : プロトタイプ :: トレイト <- {
}
プロトタイプは関数体に紐づけられたオブジェクトの一種であるが、プロトタイプ単独では定義できない。関数体定義時に deriv キーワードを宣言することにより同名のプロトタイプが暗黙的に定義される。
--- クラスの定義とプロトタイプの暗黙定義
class クラス名 extends 継承元クラス impl プロトタイプ with トレイト deriv {
}
トレイトは関数体に紐づけられたオブジェクトの一種であり、以下の 3 つの制限をクリアした関数体であれば、トレイトとして提供できる。クラスが具象か抽象かは問わない。関数体定義時に mod キーワードを宣言することにより同名のトレイトが暗黙的に定義される。
- 構造体や連続体の実装ではない
- スーパーオブジェクトが Any(Any 以外のオブジェクトを継承していない)
- super キーワードでスーパーオブジェクトを参照していない
--- クラスの定義とトレイトの暗黙定義
class クラス名 extends 継承元クラス impl プロトタイプ with トレイト mod {
}
文はブロック(リテラル・代数問わず)を伴う式である。
中括弧(アノテーションの小括弧も同じ)では、始まりのものに直前に半角空白のみを、終わりのものには直後に改行を伴う。制御構文の小括弧については、始まりのものに関し同様。空ブロックはその始まりと終わりに括弧の間に半角空白ただ一つのみを伴う。カンマは行末にある場合は改行、そうでない場合は半角空白ただ一つのみを伴う。
文の中括弧の省略は邪悪なのでできない。
契約
デフォルトでは中置記法であるが、ポーランド記法と逆ポーランド記法もサポートする。
ポーランド記法は:(operator operand, operand)
、逆ポーランド記法は:~(operand, operand operator)
と記述する。
goto 文,comefrom 文,break 文,continue 文,三項条件演算子は有害なので存在しない。
伴う条件式が真だった場合の処理を記述する:
if 文の条件が偽だった場合の処理を記述する:
else 文とそれに内包された if 文の縮約形である:
は次と等価である:
標準の for ループを使って繰り返しができる。例えば:
while ループはループの前に条件を計算する:
直前に do 文を伴う場合はそのループの後に条件を計算する:
整数や文字列などの比較によって条件分岐する:
パターンマッチであり、条件の範囲や集合によって条件分岐する:
while 文に伴う:
そのほか、単独で出現してひと纏まりの処理をつくる:
あるいは、引数タプルを伴って nullable 引数を non-null 化する:
あるいは、
do 文ととそれに内包された try 文の縮約形:
please {
Future<String> file = File("some-path.ext").readString()
}
は次と等価である:
do {
try {
Future<String> file = File("some-path.ext").readString()
}
}
関数に内包されて、もしくは assert 文や require 文に伴ってメッセージを生成する:
伴う条件式が偽だった場合に通常の実行を中断させる:
その内包する処理のいづれかが失敗すると通常の実行を中断させる:
例外が発生する可能性のある処理を記述し、試行する:
try {
Auto::List<Int> ls = List()
Auto::String str = ls[-1]
}
例外が発生した場合の処理を記述し、捕捉した例外を救出する:
rescue {
print ("No Index Available, And Illegal Type")
}
特定又は限定された例外を救出することもできる:
rescue (NoValidIndexErr){
fix ($${1} = ls[$${2}], $${1} = ls[0])
}
rescue (NoMatchTypesErr){
fix ($${1} = ls[$${2}], $${1} = ls[$${2}] as String)
}
※ここで唐突に出てくるfix (wrong,correct)
は誤った構文パターン検索と修正の機能を提供する。$${数字}
は構文パターンの任意部分を示すワイルドカード。
また、例外型列挙定義にて、その型の例外を救出する処理を記述する。
enum NoMatchTypesErr {
impl = rescue {
fix ($${1} = ls[$${2}, $${1} = ls[$${1}] as ${2}.type)
},
impl = massage (Display disp) {
disp = "An NoMatchTypesErr occurred: $${0}"
},
impl = do {
-- error object
},
}
例外が発生するか否かに関わらず実行する処理を記述する:
ensure {
print ("End Proc")
}
次の 4 種に対応している。
--- comments
[] ( comments )
#! comments
/// comments
次の 4 種に対応している。doc 対象でないものは全てネストに対応している(doc 対象のものも最も内側になる場合に限りネストされることができる)。
{-
comments
for
multi-lines
-}
(*
comments
for
multi-lines
*)
//*
comments
for
multi-lines
///
///
| comments
| for
| multi-lines
///
Int 型から Num 型、Real 型から Complex 型、String 型から Chd 型、Char 型から String 型などのように、情報及び精度を失わせない場合は、次のように明示的キャストを行うことができる。この明示的キャストを昇格という。
情報及び精度を失わせる場合においても、warning が出るものの明示的キャストを行うことができる。
明示的キャスト小括弧で囲った型名を前置するか、或いは as 構文で昇格する。
Auto::Int bit_64 <- 64
Auto::Double dou_bit <- (Double) bit_64
或いは
Auto::Char ch <- "c"
Auto::String str <- ch as String
暗黙キャストによるメモリ侵犯の虞を考慮し、暗黙キャストを提供しない。
代数から type パラメータで型名を出し eq メソッドで照合し if 文で条件分岐することで、if 文内の処理で明示キャストを必要としない。照合が完了した代数は通過した照合に用いた型名を持つ型であると自動的に推論される。
Fn sampleFunc (Literal var) {
if (var.type.eq(String)) {
print(var.length);
}
else {
print(var.toString.length);
}
}
@function アノテーションで囲われたエリア内では、関数型プログラミングにて記述することができる。
@function (
Let::Int factor <- (Int n) {
if (n>0) {
n * factor(n - 1)
}
else {
1
}
}
)
@function アノテーション配下或いは laziness 指定子のついたブロック内、lazy 指定子のついた式において遅延評価が適用される。
--- 遅延評価 この例の場合変数dが呼び出されるまで9+5はされない
lazy.Let::Int d = 9+5;
--- 遅延評価 lpブロック内の処理はlpブロックを呼び出す処理が評価されるまで評価されない
Block lp <- laziness {
print (9.toString ())
}
ラムダ記号>\
を用いてラムダ式を表現し、ラムダ計算をすることができる(@function アノテーション外でも利用できる)。
記法は(>\ (引数) -> 処理)
である。
本言語、もとい FunCobal family プロジェクトは専用の正規表現ライブラリ(とはいえ当然他の言語にも導入可能だが。)である「鬼瀬」("Onigase")を擁しており、研究開発が進行している。
詳しくは上記リンク先を参照の事。
--- 通常関数
ord(String)
--- メソッド付加
String.ord()
--- 通常関数
chr(String)
--- メソッド付加
String.chr()
--- 通常関数
replace(置き換え元String,置き換え部分String,置き換え先String)
--- メソッド付加
置き換え元String.replace(置き換え部分String,置き換え先String)
GUI 処理は@sdata
アノテーション(後述)等を用いてコードを直書きすることも可能ではあるが、コンパイル/実行速度の向上にはほとんど資さないし、そのうえ可読性や生産性を大きく損なうので特に特殊な処理を行うのでなければ直書きはすべきでない。
GUI 処理の為には多様体のシステム及びグラフィカルパーツであるコンポーネントを用いる事が良い。
組込ライブラリである DomKit の各パッケージを用いて@sdata
アノテーションによる構造データが操作される。コンポーネントに基づいて DomKit により画面が描画される。
演算子 | 意味 | 同値 | 対応メソッド |
---|---|---|---|
a + b | 和 | add (a, b) | |
a - b | 差 | sub (a, b) | |
a * b | 積 | mul (a, b) | |
a / b | 商 | div (a, b) | |
a % b | 剰余 | mod (s, b) | |
a @ b | 剰余差 | a - (a % b) | sub/mod (a, b) |
a | b | 整除 | (a @ b) / b | |
a ^ ind | 冪 | power (a, ind) | |
ind _/ a | 冪根 | sqrt (a, ind) | |
!/ a | 平方根 | sqrt (a, 2) | |
!!/ a | 立法根 | sqrt (a, 3) | |
対数 | log (a , ind) | ||
自然対数 | log (a , E) | ||
常用対数 | log (a , 10) | ||
論理対数 | log (a , 2) | ||
対数根 | power (ind, a) | ||
a ! | 階乗 | factor (a) | |
!! a | 階乗(前置) | factor (a) | |
絶対値 | abs (a) | ||
「 a | 天井関数 | ceil (a) | |
a 」 | 床関数 | floor (a) | |
クヌース・テトレーション | knuth3(a, b) | ||
クヌース・ペンテーション | knuth4(a, b) | ||
コンウェイ・チェーン | conway(a, b, c) |
演算子 | 意味 | 同値 | 対応メソッド |
---|---|---|---|
= | 等しい | eq(a, b) | |
!=,<> | 等しくない | neq(a, b) | |
> | 超過 | ||
< | 未満 | ||
=>,>= | 以上 | ||
=<,<= | 以下 | ||
包含 | この場合 a,b はコレクション又はクラス、構造体 | ||
被包含 | この場合 a,b はコレクション又はクラス、構造体 | ||
要素 | この場合 b はコレクション又はクラス、構造体 | ||
- 第一基本一項論理演算子
演算子 | 意味 | 同値 | |
---|---|---|---|
! a | 否定 | a !& a, a !| a | not(a, b) |
- 第一基本二項論理演算子
演算子 | 意味 | 同値 | 対応メソッド |
---|---|---|---|
a | | b 又は a or b | 論理和 | !(a !| b) | or (a, b) |
a && b 又は a and b | 論理積 | !(a !& b) | and (a, b) |
- 第二基本二項論理演算子
演算子 | 意味 | 同値 | 対応メソッド |
---|---|---|---|
a !| b 又は a nor b | 否定論理和 | !(a || b) | nor (a, b) |
a !& b 又は a nand b | 否定論理積 | !(a && b) | nand (a, b) |
- 組立二項論理演算子
演算子 | 意味 | 同値 | 対応メソッド |
---|---|---|---|
a `^ b 又は a xor b | 排他的論理和 | (a && !b) || (!a && b ) | xor (a, b) |
a `/ b 又は a sub b | 論理差 | a && !( a && b ) | sub (a, b) |
含意 | !a || b | ||
補論理積 | !(a || b) && (a && b) |
- 一項演算子
演算子 | 意味 | 同値 | 対応メソッド |
---|---|---|---|
++ | (和差)インクリメント | ||
-- | (和差)デクリメント | ||
** | 乗除インクリメント | ||
// | 乗除デクリメント | ||
+= | 加算 | ||
-= | 減算 | ||
*= | 乗算 | ||
/= | 除算 |
- 二項演算子
演算子 | 意味 | 同値 | 対応メソッド |
---|---|---|---|
<- | 代入(定義) | ||
x.f ().g () | 結合(合成) | f (g (x)) | |
- 三項演算子
演算子 | 意味 | 同値 | 対応メソッド |
---|---|---|---|
指定子は対象リテラルの直前にドット.
で結合する。例えば、public.Class sample{}
のようにである。
リテラルへのアクセス権をコントローリする。
- public すべての場所からアクセス可能(pub と省略することも可)
- default ファイル内からのみアクセス可能(デフォルト、省略可能)
- protected ブロック内、同一オブジェクト内及び子孫オブジェクトからのみアクセス可能(prot と省略することも可)
- private ブロック内及び同一オブジェクト内からのみアクセス可能(オブジェクト識別子をダブルアンダーバーで始めることでも表現できる)
静的性/動的性を指定する。省略可能なデフォルトはリテラルの種類によって異なる。
- dynamic 動的性を与える(dyn と省略することも可)
- static 静的性を与える(stat と省略することも可)
代入時に型体系における形式(精度など)をコントローリする。
- big 最高精度多倍長型形式
遅延評価や非同期処理を規定する。
- lazy 遅延評価
- await 非同期
対ブロック
- laziness 遅延評価
- async 非同期
- para 並列処理指定
型に対する指定子のうち一部は、エイリアスたる型が定義されている。例えば、動的性を与える静動指定子dynamic
はEither
型と結合しDynamic
型を形成する。
プログラムのヘッダ部(頭部)においてプログラムファイルに関する各種設定を記述する。
@package
, @env
, @depend
アノテーションは単独ファイルでコンパイル/実行する場合には必要。ライブラリパッケージを構成している場合は tsaaspec ファイルへの記述で十分であるしそのようにすべきである。
@package
: その属するパッケージ名を指定する。@env
: 動作環境を指定する。@depend
: 依存パッケージを指定する。@import
: パッケージ又はローカルのプログラムファイルをインポートする。#include
:@depend
アノテーションの追加項目を指定する。@depend
アノテーションで指定した依存パッケージのうち特定のモジュールのみの依存の場合に、その情報を指定して追加モジュールを限定する。
特定のプログラミングパラダイム(機械計算範式)を用いる場合にそのパラダイム(範式)の指定を行う。
@function
: 関数型プログラミングによる記述
-@assert
- 事前条件
- 事後条件
- 不変条件
他のプログラミング言語間のグルーイング・連携を行う場合にその指示を表明する。
@using
: プログラム中に他の言語を組み込む。系列言語形式名前空間で修飾された言語名に続けて小括弧に囲んだ組込みプログラムを記述する。
@using Sub:tex (
//code written in Texicon(DSL of FunCobal,lang bind of Hardin Namespace)
)
@using This:hjr (
//code written in Hjerbata(lang bind of Hardin Namespace)
)
@using Tolte:Chestnut (
//code written in Chestnut(lang bind of Tolte Namespace)
)
@using Google:Dart (
//code written in Dart(lang bind of Google Namespace)
)
@using Google:Go (
//code written in Go lang(lang bind of Google Namespace)
)
@index
: リストのインデックスの開始値を示す。リストのインデックスの開始値はデフォルトではは 0 であるが、計算上の理由で変更したい場合は@index
アノテーションを指定する。ブロックスコープである。
ex:
{
@index 1;
//リストのインデックスの開始値を1と指定。このブロック内で有効。
}
@dare
: 外部デバイス(標準入出力除く)(IC カード読み取り/書き込み器など)の操作を行う。@sdata
: 構造データを構築する。:net
: 外部デバイス(標準入出力除く)(IC カード読み取り/書き込み器など)の(プログラムファイルへの)設定(明示/宣言)を行う。:implements
::net
アノテーションによる設定にたいしライブラリ パッケージを関連づける。
fold 文にの前行に付けて多様体の種類を示す。
@Shape
: 点や線、円や多角形、弧などの図形@Component
: Web プログラミング等に用いるコンポーネント@Widget
: アプリケーション等に用いるウィジェット@Model
: obj ファイルや std ファイル、MMD モデルその他の CG モデル@Geographic
: 地理空間情報
パッケージ構成ファイル「tsaaspec」で用いるもの
ライブラリ構成ファイル「fpub」で用いるもの
ビルドファイル「Hardinfile」で用いるもの
非同期処理の第一の方法は、async 文と await 指定子を用いる:
//非同期処理
async {
await.doing();
}
resolve 文、reject 文を用いてメッセージを返すこともできる:
//(非同期処理の一種)
async {
//await.doing();
}
resolve {
//処理成功時に流すメッセージデータの生成処理
}
reject {
//処理失敗時に流すメッセージデータの生成処理
}
この言語では、各種の高階関数を備えている。
この言語では、並行処理に対するアプローチとして、スレッド間で可変ステートを共有できないようにするという重要な概念を中心に据えており、アクターモデルとメッセージングにより並行処理が制御される。これは堅牢性を高めるのにも役立つ。
この言語では、すべてのものがアクターである。
アクターは並行的に受信するメッセージに対応した以下のような振る舞いを備えた計算実体である
- (他の)アクターに有限個のメッセージを送信する。
- 有限個の新たなアクターを生成する。
- 次に受信するメッセージに対する動作を指定する。
アクターは他のアクターに依存せず、独立並行的に動作する。
アクター同士は相互のやり取りのためにチャンネルを開くことができる。チャンネルは一方通行のホースのようなもので、入口である tx と出口である rx のタプルで構成される。チャンネルはアクターモデルにおけるアドレスをラッパーする。
--- チャンネルを用いたアクターである関数を定義
Let::Fn<Void> threadTest1 <- (Chan tx) async {
Let::Int val = 9
tx.send()
}
Let::Fn<Void> threadTest2 <- (Chan rx) async {
print (rx.recv ().toString ())
}
--- アクターシステムとチャンネルを宣言
Let::Fun ftr <- actor ()
Let::Tuple<chan> ch <- channel ()
--- アクターをアクターシステムに登録
ftr.set () <- threadTest1 (ch.tx)
ftr.set () <- threadTest2 (ch.rx)
--- 登録したアクターを起動する
ftr.go ()
アクター同士はメッセージのやり取りによって相互に通信することができる。 メッセージのやり取りには、massage 文及び暗黙プロパティにて行う。
アクターモデルによる並行処理の技法は、ネットワークを介した分散処理にもそのまま適用できる。
ネットワークインターフェースはアクターモデルにおけるアドレスのもう一つのラッパーである。
ネットワークインターフェースは、インターネットプロトコルとチャンネルを接続する。
この言語には一般的意味での例外は存在しない。エラーあるのみである。このエラーを例外と呼ぶ。
//The Error.
do {
/* Something code that may occur errors */
throw Err;//throw Error
raise Err;//or for this what alias of it
throw SomeErr;//throw Error in type "SomeErr"
}
catch {
/* Something code to do when occurred some errors */
}
catch (SomeException e) {
/* Something code to do when occurred errors in type "SomeException" */
}
ensure {
/* Something code to do in regardless of raise errors */
}
else {
/* Something code to do when not occurred any errors what written rescue code */
}
この言語は、ソースコードレベルでの言語間グルー機能を提供する。 ラッパ関数や引数のすりあわせとか、 関数を別のバイナリコードに分けたりする必要は全く無い。
Langs | DIO-I | ICCF-I | GLIO-I | 状況 |
---|---|---|---|---|
FunCobal family | 〇 | 〇 | 〇 | 未実装 |
Chestnut | ✕ | 〇 | 〇 | 未実装 |
十書 | ✕ | 〇 | 〇 | 未実装 |
Dart | ✕ | 〇 | 〇 | 未実装 |
Go | ✕ | 〇 | 〇 | 未実装 |
Rust | ✕ | ✕ | 〇 | 未対応 |
C/C++/C#/D | ✕ | ✕ | 〇 | 未対応 |
Julia/Python | ✕ | ✕ | 〇 | 未対応 |
Scala/Java | ✕ | ✕ | 〇 | 未対応 |
Scheme/Racket | ✕ | ✕ | 〇 | 未対応 |
ICCFシステム及び言語間アノテーションによる構文森林のコンパイラ間のやり取りにより、他の言語のコードのプログラムファイル中への記述を提供する、一般的利用のため定式化されたプラットフォームを設ける。
詳細はICCFに従う。
FunCobal のコードからは@using
アノテーションにより実現する。
一般的利用のため定式化された ICCF インターフェースのほか、任意の言語との間において、関数や代数的データ構造の呼び出しを提供する、一般的利用のため定式化されたプラットフォームを設ける。
個々の言語に対しGeneral Languages Interface Protocolを定立しそれに準拠して呼び出しを可能とする。
FunCobal のコードからは extern 文により実現する。
// 例えば、C言語の関数がこのようにあったとする。
int frac(int x);
int frac(int x){
return 2*x;
}
--- extern文で言語識別名とともにプロトタイプ宣言をする。
extern (C) {
int frac(int x);
}
--- すると、FunCobalのコードからは当たり前のように呼び出すことができる。
Let::Int frac_as_this <- frac (5)
一般的利用のため定式化された ICCF インターフェース及び GLIO インターフェースのほか、特定の言語との間において、関数や代数的データ構造の呼び出しを提供するプラットフォームを設ける。
個々の言語に対しDynamic Environment Interface Protocolを定立しそれに準拠して呼び出しを可能とする。