Flat Leon Works

アプリやゲームを作ってます。

Nim

【Nim】お手軽契約プログラミング

Nim

この記事は「Nim Advent Calendar 2021」の25日目の記事として登録させてもらっています。 契約プログラミングとは 事前条件 事後条件 不変条件 Nimで(お手軽)契約プログラミング 事前条件をチェックする 事後条件をチェックする pre/postで記述できるように…

【Nim】無名プロシージャの書き方まとめ

Nim

この記事は「Nim Advent Calendar 2021」の24日目の記事として登録させてもらっています。 無名プロシージャの書き方 基本形 returnを省略 仮引数を省略(無い場合) 戻り値型を省略(無い場合) procと戻り値型を省略(=>記法を使う) do記法を使う(引数でのみ使…

【Nim】弱参照を実装してみる

Nim

この記事は「Nim Advent Calendar 2021」の23日目の記事として登録させてもらっています。 弱参照とは 弱参照を実装してみる 使用例 注意点 参考リンク 弱参照とは 弱参照の定義はいろいろあると思いますが、ここでは参照先が破棄されたことを検知できる参照…

【Nim】文字列リテラルと書式について

Nim

この記事は「Nim Advent Calendar 2021」の21日目の記事として登録させてもらっています。 文字列リテラルと書式の組み合わせ爆発 Nimは複数の文字列リテラルの書き方があり、さらに書式も複数の書き方があります。 書式の書き方を羅列してみると… &"書式" &…

【Nim】XMLをDOMで読み込む

Nim

この記事は「Nim Advent Calendar 2021」の20日目の記事として登録させてもらっています。 NimのXMLパーサーについて (おまけ)SAXにするかDOMにするか XMLファイルを読み込む DOM(XmlNode)にアクセスする 自身(要素)の情報にアクセスする 子要素を取得する …

【Nim 小ネタ】2つの型が同一かどうかを判定する

Nim

この記事は「Nim Advent Calendar 2021」の17日目の記事として登録させてもらっています。 問題 突然ですが、genericsの型引数が同一の型を指すのかどうかを判定したい場合どうすればよいでしょうか。 proc hoge[T,U]() = when T == U: assert( false ) echo…

【Nim 小ネタ】C++のdynamic_cast相当のことを行う

Nim

この記事は「Nim Advent Calendar 2021」の16日目の記事として登録させてもらっています。 C++のdynamic_cast C++にはdynamic_castというキャストがあり、これを使うと安全にダウンキャスト*1を行うことができます。 ここでいう「安全」とは、ダウンキャスト…

【Nim】公式より便利なオンライン実行環境「Wandbox」の紹介

Nim

この記事は「Nim Advent Calendar 2021」15日目の記事として登録させてもらっています。 オンライン実行環境 プログラミング中、プログラミング言語の文法や挙動を確認してみたくなることがあります。そういうときに便利なのがWebサイト上でコードの入力と実…

【Nim】VSCodeで始めるNimプログラミング

Nim

この記事は「Nim Advent Calendar 2021」の9日目の記事として登録させてもらっています。 はじめに Nimとは Nimのインストール choosenimのインストール(Macの場合) xzコマンドのインストール(必要な場合) homebrewのインストール(必要な場合) choosenimのイ…

【Nim】引数渡しの罠

Nim

Nimには値型と参照型があるのですが、引数として渡したときの挙動が C++ や C# のような他のプログラミング言語とは違う場合があるようなので調べてみました。それほど詳しく調査したわけではないので注意してください。 執筆時のNimのバージョンはv0.19.0で…

【Nim】マクロプログラミング用メモ

Nim

ドキュメント : macrosモジュール Nim Tutorial (Part III) 定数 型の種類一覧 NimTypeKind = enum ntyNone, ntyBool, ntyChar, ntyEmpty, ntyAlias, ntyNil, ntyExpr, ntyStmt, ntyTypeDesc, ntyGenericInvocation, ntyGenericBody, ntyGenericInst, ntyGen…

【Nim】コンパイラソースコードリーディングのためのメモ

Nim

ファイル トークン種類(tk) ASTノード種類(nk) シンボル種類(sk) シンボルフラグ(sf) 内部型種類(ty) 内部型フラグ(tf) コンパイラマジック定数(m) ファイル compiler main.nim : コンパイラ起点 lexer.nim : レキサー parser.nim : パーサー ast.nim : AST …

【Nim】クラス定義マクロを作ってみる

Nim

Nimにはクラスという概念がありません。しかし、オブジェクト指向プログラミング自体はサポートされており、object型を使えばクラスとほぼ同じことが可能になっています。ただし、object型の定義が微妙に面倒なことに加え、やはりクラスが欲しいということで…

【Nim】seq型とstring型のリファレンスの罠【追記:v0.19.0にて解決済み】

Nim

[追記] Nimバージョン 0.19.0 で、seq型とstring型のデフォルト値が nil ではなく @[] と "" になりました。この仕様変更により、ここで指摘していた"罠"は根本的に解決されたことになります。一応この記事は残しておきますが、もう気にする必要がないことで…

【Nim】文字列操作

Nim

Nimでの文字列操作関連をまとめてみました。 Nimのバージョンは 0.17.2 を想定しています。( 執筆時の最新バージョン ) 文字列の基本 文字、文字列リテラル 文字、文字列型 文字列関連モジュール 標準モジュール(system,strutils)の文字列関連プロシージャ …

NimとC++を比較してみる

この記事は「Nim Advent Calendar 2017」の記事として登録させてもらっています。 NimはNimソースコードをC言語ソースへ変換するトランスコンパイラ言語です。これは普段C++を使っている人にとって非常に重要なことです。なぜなら、C++(C言語)が使える環境な…

【Nim】個人的逆引きリファレンス

Nim

Nimの勉強を兼ねて逆引きリファレンスとしてまとめてみようと思います。随時更新。(最終更新日:2022/4/10) この記事は「Nim Advent Calendar 2017」の記事として登録させてもらっています。 注意: 使用しているNimのバージョンは1.6.0です 間違っているかも…

【Nim】メモ

Nim

基本情報 リンク 標準ライブラリ 言語仕様メモ 諸条件の違いによるマクロ仮引数のNimNode構造の違い テンプレートでのシンボル束縛(bind)について テンプレート仮引数の参照ルール テンプレートの衛生 逆引きリファレンス未作成項目 基本情報 作者 : Andreas…