アカウント名:
パスワード:
LETはなんで私普通の関数ですみたいな顔してるんだ?構文は関数だが引数のセマンティクスが通常関数とは違うだろ。
例えば
LET(x:=A, y:=B, x+y)
みたいな構文にするべきじゃないのか?
わざわざ特殊な記法にしても、誰も得しない。見慣れないものが増えたら、事故が増えるだけやろ。# あくまでExcelの「関数」なんやし。w
特殊な解釈が必要なのに見慣れた表記では却って混乱するのでは?初見ならLET関数に渡す最初の引数はどこで定義された変数なの、と思う。
自分も同意です。あくまで関数。敢えて構文かえるなら、元コメだと違和感があるのでもう文として独立させればいいと思います。let x=a ; y=b in a+b みたいな記法はPowerQueryだのDAXですでにやってるし。
まあ、違和感の正体はletという関数名だと思うので、do(x-a,y-b,x+y)とかに変えるならそれもいいかもしれませんが。
LETのスコープ内処理だから問題ないだろ。セルアドレスを書けばRangeオブジェクトで、式を書けば式に応じたオブジェクトになる自由さから言えば、ローカル名前型というオブジェクトが追加になったと思えば良い。
この場合、文法的にどうかという話で、スコープ云々は関係ないのでは?
関数内の実引数は、値(オブジェクト含む)として評価された上で関数に渡される(だから、関数からは引数にどんな名前の変数が、どんな数式が渡されたか判断できない)ため、LET関数の場合、例えば、LET(x,A, y,B, x+y) だと、1番目と3番目は(まだ定義もしていない)変数の値を評価しているように見えてしまう。ここは、変数を定義しているように見えるよう変えるべきでは?
と主張しているように見えるのですが、、、
新しい演算子を追加すると、構文解析もちょいと改造しなきゃならず互換を目指すGSuiteのGoogleやLibreOffice陣営から激しい抵抗にあって「せっかくOpenDocumentの時代なのに、また悪の帝国Micro$oftが勝手な真似を!」ってなりそう。それを避けたんではなかろうか。
今回のであっても名前解決あたりから先の処理がLETと他で共通化出来ないからなぁ……
ふと考えたんだが、LET(X:=Y, Y:=Z, Z:=X)みたいな記述にコンパイルエラーみたいな新しいエラーが必要になるかも。
LET(X,Y, Y,Z, Z,X)なら、たぶん左のYか右のXを評価したタイミングで参照エラーかなにか既存のエラーを返せばよい気がする。
#3783090のコメント者です。Excelは左から右への評価が明記されてました。そのため私の例はX:=A方式も既存のエラーで大丈夫と思います。
https://support.office.com/ja-jp/article/%E6%BC%94%E7%AE%97%E5%AD%90%E... [office.com]
構文以前にいい加減エディタ的なものをデフォで用意しろ。後セル内での改行やスペースをもっとちゃんと許容しろ。書きづらいし読みづらいんだよ。
非Algol系言語をちょっとでも知ってるならこういう構文は全然気にならないと思うけどなあ。私は10年以上まともなプログラミング言語に触ってないけど、Forth、RPL、Lispなどを考えるとごく自然に受け入れられる。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
私は悩みをリストアップし始めたが、そのあまりの長さにいやけがさし、何も考えないことにした。-- Robert C. Pike
ちょっと待て (スコア:0)
LETはなんで私普通の関数ですみたいな顔してるんだ?
構文は関数だが引数のセマンティクスが通常関数とは違うだろ。
例えば
LET(x:=A, y:=B, x+y)
みたいな構文にするべきじゃないのか?
Re:ちょっと待て (スコア:2)
わざわざ特殊な記法にしても、誰も得しない。
見慣れないものが増えたら、事故が増えるだけやろ。
# あくまでExcelの「関数」なんやし。w
Re: (スコア:0)
特殊な解釈が必要なのに見慣れた表記では却って混乱するのでは?
初見ならLET関数に渡す最初の引数はどこで定義された変数なの、と思う。
Re: (スコア:0)
自分も同意です。あくまで関数。
敢えて構文かえるなら、元コメだと違和感があるのでもう文として独立させればいいと思います。
let x=a ; y=b in a+b みたいな記法はPowerQueryだのDAXですでにやってるし。
まあ、違和感の正体はletという関数名だと思うので、do(x-a,y-b,x+y)とかに変えるならそれもいいかもしれませんが。
Re: (スコア:0)
LETのスコープ内処理だから問題ないだろ。
セルアドレスを書けばRangeオブジェクトで、式を書けば式に応じたオブジェクトになる自由さから言えば、ローカル名前型というオブジェクトが追加になったと思えば良い。
Re: (スコア:0)
この場合、文法的にどうかという話で、スコープ云々は関係ないのでは?
関数内の実引数は、値(オブジェクト含む)として評価された上で関数に渡される
(だから、関数からは引数にどんな名前の変数が、どんな数式が渡されたか判断できない)ため、
LET関数の場合、例えば、LET(x,A, y,B, x+y) だと、1番目と3番目は(まだ定義もしていない)変数の値を
評価しているように見えてしまう。
ここは、変数を定義しているように見えるよう変えるべきでは?
と主張しているように見えるのですが、、、
Re: (スコア:0)
新しい演算子を追加すると、構文解析もちょいと改造しなきゃならず
互換を目指すGSuiteのGoogleやLibreOffice陣営から激しい抵抗にあって
「せっかくOpenDocumentの時代なのに、また悪の帝国Micro$oftが勝手な真似を!」ってなりそう。
それを避けたんではなかろうか。
Re: (スコア:0)
今回のであっても名前解決あたりから先の処理がLETと他で共通化出来ないからなぁ……
Re: (スコア:0)
ふと考えたんだが、LET(X:=Y, Y:=Z, Z:=X)みたいな記述にコンパイルエラーみたいな
新しいエラーが必要になるかも。
LET(X,Y, Y,Z, Z,X)なら、たぶん左のYか右のXを評価したタイミングで参照エラーかなにか
既存のエラーを返せばよい気がする。
Re: (スコア:0)
#3783090のコメント者です。
Excelは左から右への評価が明記されてました。そのため私の例はX:=A方式も既存のエラーで大丈夫と思います。
https://support.office.com/ja-jp/article/%E6%BC%94%E7%AE%97%E5%AD%90%E... [office.com]
Re: (スコア:0)
構文以前にいい加減エディタ的なものをデフォで用意しろ。
後セル内での改行やスペースをもっとちゃんと許容しろ。
書きづらいし読みづらいんだよ。
Re: (スコア:0)
非Algol系言語をちょっとでも知ってるならこういう構文は全然気にならないと思うけどなあ。
私は10年以上まともなプログラミング言語に触ってないけど、Forth、RPL、Lispなどを考えるとごく自然に受け入れられる。