vimdoc-ja-working icon indicating copy to clipboard operation
vimdoc-ja-working copied to clipboard

eval.txt についての質問

Open uakms opened this issue 7 years ago • 8 comments

  1. 翻訳した時期が違うからでしょうが、次のように表記に差異があります。
  • ==系、!=系、is、isnot (List, Dictionary について)
  • "equal", "not equal", "is", "isnot" (Funcref について)

"equal" などは日本語訳で「等しい」となって消えていますので、ちょっと戸惑うかも。個人的には "equal" の方が良いと思います。どちらに合わせた方が良いでしょうか?

  1. また、List と Dictionary については、原文に "isnot" に相当する語句が存在しません。これは削除した方が良いと思いましたが、続けて

When using "is" or "isnot" with a |List| or a |Dictionary| リスト (|List|) や 辞書 (|Dictionary|) に対して "is" や "isnot" を使うと

と書かれているので、List や Dictionary についても "isnot" が使えるようです (実際どうなのかわかりません)。原文の方に "isnot" の加筆を PR する案件でしょうか?


List

A |List| can only be compared with a |List| and only "equal", "not equal" and "is" can be used. This compares the values of the list, recursively. Ignoring case means case is ignored when comparing item values.

リスト|List|はリストとだけ比較可能で、==系、!=系、is、isnotのみ利用できる。 これらはそれぞれのリストの値を再帰的に比較する。大文字小文字無視にすると要素を 比較するときに大文字小文字を無視する。

Dictionary

A |Dictionary| can only be compared with a |Dictionary| and only "equal", "not equal" and "is" can be used. This compares the key/values of the |Dictionary| recursively. Ignoring case means case is ignored when comparing item values.

辞書|Dictionary|は辞書とだけ比較可能で、==系、!=系、is、isnotのみ利用できる。 これらは辞書のキー/値を再帰的に比較する。大文字小文字無視にすると要素を 比較するときに大文字小文字を無視する。

Funcref

A |Funcref| can only be compared with a |Funcref| and only "equal", "not equal", "is" and "isnot" can be used. Case is never ignored. Whether arguments or a Dictionary are bound (with a partial) matters. The Dictionaries must also be equal (or the same, in case of "is") and the arguments must be equal (or the same).

|Funcref|は|Funcref|とだけ比較可能で、"equal", "not equal", "is", "isnot" のみ 利用できる。大文字小文字は常に区別される。引数や辞書が(部分適用に)バインドされ ているかどうかも重要である。辞書も同値(あるいは "is" の場合は同一)でなければな らず、引数も同値(あるいは同一)でなければならない。

uakms avatar Aug 31 '17 13:08 uakms

僕はその提案で良いと思いますが、より Vim script を使ってる人の意見も聞きたいです。

@thinca or @tyru どうでしょうかね?

koron avatar Sep 04 '17 06:09 koron

==系、!=系、is、isnotのみ利用できる。 "equal", "not equal", "is", "isnot" のみ利用できる。

どちらがわかりやすいかと言われると前者な気がします。is isnot はこれら自体が演算子なので、後者は抽象的な equal と言うワードと具体的な演算子である is と言うワードが同列で並んでいて、少し気持ちが悪いです。

thinca avatar Sep 04 '17 09:09 thinca

初歩的な質問で申しわけありません。 「== 系」としてあるのは、'==', '==#', '==?' が使える、 「!= 系」は同じく、'!=', '!=#', '!=?' が使えるということですよね?

そうすると、is や isnot には「系」が付いていないので、

'is' のみが利用できて、'is#', 'is?' は使えない

と受け取れます (isnot も同様)。実際そうなのでしょうか?

(Funcref は「大文字小文字は常に区別される」と書かれているので、List や Dictionary と表記を合わせようと考えたのが間違いでしたか…‥。Vim script を熟知している thinca さんや tyru さんに言葉を考えてもらうのが得策ですね。)

uakms avatar Sep 04 '17 12:09 uakms

==系、!=系、is、isnotのみ利用できる。 "equal", "not equal", "is", "isnot" のみ利用できる。

自分も前者がいいですね。 "equal" という単語で「(参照ではなく)値が同じであること」を示されるより具体的に演算子で示してくれた方が分かりやすいかと思います。

あと @uakms さんが指摘した is, isnot には「系」が付いていない、というのもその通りで「系」が付いていた方がいいと思います。 しかし Vim プラグイン結構書いてる人でも is#, is? って使ってるのあんまり見たことない気がします…(基本的に is は List か Dictionary の参照の比較に使うのでその場合 #, ? をつけなくても影響がない) とはいえ is だけではなく is#, is? もあることは確かなので

==系、!=系、is系、isnot系のみ利用できる。

を推します。

tyru avatar Sep 04 '17 14:09 tyru

is#, is? って使ってるのあんまり見たことない気がします…

ちなみに最近は https://github.com/Kuniwak/vint/issues/233 を見て ==, != 系はリストの比較だけに使おうかなぁ、なんて考えてたりもします(is,isnot 系は文字列と数値の比較で暗黙の変換が働かないのでより厳格)。

tyru avatar Sep 04 '17 14:09 tyru

List と Dictionary については

  • 日本語訳:

「==系、!=系、is系、isnot系のみ利用できる。」とする。

  • 原文:

「and only "equal", "not equal" and "is" can be used.」 ↓ 「and only "equal", "not equal", "is" and "isnot" can be used.」 とする旨を issues の「本家helpのtypo報告スレ #1032」に登録する。

ということでよろしいでしょうか?

Funcref についても同様に変更したいところです。

「"equal", "not equal", "is", "isnot" のみ利用できる。」 ↓ 「==系、!=系、is系、isnot系のみ利用できる。」

しかし、「大文字小文字は常に区別される」とのことなので、

大小文字考慮の "==#", "!=#", "is#", "isnot#" 大小文字無視の "==?", "!=?", "is?", "isnot?"

の扱いはどのようになっているのでしょうか。 使えるけれど意味がないものなのか、そもそも使えないものなのかもわかりません。 文字通り "==", "!=", "is", "isnot" のみで「系」を付けたらアカンとか?

質問ばかりで申しわけありません。

uakms avatar Sep 05 '17 13:09 uakms

返事が遅れ申し訳ありません。

List と Dictionary については

はい、それでいいと思います。 (原文の "isnot" が抜けているのは多分ミスですかね)

扱いはどのようになっているのでしょうか

「常に区別される」と書いてある以上は「使えるけれど意味がないもの」だと思います。 …と思って試してみたらその通りでした。 演算子が ==, ==#, ==?, is, is#, is? に限らず、 s:foos:foo に対してのみ、残りの2関数についても自分自身に対してのみ 1(等しい) と判定されました(s:op を手動で変更して試しました)。 関数名による大文字小文字の区別はありません。


function! s:foo() abort
endfunction

function! s:Foo() abort
endfunction

function! Foo() abort
endfunction

let s:op = '=='
let s:funcrefs = [function('s:foo'), function('s:Foo'), function('Foo')]
for s:lhs in s:funcrefs
  for s:rhs in s:funcrefs
    echo s:lhs s:op s:rhs eval('s:lhs' . s:op . 's:rhs')
  endfor
endfor

tyru avatar Sep 08 '17 14:09 tyru

ありがとうございます! Funcref についても「==系、!=系、is系、isnot系のみ」にしようと思います。 eval は原文との差がかなりあるので、一部分の PR を作ってみます。

(もうすでに crazymaster さんや k-takata さんが catch up 作業をしてるかもしれませんが……)

uakms avatar Sep 09 '17 13:09 uakms