1
- *vim9.txt* For Vim バージョン 9.1. Last change: 2025 Apr 27
1
+ *vim9.txt* For Vim バージョン 9.1. Last change: 2025 Jul 21
2
2
3
3
VIMリファレンスマニュアル by Bram Moolenaar
4
4
@@ -14,10 +14,11 @@ script の新しい文法と機能について書かれています。
14
14
2. 変更点 | vim9-differences |
15
15
3. 新しいスタイルの関数 | fast-functions |
16
16
4. 型 | vim9-types |
17
- 5. 名前空間、Import と Export | vim9script |
18
- 6. クラスとインターフェイス | vim9-classes |
17
+ 5. ジェネリック関数 | generic-functions |
18
+ 6. 名前空間、Import と Export | vim9script |
19
+ 7. クラスとインターフェイス | vim9-classes |
19
20
20
- 9 . 理論的根拠 | vim9-rationale |
21
+ 8 . 理論的根拠 | vim9-rationale |
21
22
22
23
==============================================================================
23
24
@@ -1895,7 +1896,140 @@ NOTE: ジョブなどの特殊な変数はデフォルトで null 値になり
1895
1896
1896
1897
==============================================================================
1897
1898
1898
- 5. 名前空間、Import と Export
1899
+ *generic-functions*
1900
+ 5. ジェネリック関数
1901
+
1902
+ ジェネリック関数は、引数と戻り値の型チェックを維持しながら、同じ関数を異なる型
1903
+ の引数で使用できる。これにより、型安全性とコードの再利用性が確保される。
1904
+
1905
+ 宣言~
1906
+ *generic-function-declaration*
1907
+ *E1553* *E1554* *E1559*
1908
+ ジェネリック関数の型パラメータは、関数名の直後に山括弧 "<" と ">" で宣言され
1909
+ る。複数の型名はコンマで区切られる: >
1910
+
1911
+ def[!] {funcname}<{type} [, {types}]>([arguments])[: {return-type}]
1912
+ {function body}
1913
+ enddef
1914
+ <
1915
+ これらの型パラメータは、関数のシグネチャと本体内の他の型と同じように使用でき
1916
+ る。例: >
1917
+
1918
+ def MyFunc<T, A, B>(param1: T): T
1919
+ var f: A
1920
+ var x = param1
1921
+ return x
1922
+ enddef
1923
+ <
1924
+ *type-variable-naming* *E1552*
1925
+ 型変数には大文字 1 文字を使用するのが慣例である (例: T、A、X)。ただし、より長
1926
+ い名前も使用できる。名前は必ず大文字で始まる必要がある。
1927
+
1928
+ *E1558* *E1560*
1929
+ 関数は、ジェネリック関数または通常の関数のいずれかとして宣言および使用する必要
1930
+ がある。両方としてはできない。
1931
+
1932
+ *E1561*
1933
+ 型変数名は、クラス名、型エイリアス、列挙名、関数名、他の型変数名など、他の定義
1934
+ 済みの名前と競合してはならない。
1935
+
1936
+ ジェネリック関数の呼び出し~
1937
+ *generic-function-call*
1938
+ ジェネリック関数を呼び出すには、関数名と引数リストの間に "<" と ">" で具体的な
1939
+ 型を指定する: >
1940
+
1941
+ MyFunc<number, string, list<number>>()
1942
+ <
1943
+ *E1555* *E1556* *E1557*
1944
+ iジェネリック関数を呼び出す際に指定する具体的な型の数は、関数内の型変数の数と
1945
+ 一致する必要がある。空の型リストは許可されない。Vim9 の任意の型 (| vim9-types | )
1946
+ は、ジェネリック関数内の具体的な型として使用できる。
1947
+
1948
+ 関数名と "<" の間、または ">" と開始の "(" の間には空白を入れることはできない。
1949
+
1950
+ ジェネリック関数は通常の関数と同様に export および import できる。| :export | お
1951
+ よび | :import | を参照。
1952
+
1953
+ ジェネリック関数は、別の通常関数またはジェネリック関数内で定義できる。
1954
+
1955
+ ジェネリック型における型変数の参照~
1956
+
1957
+ ジェネリック型では、具体的な型の代わりに型変数を使用できる。これは、辞書のリス
1958
+ トやリストの辞書のような複雑なデータ構造に便利である。例: >
1959
+
1960
+ vim9script
1961
+
1962
+ def Flatten<T>(x: list<list<T>>): list<T>
1963
+ var result: list<T> = []
1964
+ for inner in x
1965
+ result += inner
1966
+ endfor
1967
+ return result
1968
+ enddef
1969
+
1970
+ echo Flatten<number>([[1, 2], [3]])
1971
+ <
1972
+
1973
+ ジェネリッククラスメソッド~
1974
+
1975
+ Vim9 クラスメソッドはジェネリック関数にすることができる: >
1976
+
1977
+ class A
1978
+ def Foo<X, Y>()
1979
+ enddef
1980
+ endclass
1981
+ var a = A.new()
1982
+ a.Foo<number, string>()
1983
+ <
1984
+ *E1432* *E1433* *E1434*
1985
+ 基底クラスのジェネリッククラスメソッドは、子クラスのジェネリックメソッドでオー
1986
+ バーライドできる。型変数の数は両方のメソッド間で一致している必要がある。具象ク
1987
+ ラスメソッドをジェネリックメソッドでオーバーライドすることはできない。逆もまた
1988
+ 同様である。
1989
+
1990
+ ジェネリック関数参照~
1991
+
1992
+ 関数参照 (| Funcref | ) はジェネリック関数として使用できる。これにより、特定の型
1993
+ を操作する関数のファクトリーを作成できる: >
1994
+
1995
+ vim9script
1996
+
1997
+ def MakeEcho<T>(): func(T): T
1998
+ return (x: T): T => x
1999
+ enddef
2000
+
2001
+ var EchoNumber = MakeEcho<number>()
2002
+ echo EchoNumber(123)
2003
+
2004
+ var EchoString = MakeEcho<string>()
2005
+ echo EchoString('abc')
2006
+ <
2007
+ ジェネリック関数のコンパイルと逆アセンブル~
2008
+
2009
+ | :defcompile | コマンドは、具体的な型の特定のリストを持つジェネリック関数をコン
2010
+ パイルするために使用できる: >
2011
+
2012
+ defcompile MyFunc<number, list<number>, dict<string>>
2013
+ <
2014
+ | :disassemble | コマンドを使用すると、ジェネリック関数に対して生成された命令を
2015
+ 一覧表示できる: >
2016
+
2017
+ disassemble MyFunc<string, dict<string>>
2018
+ disassemble MyFunc<number, list<blob>>
2019
+ <
2020
+ 制限事項と今後の課題~
2021
+
2022
+ 現在、Vim は以下をサポートしていない:
2023
+ - 型変数の型推論: ジェネリック関数を呼び出す際は、すべての型を明示的に指定
2024
+ する必要がある。
2025
+ - 型制約: 型変数を特定のクラスまたはインターフェースに制限することはできな
2026
+ い (例: `T extends SomeInterface`)。
2027
+ - デフォルト型引数: 型パラメータが明示的に指定されていない場合に、デフォル
2028
+ トの型を提供する。
2029
+
2030
+ ==============================================================================
2031
+
2032
+ 6. 名前空間、Import と Export
1899
2033
*vim9script* *vim9-export* *vim9-import*
1900
2034
1901
2035
Vim9 script は、import されるように書くことができます。これは、いくつかの項目
@@ -2178,7 +2312,7 @@ import したオートロードスクリプトを使用するマッピングを
2178
2312
2179
2313
==============================================================================
2180
2314
2181
- 6 . クラスとインターフェイス *vim9-classes*
2315
+ 7 . クラスとインターフェイス *vim9-classes*
2182
2316
2183
2317
旧来のスクリプトでは、関数であるメンバーを追加することで、辞書を一種のオブジェ
2184
2318
クトとして使用することができます。しかし、これは非常に非効率的で、すべてのオブ
@@ -2192,7 +2326,7 @@ import したオートロードスクリプトを使用するマッピングを
2192
2326
2193
2327
==============================================================================
2194
2328
2195
- 9 . 理論的根拠 *vim9-rationale*
2329
+ 8 . 理論的根拠 *vim9-rationale*
2196
2330
2197
2331
:def コマンド ~
2198
2332
0 commit comments