Nimのジェネリックとコンバーター

Nim言語のロゴ






みなさんこんにちは! この記事では、Nimの一般的な手順とコンバーターが何であるかを説明します(そして、それらの使用例を示します)。



ニムとは? Nimは、(C、C ++、Objective-CおよびJSで)コンパイルされた高レベルのガベージコレクタプログラミング言語であり、3つの主要な目標(優先度順)があります:パフォーマンス、表現力、優雅さ。 公式言語サイトGitHubのリポジトリ

また、メタプログラミング(ジェネリック、テンプレート、マクロ)はNimで非常に開発されています。



最初に、int型の引数を1つ持ち、intも返すプロシージャがどのように見えるかを示します。



proc plusOne(arg: int): int = return arg + 1 echo plusOne(5) #  6
      
      





私が思うに、ここではすべてが非常に明確です(int型のarg引数に数値1を追加し、結果を返します)



Nimのジェネリックは、いくつかのタイプを取ることができるプロシージャです(コンパイラは、このプロシージャで使用されたタイプごとにプロシージャの個別のバージョンを作成します)。



1例-通常のジェネリック



この例は、このオブジェクトにlenプロシージャがある場合にオブジェクトの長さを出力します(Pythonの__len__のほぼ完全な類似物):



 proc tryLen[T](something: T) = when compiles(something.len): # something.len   ,  len(something) echo something.len else: echo "      `len`" #    ,      `len` (     ) type MyObject = object #    let myObj = MyObject() tryLen([1, 2, 3]) #  3 tryLen("Hello world!") #  12 tryLen(myObj) #  "      `len`"
      
      





この例は、前の例よりもはるかに複雑です。ここで何が起こっているかを簡単に説明しようと思います。



まず、Try型の引数をとるtryLenプロシージャ自体を宣言します(Tは未定義の型で最も一般的に使用される名前です。Tの代わりにabcdを書くことができ、すべてが同じように機能します)。



次に、コンパイル時に特別な条件を使用します(これはifに類似していますが、コンパイル時に条件が既知である必要があり、コンパイルされたコードに入らない場合)。 指定された型でこの条件が満たされる場合、この引数のlenプロシージャの結果を出力し、満たさない場合はメッセージを表示します。



次に、MyObject型のオブジェクトを作成し、tryLenを配列[1、2、3]、文字列「Hello world!」、およびオブジェクトに適用します。



2例-コンバーター



暗黙的に1つの型を別の型に変換するのに役立ちます(ただし、この場合はすべて「明示的は暗黙的より優れている」ため、言語開発者自身は特に歓迎しません)。



この例では、MyObjectのタイプを数値(この場合は1つだけ)に変換するコンバーターを作成します。



 type MyObject = object let myObj = MyObject() #     ,        return #     -   converter toInt(b: MyObject): int = 1 #     (       ) echo myObj.toInt + 1 #  2 #      : echo myObj + 1 #   2,   toInt   myObj   1
      
      





コンバーターの使用は議論の余地のあるトピックです(標準言語ライブラリーではほとんど使用されません)が、コンバーターには中立的です。



最新の例は汎用コンバーターです



はい、怖いですが、実際にはすべてがそれほど複雑ではありません。 これにより、Nimをもう少しPythonに近づけることができます(つまり、一部の型を暗黙的にboolに変換します)



 converter toBool[T](arg: T): bool = #        len when compiles(arg.len): arg.len > 0 #       `>` elif compiles(arg > 0): arg > 0 #  - ,   - nil else: not arg.isNil() if [1, 2, 3]: #   echo "True!" if @[1, 2, 3]: #   echo "True too!" if "": #   echo "No :(" if 5: # Integer echo "Nice number!" if 0.0001: # Float echo "Floats are nice too!" #      int (   ) var a: ref int if a: echo "False! nil!"
      
      





読んでくれてありがとう! あなた自身のために何か新しいことを学ぶことができたと思います。



ソース
マニュアル

ウィキペディア

また、さまざまな問題の解決を促したNimユーザー。



All Articles