| パラダイム | オブジェクト指向、プロトタイプベース |
|---|---|
| デザイン: | ガボール・デ・ムーイ、アーヴェシュ・ジラニ |
| 開発者 | ガボール・デ・ムーイ、アーヴェシュ・ジラニ |
| 初登場 | 2014 |
| 安定リリース | 0.9.6 / 2024年1月5日 |
| タイピングの規律 | 動的 |
| OS | クロスプラットフォーム(マルチプラットフォーム) |
| ライセンス | BSDA の |
| ファイル名拡張子 | .ctr |
| Webサイト | シトリン |
| 主な実装 | |
| C | |
| 影響を受けた | |
| 雑談、自分 | |
Citrine は、さまざまなオペレーティング システム用の汎用プログラミング言語です。読みやすさと保守性を重視しています。読みやすさは、構文と概念のミニマリズムによって実現されています。この言語はSmalltalkとSelfに大きく影響を受けていますが、非常に独特な機能もいくつかあります。Smalltalk と同様に、Citrine はすべてをオブジェクトとして扱い、これらのオブジェクトにメッセージを送信することに重点を置いています。ただし、Smalltalk とは異なり、Citrine にはクラスの概念がありません。この点で、Citrine はプロトタイプを使用するため、 Self やJavaScriptに似ています。Smalltalk のようなメッセージとプロトタイプの組み合わせが、Citrine のユニークな点です。
バージョン 0.7 以降、Citrine は英語だけでなくさまざまな自然言語に基づくフォームの使用に重点を置き、他の言語のユーザーの使いやすさを向上させ、プログラミングの労力とバグの発生を減らしています。そのため、Citrine 0.7 以降には、自然言語間でコードを変換する機能が含まれています。
構文
Citrine の構文は非常に限定されており、Smalltalk に非常に近いものです。Citrine のすべてはオブジェクトです。5つのリテラルがあります。
NilTrue, False0,1,2,3'String'{ ...params.. ...block of code... }
コード ブロック リテラルでは、パイプ記号 ⟨|⟩ を使用してパラメーターとロジックを区切ります。パラメーターがない場合は、代わりにバックスラッシュを使用する必要があります。
Citrine は、⟨#⟩ で始まる全行コメントのみをサポートします。
Citrine プログラムは、基本的にオブジェクトに送信される一連のメッセージです。たとえば、5 が偶数かどうかを判断するには、「even?」というメッセージを数値 5 に送信します。
5 つもですか?
これは引数を取らないため、単項メッセージと呼ばれます。バイナリメッセージは常に単一の UTF-8 文字です。これは、バイナリ メッセージの固定セットがある Smalltalk とは異なります。次に例を示します。
6 + 7 .
ここでは、バイナリ メッセージ '+' が数値 6 に送信され、バイナリ メッセージの引数は '7' です。この結果、新しい数値オブジェクト '13' が生成されます。この操作の結果を変数に割り当てるには、代入演算子 := を使用します。
合計 := お金 + 負債。
さらに、Citrine プログラムの各行は Smalltalk と同様にドットで終わります。単項メッセージと二項メッセージに加えて、Citrine はキーワード メッセージも提供します。これは Smalltalk やObjective-Cと同様に、メッセージ自体に散りばめられた引数を受け取ります。
☞ x := 1から5までの数 。
上記のコード スニペットは、ブール オブジェクトTrueを返します。
制御フロー
Smalltalk と同様に、Citrine の制御フローは、メッセージの戦略的な使用によって実装されます。たとえば、条件文を記述するには、コード ブロックをブール値に送信する必要があります。
(お金 > 価格) true: { ✎ write: 'はい、これなら買えます' . }.
同様に、for ループは次のように記述されます。
{ :ステップ ✎ 記述: 'これはステップです:' + ステップ. } × 10 .
Citrine でループを抜け出すには、ブール値に「break」メッセージを送信する必要があります。これにより、ブレーク条件を除外することなく、ループから条件付きで抜け出すことができます。
{ : i
( i = 3 )を中断します。✎
次のよう に記述します: i。
} * 5 .
パイプライン
Smalltalk とは異なり、Citrine には元の受信者にメッセージを送信するためのセミコロンがありません。代わりに、Citrine にはキーワード メッセージを連結するために使用されるコンマ トークン ',' があり、これにより Unix のようなパイプラインを記述できます。次のコードは、パイプラインのような構文を使用してすべての 'o' 文字をゼロに置き換えます。結果の文字列は '1010101...' のようになります。
onesAndZeroes := '1o1o1o1o1o1' 分割: 'o' 、 マップ: mapUp 、 結合: '0' 。
プロトタイプ
Smalltalk との最大の違いはプロトタイプの使用です。Citrine にはクラスの概念はなく、オブジェクトのみを認識します。オブジェクトは new メッセージを使用して作成されます。
cat := オブジェクト new 。
このオブジェクトは、 Javaなどの言語でメソッドを追加するのと同様に、イベントをリッスンするようにオブジェクトに命令することで、メッセージに応答するようにすることができます。
cat on: 'ニャー' do: {
ペン write: 'ニャー!' .
} です。
上で述べたように、継承はプロトタイプに基づいています。別のオブジェクトからオブジェクトを派生するには、拡張するオブジェクトに新しいメッセージを送信する必要があります。
☞ Animal := Object new .
Animal on: 'makeSound' do: {
✎ write: '?' .
} です。
☞ Cat := Animal new .
Cat on: 'makeSound' do: {
✎ write: 'meow!' .
} です。
☞ トム := 猫 新しい。
トム makeSound 。
ユニコード
Citrine は UTF-8 Unicode を広範囲に使用しており、オブジェクトとメッセージの両方が Unicode シンボルで構成できます。すべての文字列の長さは UTF-8 を使用して計算されます。Citrine は文字列の長さとサイズをバイト単位で区別します。
'テキスト'の 長さ。
文字列の長さを UTF-8 コード ポイントで返します。
'テキスト' バイト。
バイト数を返します。
スコープ設定
Citrine は、レキシカル スコープの代わりに動的スコープを使用します。したがって、依存性注入やグローバル変数は必要ありませんが、レキシカル スコープよりも理解しにくい場合があります。これは、 Emacs LispやBASICなどのプログラミング言語でも同様です。コード ブロックでは、ローカル変数を宣言するためにvarキーワードを使用する必要があります。
次のデモンストレーションでは、モジュール内で Mailer オブジェクトが使用できるようになります。
アプリケーション := {
☞ mailer := Mailer new .
module run .
} です。
参照
- Smalltalkプログラミング言語
参考文献
- 新しいプログラミング言語コミュニティのデモ
- シトリンレビュー Jaxenter
- Redditでの発表
- InfoWorld インタビュー
- ティオベインデックス
外部リンク
- 公式サイト
- ソースコード、GitHub 上のソースコード
