流行っていなくとも、良いものは良い。美しいものは美しい。

Nimro.png

『Nimを触り始め(る|た)けどドキュメント少なすぎ! なにから学べばいいかわからない!』
という人(過去の私)へ贈ります。

「このあたり知っておけば、言語理解が速いはず :kissing_heart: 」 って想いで書いています。
触り始めて間もない私なので粗があると思いますが、みなさんにとってNimへの良い入り口となれば幸いです:blush:

ちなみに私はWeb系に偏っており、ポインタ?美味しいよねぇ といった具合です。
詳しい記事への導線を配置しているので、この記事はあくまでも最初のつまづき用の杖だと思ってください。

Nimの素敵ポイント

いきなり本題とずれますが、宣伝させてください。 :tired_face:

Nim とは
美しくありながら
パフォーマンスが高く
メタプログラミングに長けた
コンパイル言語です。

美しく、そして速い言語、Nim
const
  fizzBuzz = "FizzBuzz\n"
  fizz     = "Fizz\n"
  buzz     = "Buzz\n"

var str = ""

for i in 1 .. 100:
  if   i mod 15 == 0: str.add(fizzBuzz)
  elif i mod  3 == 0: str.add(fizz)
  elif i mod  5 == 0: str.add(buzz)
  else:
    str.add($i)
    str.add("\n")

stdout.write(str)

『じゃあ、何故流行ってないの?』
その大きな原因は ドキュメントの不足 だと思っています。
(公式というより、Qiitaとかブログとかの!)
みんなで盛り上げていけば輝く原石です。

こちらの記事も読んでいただけると、Nimの輪郭がはっきりすると思います。
Nim言語感想&概説

環境作りや実行周り

anyenvにはまだ居ません。(2018/01/17 時点)

インストール(macOS)
brew install nim

主流のライブラリマネージャーは nimble です。

エディタはVSCodeかKDevelop(IDE)でいいと思います。
VisualStudioCodeによるNim開発環境
Aporiaはちょっと使いづらい...。

コンパイルと実行
nim c -r hello.nim
リリース向けコンパイル
nim c -d:release hello.nim

コードの書き方/読み方

基本的な構文はこちらの記事を。
- Syntax of Nim
- Nim Tutorial Part Iを日本語訳してみた(前編)
- Nim Tutorial Part Iを日本語訳してみた(後編)
- 【Nim】個人的逆引きリファレンス
最高!ほんと助かります :sob:

どんな関数があるの?ってときはソースコードを読むのがオススメです。
私は日本語ドキュメント依存のゆるふわエンジニア生活を送っていたために少々つらかったですが、関数内部の処理まで覗けるのは良いですね :crown:
私が最初のうちによく読んだのは lib/system.nim です。

あとは公式ドキュメントの Index⌘ + Fするとか :rolling_eyes:

キャメル? スネーク?

キャメルケース、スネークケースどちらでも書けます。たとえ宣言済みの変数であっても :flushed:
でも、公式ではキャメルケースが推奨されています。じゃあスネーク禁止にしたほうがよくない!?
Nim Enhancement Proposal #1 - Standard Library Style Guide
UpperCamel(Pascal) ↔ lowerCamel はエラーになります。

キャメル
readLine(stdin)
スネーク
read_line(stdin)
フィーバー!!(動きます)
r_E_a_D_l_I_n_E(stdin)

デバッグ

repr関数で値の中身を確認することができます。
JavaScriptのconsole.logとか、PHPのvar_dumpみたいな感覚で使ってます。

出力はechoとかで行う
echo repr(holyGrail)

デバッグ向きechoとしてdebugEchoがありますが、
プロシージャ(関数)の副作用...?
コメント読んでも何を言ってるのかわかりませんでした :tired_face:

ステップ実行はこちらの記事を読んでいただけると。
nimのデバッグ
(私は試してないです)

変数/定数の宣言

宣言は三種類あります。

const
定数です。コンパイル時に値がわかるものでないといけません。
例えば、コンソールから入力されるような値は代入できません。この場合はletを使います。

var
他言語でもよく見る、普通の変数です。

let
再代入が禁止されたvarです。コンパイル時に値が決まっている必要はありません。

この項目は他の方もまとめられているのですが、本記事を読み進められるよう、一応書きました!
@2vgさん、アドバイスありがとうございました:v:

Stringへの型変換

型変換は様々ですが、Stringにできそうな大抵の型は$がサポートされていて、手前に付けると文字列になります。

var number = 42

echo "答えは" & $number & "です。"

&は文字列連結です。

echo関数では内部的に$が使われる上に、複数の引数を受け付けるので、以下のようにも書けます。

var number = 42

echo "答えは", number, "です。"

関数(proc, プロシージャ)への引数渡し

第一引数を関数の手前に書いてメソッドチェーン風にしたり、カッコを省略できたりします。これ好き :relaxed:
write関数を例に挙げます。

ノーマル
write(stdout, str)
チェーン
stdout.write(str)
カッコ省略
stdout.write str

write stdout, str

ネスト

letvar等はネストでまとめることができます。

ノーマル
const wrong   = "ポピプテピック"
const correct = "ポプテピピック"
var message: string
ネスト
const
  wrong   = "ポピプテピック"
  correct = "ボブネミミッミ"
var
  message: string

また、Nimでは主に2スペースのインデントが使われます。NimとPythonを交互に書くと酔いますね :fearful:

破壊的な関数

Nimに限った話では無いですが、再代入が禁止されている const let に対して破壊的な(変数の内容を書き換える)関数を使うとエラーになります。

string型にstring型を追加するadd関数の例です。

第一引数はvar限定
proc add(x: var string; y: string)
OK
var cuteVoice = "piyo"

cuteVoice.add("piyopiyo")
エラー
let cuteVoice = "piyo"

cuteVoice.add("gieeeeeeeeeeee!!!")

おわりの言葉

記事最初の画像のマスコット(Nimro)は私の落書きなので、非公式です。流行って!

「最初の頃、このへんでハマったよ」みたいなものがあれば、教えてください :raised_hand:

また、Nimはdevelブランチが活発で、将来この記事に書いてある幾らかは嘘っぱちになることも有り得ますので、お気を付けください :alien:
(嘘っぱちになったら ご指摘いただけると最高な気持ちです)

[雑感]
トライキャッチ プリキュア

1339contribution

公式マスコットはこんな凶暴なかんじのキャラなので、ぜひ、Dominik さんに提案してほしいです :bow:
https://github.com/nim-lang/assets/blob/master/Art/mascot.svg

896contribution

@nunulk 変な声出ましたwww
ありがとうございます。清書して当たって砕けてみます:relaxed:

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.