zer0-star / Nim-ACL

ACL (AtCoder Library) implementation in Nim
Creative Commons Zero v1.0 Universal
22 stars 3 forks source link

toSeqとの競合 #68

Closed unaunagi closed 1 month ago

unaunagi commented 10 months ago

Nim1.6.14環境下で、extra/structure/set_mapをインポートすると、sequtilのtoSeqが上手く動かなくなるようです。 例えば下記のコードをAtCoderのコードテストに投げると再現可能です。

import sequtils
import atcoder/extra/structure/set_map
echo((0..10).toSeq)

ambiguous call; both iterators.items(s: Slice[items.T]) [iterator declared in C:\Users\una.choosenim\toolchains\nim-1.6.14\lib\system\iterators.nim(126, 10)] and set_map.items(s: Slice[items.Node]) [iterator declared in C:\Users\una.nimble\pkgs\atcoder-0.1.0\atcoder\extra\structure\binary_tree_node_utils.nim(72, 12)] match for: (HSlice[system.int, system.int])

コンパイル時にこのようなエラーが出ます。 toSeq以外でも、変数に入れたイテレータを順に見ていく系の処理全般で引っかかるようです。

let iter = (0..10)
for i in iter:
  echo(i)

これでも同じことが起きます。

詳しい原因や解決方法はわからないのですが、最新版のNimで動かすと正常な出力が得られました。 なのでAtCoderの次の言語アップデートが来れば自動的に解決するかもしれないです。

chaemon commented 8 months ago

すみません。投稿に今気づきました!調べてみたところ、iteratorでSliceできるような機能を作っていて、それが従来のSliceの定義とバッティングするようです。たとえば、it0からit1までをiterateするときにfor e in it0 ..< it1みたいな呼び方ができるはずです。

chaemon commented 1 month ago

こちらの件、以下のようにすればひとまず大丈夫そうですので、set_mapのiteratorとしてitemsを使う予定がなければそれでお願いします。

import atcoder/extra/structure/set_map except items

unaunagi commented 1 month ago

上手くいきました! ありがとうございます