stuncloud / UWSCR

UWSC互換スクリプト実行ツール
MIT License
47 stars 4 forks source link

配列定義又は配列リテラルに於ける要素Emptyの表記方法について #182

Open DIYJii opened 1 month ago

DIYJii commented 1 month ago

概要

配列定義又は配列リテラルに於いて要素Emptyを表すのに、「1,2,Empty,8,16」 とせず 「1,2,,8,16」 とすると、下記のようなエラーになります。Case 2以外は構文エラーで定義時に引っ掛かりますが、Case 2は実行時エラーになります。

ちなみに、UWSCでは、配列定義に於いて「,,」を使ってもエラーは起きず、Empty要素として扱われます。

再現スクリプト

Case 1
Dim Hoge[] = 1,2,,8,16
UWSCR構文エラー
test.uws[1, 18] - 識別子ではありません

Case 2
Dim Hoge[] = 1,2,4,8,16,       //注:最後の要素がEmpty     
Print Hoge[3]
UWSCR実行時エラー
test.uws 2行目: Print Hoge[3]
[評価エラー] 識別子が見つかりません (Hoge)

Case3
Dim Hoge = [1,2,,8,16]
UWSCR構文エラー
test.uws[1, 17] - 識別子ではありません

Case4
Dim Hoge = [1,2,4,8,16,]      //最後がEmpty     
UWSCR構文エラー
test.uws[1, 24] - 識別子ではありません

再現手順

No response

バージョン

1.0.1

不具合発生環境

Windows 10

stuncloud commented 1 month ago

Case2は明確にバグっぽい (変数がない扱いなのはヤバい) parserによるHogeの存在確認はパスしてるのでEvaluatorがなんかやらかしてる?

その他は要検討、実装変更に危険がなさそうならやっても良いか?

個人的にはEMPTYは明示してもらうほうが言語としては健全に思う UWSCには

print 1+++++2 // 3

みたいなのがあったはずで、それと同じ不健全さを感じる

UWSCRでもこの形での関数の引数省略は仕様として取り込んでいるけど、あれはあるとわかっているものを省略するものなのでこのケースとは話がやや異なる

なんにしてもリスト化処理の実装次第ですね

DIYJii commented 1 month ago

配列定義について、デフォルトはEmptyと明記しておけば、 下のような関数の引数の例とも整合性が出来、 「,,」表記も真っ当な表現に見えてきませんか?

Hoge() // A : B : C Hoge(,,3) // A : B : 3 Hoge(1,2,) // 1 : 2 : C Hoge(empty,empty,3) // : : 3

Procedure Hoge(a = "A", b = "B", c = "C") Print a + " : " + b + " : "+ c FEND

なお、UWSCでは (デフォルトパラメータ以降に通常引数を書く事はNG) との制約の為、上記2行目はSyntaxErrorとなります。 その点、 UWSCRの方が使い易いです。

On Thu, Jun 6, 2024 at 4:27 PM Joey Takahashi @.***> wrote:

Case2は明確にバグっぽい (変数がない扱いなのはヤバい) parserによるHogeの存在確認はパスしてるのでEvaluatorがなんかやらかしてる?

その他は要検討、実装変更に危険がなさそうならやっても良いか?

個人的にはEMPTYは明示してもらうほうが言語としては健全に思う UWSCには

print 1+++++2 // 3

みたいなのがあったはずで、それと同じ不健全さを感じる

UWSCRでもこの形での関数の引数省略は仕様として取り込んでいるけど、あれはあるとわかっているものを省略するものなのでこのケースとは話がやや異なる

なんにしてもリスト化処理の実装次第ですね

— Reply to this email directly, view it on GitHub https://github.com/stuncloud/UWSCR/issues/182#issuecomment-2151587387, or unsubscribe https://github.com/notifications/unsubscribe-auth/BH6AXYRSNKL4CEWUH22Y443ZGAFOLAVCNFSM6AAAAABI4B5YBCVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDCNJRGU4DOMZYG4 . You are receiving this because you authored the thread.Message ID: @.***>

stuncloud commented 1 month ago

@DIYJii

関数の引数も同じ','区切りのように見えますが、その性質も解析・評価の方法もまるで異なるものなので今回の件とは分けて考えてください UWSCでも引数の省略はEMPTYPARAMという特殊な状態であり、配列とは異なります

今回の件で焦点となるのは主に以下の2点 (最初の例だとCase 2と4) となります

dim a[] = 1,2,3,
dim b = [1,2,3,]

これらを許容することした場合、評価結果は

のいずれかにすることが考えられます 前者はUWSCと同等です 後者は意外に思われるかもしれませんが、このような実装の言語が実際にあります そして、僕としては後者のほうが受け入れやすいんですよね、なぜかと言うと

dim b = [
    1,
    2,
    3,
]

このような書き方を許容できるからです (現状UWSCRではこのように複数行で配列リテラルを書けますが、最後の要素のあとの,はエラーとなります) この書き方は変更に強く、利点となります

デフォルトはEmptyと明記しておけば

については,,,EMPTY,と見なす実装をすると決定した場合の話なので、そういう問題では(まだ)ないです

「,,」表記も真っ当な表現に見えてきませんか?

末尾,については先に述べた通りです

1,,3,4 といった途中を省略する書き方については多くの言語で許容されないですし、正直なところUWSCRでもこれをやる気はありません なぜならこの手の無の記述がEMPTYになるという現象がUWSCでは色々なところで起きていて、どちらかと言うとバグっぽい動作だという認識だからです なので、おかしな仕様は再現しないというポリシーに基づくとこれもやらん、という判断になります

途中省略の実装自体はおそらく容易なのでやろうと思えばできます

結論