Civetのメモ書き

#### 0.はじめに
TypeScriptをCoffeeScript風に書けるCivetのメモ書き。
公式ページはこちら。

https://civet.dev

※英語のページですので注意。

#### 1.準備
下記ページを参考に動作環境を整えていきましょう。

https://civet.dev/getting-started
##### ・プレイグラウンド
https://civet.dev/playground

##### ・インストール
```sh
npm i -g @danielx/civet
```
##### ･実行
```sh
civet source.civet ...args...
```
#### 2.ハローワールド
先頭の`"civet coffeeCompat"`ディレクティブの指定で互換モードに。
```civet:CoffeeScript互換モード
"civet coffeeCompat"

# コメント
print = (value) ->
  console.log value
  return

### これもコメント ###
str = "ハローワールド！"

print str
```
https://civet.dev/playground?code=ImNpdmV0IGNvZmZlZUNvbXBhdCIKCiMg44Kz44Oh44Oz44OICnByaW50ID0gKHZhbHVlKSAtPgogIGNvbnNvbGUubG9nIHZhbHVlCiAgcmV0dXJuCgojIyMg44GT44KM44KC44Kz44Oh44Oz44OIICMjIwpzdHIgPSAi44OP44Ot44O844Ov44O844Or44OJ77yBIgoKcHJpbnQgc3Ry
```typescript:変換後のコード(TypeScript)
// コメント
var print, str;
print = function (value) {
  console.log(value);
  return;
};

/* これもコメント */
str = "ハローワールド！";

print(str);
```

<details><summary>おもむろにオンラインのコード実行環境のwandboxに張り付けて見ると、、、</summary>

なんということでしょう(汗

https://wandbox.org/permlink/JPKOOdhMt1hfIB2s

```text:識別子'print'が重複しています、、、
prog.ts(1,5): error TS2300: Duplicate identifier 'print'.
prog.ts(2,1): error TS2539: Cannot assign to 'print' because it is not a variable.
prog.ts(7,7): error TS2554: Expected 0 arguments, but got 1.
../../opt/wandbox/typescript-4.2.4-nodejs-14.16.1/node_modules/typescript/lib/lib.dom.d.ts(19701,18): error TS2300: Duplicate identifier 'print'.
```
重複しているので、名前を変更するか`export`したらよいようですが、ちょっと混乱してるので一旦TypeScriptで記述します(汗
```typescript:export/importを使用したコード(TypeScript)
export default function print(value) {
  console.log(value);
  return;
}

import println from "./prog";
println("ハローワールド！");
```

https://wandbox.org/permlink/haYGGwZNYHIBkqnG

期待通りに動きました、、、TypeScriptあまり使った事無いので、こんなことになるとは思っても見ませんでした(汗

※以降`print`を使用したコードは、`println`に変更していきます(問題無いことを祈ります)。

</details>

CoffeeScript互換モードについては下記ページを参照。

https://civet.dev/reference#coffeescript-compatibility

#### 3.追加変更箇所の一部紹介(型注釈、修飾子、代入演算子、コメントなど)
変数に自動で`var`を付与するモード。
```civet:型注釈①
"civet autoVar"

// これはコメント、#はプライベート変数で使用します。

/* var修飾子、関数の引数や返り値の型注釈も出来ます。 */
var println = (value: any): void ->
  console.log value

### この変数はvarで修飾されます。 ###
str = "型注釈①"

println str
```
https://civet.dev/playground?code=ImNpdmV0IGF1dG9WYXIiCgovLyDjgZPjgozjga%2FjgrPjg6Hjg7Pjg4jjgIEj44Gv44OX44Op44Kk44OZ44O844OI5aSJ5pWw44Gn5L2%2F55So44GX44G%2B44GZ44CCCgovKiB2YXLkv67po77lrZDjgIHplqLmlbDjga7lvJXmlbDjgoTov5TjgorlgKTjga7lnovms6jph4jjgoLlh7rmnaXjgb7jgZnjgIIgKi8KdmFyIHByaW50bG4gPSAodmFsdWU6IGFueSk6IHZvaWQgLT4KICBjb25zb2xlLmxvZyB2YWx1ZQoKIyMjIOOBk%2BOBruWkieaVsOOBr3ZhcuOBp%2BS%2FrumjvuOBleOCjOOBvuOBmeOAgiAjIyMKc3RyID0gIuWei%2BazqOmHiOKRoCIKCnByaW50bG4gc3Ry

自動的に`let`を付与するモード。
```civet:型注釈②
"civet autoLet"

// let修飾子、左辺にも型注釈出来ます。
let println: (value: any) -> void = (value: any): void ->
  console.log value

// .=でlet修飾子を付与、勿論型注釈も。
str: string .= "型注釈②"

println str
```
https://civet.dev/playground?code=ImNpdmV0IGF1dG9MZXQiCgovLyBsZXTkv67po77lrZDjgIHlt6bovrrjgavjgoLlnovms6jph4jlh7rmnaXjgb7jgZnjgIIKbGV0IHByaW50bG46ICh2YWx1ZTogYW55KSAtPiB2b2lkID0gKHZhbHVlOiBhbnkpOiB2b2lkIC0%2BCiAgY29uc29sZS5sb2cgdmFsdWUKCi8vIC4944GnbGV05L%2Bu6aO%2B5a2Q44KS5LuY5LiO44CB5Yu%2F6KuW5Z6L5rOo6YeI44KC44CCCnN0cjogc3RyaW5nIC49ICLlnovms6jph4jikaEiCgpwcmludGxuIHN0cg%3D%3D

型エイリアスでスッキリ。
```civet:型エイリアス
type PrintLn = (value: any) -> void

// const修飾子も使えます。
const println: PrintLn = (value) ->
  console.log value

// :=でconst修飾子を付与。
str: string := "型エイリアス"

println str
```
https://civet.dev/playground?code=dHlwZSBQcmludExuID0gKHZhbHVlOiBhbnkpIC0%2BIHZvaWQKCi8vIGNvbnN05L%2Bu6aO%2B5a2Q44KC5L2%2F44GI44G%2B44GZ44CCCmNvbnN0IHByaW50bG46IFByaW50TG4gPSAodmFsdWUpIC0%2BCiAgY29uc29sZS5sb2cgdmFsdWUKCi8vIDo944GnY29uc3Tkv67po77lrZDjgpLku5jkuI7jgIIKc3RyOiBzdHJpbmcgOj0gIuWei%2BOCqOOCpOODquOCouOCuSIKCnByaW50bG4gc3Ry

トランスパイル後の関数内に`return`が残ってる気がしますが...
```typescript:変換後のコード(TypeScript)
type PrintLn = (value: any) => void;

const println: PrintLn = function (value) {
  return console.log(value);
};

const str: string = "型エイリアス";

println(str);
```

`return`が付与される行の最後にセミコロン`;`を付けると`return`が消せます(または、ディレクティブ`-implicitReturns`で設定解除)。関数の定義には`function`も使えます。
```civet:暗黙的なリターンの解除
"civet -implicitReturns"

function println(value)
  console.log value;

println "暗黙的なリターンの解除"
```
https://civet.dev/playground?code=ImNpdmV0IC1pbXBsaWNpdFJldHVybnMiCgpmdW5jdGlvbiBwcmludGxuKHZhbHVlKQogIGNvbnNvbGUubG9nIHZhbHVlOwoKcHJpbnRsbiAi5pqX6buZ55qE44Gq44Oq44K%2F44O844Oz44Gu6Kej6ZmkIg%3D%3D

`return`が消えましたね！
```typescript:変換後のコード(TypeScript)
function println(value) {
  console.log(value);
}

println("暗黙的なリターンの解除");
```

#### 4.おわりに
気が付いたら日本語に対応していた！と思って勢いで記事を書いておりますが、誤りなどありましたらご指摘いただけると助かります。

と書きつつ、TypeScriptに変換後に変数名の重複がありエラーになっていたのは確認不足でした。ごめんなさい。

他にもパイプやオペレーター、関数のオーバーロード等々沢山書くことがありそうですが、一旦ここで止めます。

最後まで読んでいただきありがとうございますm(_ _)m