【Nim】メモ
基本情報
作者 : Andreas Rumpfさん ( GitHubではAraqという名前 )
リンク
- 公式
- 公式サイト : Nim programming language | Nim
- オンライン実行 : https://play.nim-lang.org
- Nimの特徴 : Features | Nim
- Nimインストール方法 : Install | Nim
- 言語マニュアル : Nim Manual
- 試験的機能のマニュアル : Nim Experimental Features
- 標準ライブラリ : Nim Standard Library
- Nimbleマニュアル : nim-lang/nimble
- FAQ : FAQ | Nim
- コンパイラガイド : Nim Compiler User Guide
- GC動作 : Nim's Garbage Collector
- 内部実装 : Internals of the Nim Compiler
- チュートリアル1 : Nim Tutorial (Part I)
- チュートリアル2 : Nim Tutorial (Part II)
- 索引 : Index
- ブログ : Blog | Nim
- Wiki(GitHub) : Home · nim-lang/Nim Wiki · GitHub
- フォーラム : Nim Forum
- 本 : Nim in Action
- GitHubリポジトリ : https://github.com/nim-lang/Nim
- チャット(Gitter+IRC) : https://gitter.im/nim-lang/Nim
- Twitter : https://twitter.com/nim_lang
- クラウドファンディング : https://salt.bountysource.com/teams/nim
- 公式サイト : Nim programming language | Nim
- コード例 : Nim by Example - Getting Started
- Wikipedia(日本語) : Nim - Wikipedia
- Wikipedia(英語) : Nim (programming language) - Wikipedia)
- Advent Calendar
- Stack Overflow Nimタグ : Newest 'nim' Questions - Stack Overflow
- Qiita Nimタグ : https://qiita.com/tags/Nim
- はてブ Nim検索 : タグ「Nim」を検索 - はてなブックマーク
- 記事
- 記事(当サイト)
標準ライブラリ
標準ライブラリ : Nim Standard Library
- 言語コア機能
- system : ライブラリとして実装されている言語機能など。暗黙にimportされる
- macros : マクロ関係。マクロを使う場合はimportする必要がある
- typeinfo : 実行時型情報関係
- typetraits : 型情報関係
- 文字列
- strutils : 文字列操作関係
- OS
- その他
言語仕様メモ
- テンプレートとマクロにはなんでも引数として渡せるわけではなく、ASTとして表現可能なテキストしか受け付けない
- 識別子ルールが一般的なものと少し違う (コード例:https://ideone.com/pDNafS)
_
は連続してはいけない_
は先頭と末尾には使えない- 先頭以外の文字の大文字小文字は区別されない
- マクロの引数は型指定があっても、すべてNimNode型として渡ってくる。
- マクロに同じ引数を渡しても仮引数として渡ってくるNimNodeの構造は変わる
- untypedかそうでないか
- マクロ起動方式の違い(式マクロ(Expression Macros)と文マクロ(Statement Macros))
- 文マクロの場合、StmtList(untypedの場合)あるいはStmtListExpr(型指定がある場合)として渡ってくる?
諸条件の違いによるマクロ仮引数のNimNode構造の違い
import macros macro test1(x:untyped):untyped = echo treeRepr( x ); x macro test2(x:string):untyped = echo treeRepr( x ); x # 引数型がuntyped + 式マクロで起動 discard test1("111") # StrLit 111 # 引数型がuntyped + 文マクロで起動 (その1) discard test1:"111" # StmtList # StrLit 111 # 引数型がuntyped + 文マクロで起動 (その2) discard test1:"111" & "+++" # StmtList # Infix # Ident !"&" # StrLit 111 # StrLit +++ # 引数型がstring + 式マクロで起動 discard test2("222") # StrLit 222 # 引数型がstring + 文マクロで起動 (その1) discard test2:"222" # StmtListExpr # StrLit 222 # 引数型がstring + 文マクロで起動 (その2) discard test2:"222" & "+++" # StmtListExpr # StrLit 222+++
テンプレートでのシンボル束縛(bind)について
テンプレートは衛生的なマクロなので、独自のスコープを持つ。ほとんどのシンボルはテンプレートが定義された場所にバインドる。
テンプレート仮引数の参照ルール
テンプレート仮引数はモジュール名.仮引数名に置き換えられる。したがって、グローバルシンボルを隠すことができる。 グローバルシンボルを取得した場合はbind文を使う。
テンプレートの衛生
デフォルトではテンプレートは衛生となっている。つまり、テンプレート内で定義された識別子は呼び出し元からはアクセスできないようになっている。
テンプレート内で宣言されたシンボルが呼び出し元からアクセス可能になるかどうかは inject と gensym プラグマで制御できる。 gensymプラグマを使った場合、テンプレート呼び出し元からはアクセスできない。 一方、injectプラグマを使った場合はアクセスできる。
デフォルトでは type, var, let, const は gensym で、proc, iterator, converter, template, macro は injectになっている。 ただし、シンボル名がテンプレート仮引数として渡ってきた場合は inject シンボルとなる。 inject、gensymプラグマはtemplate外では意味をなさないプラグマとなっている。
逆引きリファレンス未作成項目
- Not nil annotation
- メモリリージョン(レギオン) : Memory regions
- auto型 : Auto type
- void型 : Void type
- 型の関連性 : Type relations
- アセンブラ文 : Assembler statement
- 動的ディスパッチ(多重ディスパッチ) : Multi-methods
- 型変換プロシージャ : Converters
- 例外 : Exception handling
- エフェクトシステム(?) : Effect system
- 型クラス : Type Classes
- コンセプト : Concepts
- マクロ : Macros
- static[T]
- Special Operators
- Type bound operations
- Term rewriting macros
- プラグマ : Pragmas
- FFI : Foreign function interface
- スレッド : Threads
- Parallel & Spawn