refinements in import() and load()
Nobody has claimed this yet.
- Dominant language
- Vim Script
- Stars
- 587
- Forks
- 64
- Avg merge
- 2d 8h
- Merged PRs (30d)
- 1
Description
vital 本体の API のドキュメントを書こうと思ったけど、import() とか load() の仕様の議論がまだ収束してないことに気付くなど。
えーと、load の as 機能について。現状の load(['Foo']) がわかりづらいとの話だった気がする。
個人的には短く書けて気に入っているのだけど。
仕様整理。
load するとモジュールが V に置かれてそこからアクセスできるようになる。
V.load('Foo.Bar.Buz') -> V.Foo.Bar.Buz複数同時にロード可能
V.load('Foo.Bar.Buz', 'Hoge', 'Huga') -> V.Foo.Bar.Buz -> V.Hoge -> V.Huga文字列ではなくリストを渡すと、as として処理される
V.load(['Foo.Bar.Buz', 'FBB']) -> V.FBBas を空文字列にすればトップレベルに直接ロード可能
V.load(['Foo.Bar.Buz', '']) -> V (Foo.Bar.Buz の関数が直接使える)空文字列の場合は省略可能
V.load(['Foo.Bar.Buz']) -> V (Foo.Bar.Buz の関数が直接使える)ふと思ったのだけど、リストじゃなくて辞書を渡す仕様にして 5. の省略可能をなくすのはどうか。
as としては辞書の方が自然な気もするし。V.load({'Foo.Bar.Buz': 'FBB'}) -> V.FBB必然的に複数同時に処理可能。
ここらで人の意見が欲しい。
lingrでのthincaさんの提案を引用しつつ整形。
まず一般的な指針として、vitalのimport/loadは記述の短さよりも記述のわかりやすさを優先すべきと思っています。「このファイルはこれとこれをこのように使う」というのはexplicitである方が読みやすいです。複数の箇所に散らばるものは常に記述が短くあるべきですが、ファイルの先頭で宣言するものの場合、記述の短さはあまり重要でないと思います。
というわけで、thincaさんの「5. の省略可能をなくすのはどうか」は大賛成です。が、それだけでなく、「2. 複数同時にロード可能」をなくすべき、あるいは別名の関数にするべきだと思います。
というわけでこんな新仕様はどうでしょう。
-
loadするとモジュールが V に置かれてそこからアクセスできるようになる。これ以外にload()の使い道はない。V.load('Foo.Bar.Buz') -> V.Foo.Bar.Buz -
load_asすると第二引数の名前で参照可能。これ以外にload_as()の使い道はない。V.load_as('Foo.Bar.Buz', 'FBB') -> V.FBB -
import_extendingすると第1引数の変数を破壊的に書き換え、その中に読み込む関数が注入される。したがって以下のようにすることで、元の提案の4.が実現できる。なお、第二匹数が辞書でなかった場合、エラーとなる。また関数名がかぶった場合、元々存在する関数が上書きされ、あとで読み込ませたものが優先される。なお、import_extendingの第二引数は省略できない、つまりこれ以外にimport_extendingの使い道はない。なお、この関数の名前が長いのは、なるべくimportで別の変数を作ってほしいため。V.import_extending(V, 'Foo.Bar.Buz') -> V (Foo.Bar.Buz の関数が直接使える) let B = V.import('Foo.Bar.Baaaa') V.import_extending(B, 'Foo.Bar.Booo') -> B (Foo.Bar.Booo の関数も直接使える) -
(導入するとすれば)
load_eachで複数同時にロード可能。名前が長いのは、なるべくload()を並べて使ってほしいという想いから。V.load_each('Foo.Bar.Buz', 'Hoge', 'Huga') -> V.Foo.Bar.Buz -> V.Hoge -> V.Huga -
(導入するとすれば)
import_extending_eachで複数同時。これも同じく意図的に長い名前で。
load_as_eachやuse_eachはなし。前者は元の問題の4. や5. などのため。後者はなにが優先されるのかわかりづらいため。
ところで、上記方法で、lingrでmanga_osyoさんが要求していたユースケース: Vなどを経由せずいきなりs:から使えるようにしたいというものも自然に解決できます。実装上の黒魔術はなく、explicitで、かつ十分に短いです。
V.import_extending(s:, 'A.B.C')
以下、実装の。擬似コード。実際には厳しめの引数のチェックとエラー処理が入ります。
function! s:load(x)
call s:load_as(a:x, a:x)
endfunction
function! s:load_as(x, y)
...
endfunction
" function! s:load_each(...)
" for x in a:000
" call s:load(x)
" endfor
" endfunction
function! s:import_extending(x, y)
call extend(y, s:import(x))
endfunction
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start by reviewing the existing import() and load() entry points, then compare their current behavior with the proposed load_as(), import_extending(), and optional batch APIs described in this issue. The issue is ready only after the API design is agreed on and the resulting behavior and argument rules are specified.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- vim
- Domain
- tooling
- Issue type
- Feature
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Stale
- Clarity
- Needs clarification
- Newbie friendliness
- 25/100