流行っていなくとも、良いものは良い。美しいものは美しい。
『Nimを触り始め(る|た)けどドキュメント少なすぎ! なにから学べばいいかわからない!』
という人(過去の私)へ贈ります。
「このあたり知っておけば、言語理解が速いはず 」 って想いで書いています。
触り始めて間もない私なので粗があると思いますが、みなさんにとってNimへの良い入り口となれば幸いです
ちなみに私はWeb系に偏っており、ポインタ?美味しいよねぇ といった具合です。
詳しい記事への導線を配置しているので、この記事はあくまでも最初のつまづき用の杖だと思ってください。
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 時点)
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】個人的逆引きリファレンス
最高!ほんと助かります
どんな関数があるの?ってときはソースコードを読むのがオススメです。
私は日本語ドキュメント依存のゆるふわエンジニア生活を送っていたために少々つらかったですが、関数内部の処理まで覗けるのは良いですね
私が最初のうちによく読んだのは lib/system.nim です。
あとは公式ドキュメントの Index を⌘ + F
するとか
キャメル? スネーク?
キャメルケース、スネークケースどちらでも書けます。たとえ宣言済みの変数であっても
でも、公式ではキャメルケースが推奨されています。じゃあスネーク禁止にしたほうがよくない!?
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 repr(holyGrail)
デバッグ向きechoとしてdebugEcho
がありますが、
プロシージャ(関数)の副作用...?
コメント読んでも何を言ってるのかわかりませんでした
ステップ実行はこちらの記事を読んでいただけると。
nimのデバッグ
(私は試してないです)
変数/定数の宣言
宣言は三種類あります。
const
定数です。コンパイル時に値がわかるものでないといけません。
例えば、コンソールから入力されるような値は代入できません。この場合はlet
を使います。
var
他言語でもよく見る、普通の変数です。
let
再代入が禁止されたvar
です。コンパイル時に値が決まっている必要はありません。
この項目は他の方もまとめられているのですが、本記事を読み進められるよう、一応書きました!
@2vgさん、アドバイスありがとうございました
Stringへの型変換
型変換は様々ですが、Stringにできそうな大抵の型は$
がサポートされていて、手前に付けると文字列になります。
var number = 42
echo "答えは" & $number & "です。"
&
は文字列連結です。
echo
関数では内部的に$
が使われる上に、複数の引数を受け付けるので、以下のようにも書けます。
var number = 42
echo "答えは", number, "です。"
関数(proc, プロシージャ)への引数渡し
第一引数を関数の手前に書いてメソッドチェーン風にしたり、カッコを省略できたりします。これ好き
write
関数を例に挙げます。
write(stdout, str)
stdout.write(str)
stdout.write str
write stdout, str
ネスト
let
やvar
等はネストでまとめることができます。
const wrong = "ポピプテピック"
const correct = "ポプテピピック"
var message: string
const
wrong = "ポピプテピック"
correct = "ボブネミミッミ"
var
message: string
また、Nimでは主に2スペースのインデントが使われます。NimとPythonを交互に書くと酔いますね
破壊的な関数
Nimに限った話では無いですが、再代入が禁止されている const
let
に対して破壊的な(変数の内容を書き換える)関数を使うとエラーになります。
string型にstring型を追加するadd
関数の例です。
proc add(x: var string; y: string)
var cuteVoice = "piyo"
cuteVoice.add("piyopiyo")
let cuteVoice = "piyo"
cuteVoice.add("gieeeeeeeeeeee!!!")
おわりの言葉
記事最初の画像のマスコット(Nimro)は私の落書きなので、非公式です。流行って!
「最初の頃、このへんでハマったよ」みたいなものがあれば、教えてください
また、Nimはdevelブランチが活発で、将来この記事に書いてある幾らかは嘘っぱちになることも有り得ますので、お気を付けください
(嘘っぱちになったら ご指摘いただけると最高な気持ちです)
[雑感]
トライキャッチ プリキュア
公式マスコットはこんな凶暴なかんじのキャラなので、ぜひ、Dominik さんに提案してほしいです
https://github.com/nim-lang/assets/blob/master/Art/mascot.svg
@nunulk 変な声出ましたwww
ありがとうございます。清書して当たって砕けてみます