スクリプトの仕様メモ
投稿者:
cfm_
投稿日:2016/07/15 19:11
≪小数の切り上げ
|
defの多重使用について≫
完全に自分用。
例示されているスクリプトは、全て実行して確かめました。
注:明記のない検証では、null値・NaN値・Infinity値を考慮していません。
ツイート
例示されているスクリプトは、全て実行して確かめました。
注:明記のない検証では、null値・NaN値・Infinity値を考慮していません。
#変数に、配列の入った別の変数を代入すると、配列への参照がコピーされる
a=createArray()
a[1]=20
b=a
b[1]=30
speak(a[1]) #30
speak(b[1]) #30
#配列の入った変数に代入すると、変数だけ上書きされ、入っていた配列には影響がない
a=createArray()
a[2]=20
b=a
a=createArray()
speak(a[2]) #null
speak(b[2]) #20
#配列の要素も、変数と同じようにふるまう
a=createArray()
a[1]=createArray()
a[1][2]=20
b=a[1]
a[1]=createArray()
speak(a[1][2]) #null
speak(b[2]) #20
#数値と文字列は、値が同じなら等しい(片方が文字列のとき、もう片方が文字列に変換される?)
speak("1"==1) #true
speak("10"==10) #true
speak(10/0=="Infinity") #true
#足し算は、どちらかが文字列なら結合される
speak("10"+10) #1010
speak("10"+10==1010) #true
#文字列と数値の、足し算以外の演算はエラー、ただし例外あり
speak("10"-10) #エラー
speak(("10")-3) #7
speak("10"+10-3) #1007
speak(10+"10"-3) #エラー
speak(10-3+"10") #エラー
#配列の参照先が等しいかの判別が可能
a=createArray()
b=a
speak(a==b) #true
a=createArray()
b=createArray()
speak(a==b) #false
#配列の大小は存在しない
a=createArray()
b=createArray()
speak(a>b) #false
speak(a<b) #false
#定義されていない変数は、変数名の文字列と等しい(not defined variableと表示される)
speak(aa) #aa
speak(toString(aa)) #aa
speak(aa=="aa") #true
#したがって、"null"や別の非定義変数とは等しくない(not defined variableと表示される)
speak(aa=="null") #false
speak(aa==null) #false
#省略された引数の変数は、"null"と等しくないが、文字列に変換すると"null"になる(エラー無し)
def a(b)
speak(b) #null
speak(b=="null") #false
speak(toString(b)=="null") #true
end
a()
# &&は、左辺が(A)を満たすときfalseを返し、満たさないとき右辺を返す
#(A)false or null or "" or 0
speak(false&&true) #false
speak(""&&"ok") #false
speak("ああ"&&"ok") #ok
speak("false"&&"ok") #ok
speak(0&&"ok") #false
speak(10&&"ok") #ok
speak(-10&&"ok") #ok
# ||は、左辺が(A)を満たすとき右辺を返し、満たさないときtrueを返す
#(A)false or null or "" or 0
speak(false||true) #true
speak(""||"ok!") #ok!
speak("ああ"||"ok!") #true
speak("false"||"ok!") #true
speak(0||"ok!") #ok!
speak(10||"ok!") #true
speak(-10||"ok!") #true
#whileは、条件が(A)以外のとき
#(A)false or null or "" or 0
while 0 do speak("ok");end #実行されない
while -1 do speak("ok");end #実行される
while 1 do speak("ok");end #実行される
while "" do speak("ok");end #実行されない
while "あ" do speak("ok");end #実行される
#ifは、(B)以外のときtrue
#(B)false or null or ""
if 0 then speak("1");end #1
if 1 then speak("2");end #2
if -1 then speak("3");end #3
if 10 then speak("4");end #4
if -10 then speak("5");end #5
if "" then speak("6");end
if "aa" then speak("7");end #7
if "true" then speak("8");end #8
if "false" then speak("9");end #9
#!は(B)以外をtrueとみなす
#(B)false or null or ""
speak(!0) #false
speak(!1) #false
speak(!-1) #false
speak(!10) #false
speak(!-10) #false
speak(!"") #true
speak(!"aa") #false
speak(!"true") #false
speak(!"false") #false
#http://rmake.jp/boards/2/topics/1052 でのfragileさんの投稿
a = 0
if 0 #true ifに0だからtrue
if a #true
if 0||a #true ifに0だからtrue
if a||0 #true
if 0 && a #false ifにfalseだからfalse
if a && 0 #false
if !0 #false !0=false
if !a #false
if !0||a #true !0=falseだから、if a、すなわちif 0となり、true
if 0||!a #false if !a となるから、if !0となり、false
if !0||!a #false if false||falseとなるから、false
if !a||0 #true if false||0となるから、if 0であり、true
if a||!0 #false もう疲れた……
if !a||!0 #false
if !0&&a #false
if 0&&!a #false
if !0&&!a #false
if !a&&0 #false
if a&&!0 #false
if !a&&!0 #false
16/07/17.追加。上の説明も少し変更。
def a(b)
#null(空引数)はfalseではない
speak(b==false) #false
#(A)はnullもfalseとして扱う
speak(b&&"ok") #false
#(B)はnullもfalseとして扱う
speak(!b==true) #true
end
a()
#trueは1,"1"とのみ等しい
speak("1"==true) #true
speak(1==true) #true
speak("0"==true) #false
speak("-1"==true) #false
speak("-10"==true) #false
speak("10"==true) #false
speak(0==true) #false
speak(-1==true) #false
speak(-10==true) #false
speak(10==true) #false
speak(""==true) #false
speak("aa"==true) #false
speak("true"==true) #false
#falseは0,"0",""とのみ等しい
speak("0"==false) #true
speak(0==false) #true
speak(""==false) #true
speak("1"==false) #false
speak(1==false) #false
speak("-1"==false) #false
speak("-10"==false) #false
speak("10"==false) #false
speak(-1==false) #false
speak(-10==false) #false
speak(10==false) #false
speak("aa"==false) #false
speak("true"==false) #false
def a(b)
#nullは文字列,数値とは等しくない
speak("1"==b) #false
speak(1==b) #false
speak("0"==b) #false
speak("-1"==b) #false
speak("-10"==b) #false
speak("10"==b) #false
speak(0==b) #false
speak(-1==b) #false
speak(-10==b) #false
speak(10==b) #false
speak(""==b) #false
speak("aa"==b) #false
speak("true"==b) #false
end
a()
#上3つ(true,false,null)の==を!=に置き換えると、全て結果が反転
#(スクリプト省略)
#null値同士は等しい
def a(b,c)
speak(b==c) #true
speak(b!=c) #false
end
a()
//16.07.19.追加
#defより前に関数を呼び出すとエラー
#エラー
a()
def a()
speak("a")
end
#スクリプトの流れで、先にdefを通ればよいという訳ではない。
#エラー
i=false
while true
if i
b()
end
def b()
speak("b")
end
i=true
end
#ifでdefを実行させないとエラー
#Error #1069;null
if false
def a()
speak("a")
end
end
a()
#ifでdefを実行させると関数を呼び出せる
if true
def a()
speak("a") #"a"
end
end
a()
#defを重ねると、内側のdefは実行されない
def a()
speak("a") #"a"
def b()
speak("b")
end
end
a()
#二重defも普通に使える。
def a()
speak("a") #"a"
def b()
speak("b") #"b"
end
b()
end
a()
#defより前では使えない
#エラー
def a()
speak("a")
b()
def b()
speak("b")
end
end
a()
#defの内側の関数は外から呼び出せない
#Error #1069;null
def a()
speak("a")
def b()
speak("b")
end
end
b()
#関数でreturnしなかったとき、返り値はnull
def a()
end
speak(a()=="null") #false
speak(toString(a())=="null") #true
#setVariableは関数名を返す
speak(setVariable("test",2)) #test
#0で割るとInfinity値、0で剰余を求めるとNaN
speak(10/0) #Infinity
speak(10%0) #NaN
#計算で、""は0として扱い、""以外の文字を使うとNaNとなる(エラーなし)
#ただし、引き算で左が文字のとき、文法エラー
speak(10/"") #Infinity
speak(10/"aa") #NaN
speak(""/10) #0
speak("aa"*10) #NaN
speak(10*"") #0
speak(10*"aa") NaN
speak(""*10) #0
speak("aa"*10) #NaN
speak(10-"") #10
speak(10-"aa") #NaN
speak(""-10) #文法エラー
speak("aa"-10) #文法エラー
speak(10%"") #NaN
speak(10%"aa") #NaN
speak(""%10) #0
speak("aa"%10) #NaN
#ただし、引き算で左が文字でも、計算結果や変数の値なら文法エラーなし
a=""
b="aa"
speak(a-10) #-10
speak(b-10) #NaN
speak(10-a) #10
speak(10-b) #NaN
16.08.01.追加 popArray()は正しく使わないとエラーを起こしそう。
#getArrayLengthは最大の要素の番号+1を返す
a=createArray()
a[0]="a"
a[1]="b"
a[10]="c"
speak(getArrayLength(a)) #11
#pushArrayは最後の要素の次に要素を追加する
a=createArray()
a[0]="a"
a[1]="b"
a[10]="c"
pushArray(a,"d")
speak(a[2]) #null
speak(a[11]) #"d"
#popArrayは最後の要素を取り出して配列の長さを-1する
a=createArray()
a[0]="a"
a[1]="b"
a[10]="c"
speak(popArray(a)) #c
speak(getArrayLength(a))#10
speak(popArray(a)) #null
16.08.25.追加
#startInput(),takeInput,setCanvasVisibleの返り値はnull
speak(startInput()) #null
speak(setCanvasVisible(true)) #null
startInput()
while true
while hasInput()
speak("takeinput="+takeInput()) #null
end
waitTime(1)
end
#takeInputで取得した入力は何度でも判定できる
#結果:[A]を押すと、A1,A2が順に表示される。 [alt](対応していないキーなら何でも良い)を押すとB1,B2が順に表示される。
startInput()
while true
while hasInput()
takeInput()
if isKeyDown("A")
speak("A1")
end
if isKeyDown("")
speak("B1")
end
if isKeyDown("A")
speak("A2")
end
if isKeyDown("")
speak("B2")
end
end
waitTime(1)
end
#getMousePositionは、入力がMouseDown/MouseUp/MouseMoveのどれかのときのみ使用可能
#test0
speak(getMousePosition()[0])#エラー
startInput()
#test1
speak(getMousePosition()[0])#エラー
while true
while hasInput()
takeInput()
#test2
if !isMouseMove()
speak(getMousePosition()[0]) #クリックでは表示される,キーを押すとエラー
end
#test3
if isKeyDown("A")
speak(getMousePosition()[0]) #エラー
end
#test4
if isKeyDown("B")
if !isMouseMove()
speak(getMousePosition()[0]) #エラー
end
end
end
end
#createSpriteは1~512の中で、空いている一番小さい番号を返す
speak(createSprite(298715))#1
speak(createSprite(298715))#2
speak(createSprite(298715))#3
speak(createSprite(298715))#4
speak(createSprite(298715))#5
speak(createSprite(298715))#6
deleteSprite(2)
deleteSprite(3)
deleteSprite(5)
speak(createSprite(298715))#2
speak(createSprite(298715))#3
speak(createSprite(298715))#5
16.09.25.追加 エスケープシーケンスについて
#\nで改行
#\tでタブ文字
#それ以外の小文字・大文字アルファベットでは何も起こらないことを確認した。
#\"でダブルクオーテーション
#\\でバックスラッシュ(円マーク)
#\nと\tは1文字
speak(getArrayLength(splitString("\n","")))#1
speak(getArrayLength(splitString("\t","")))#1
16.09.26.追加
#(A)(B)ともにInfinityはtrue、NaNはfalse
speak(!(1/0))#false
speak((1/0)&&"a")#a
speak((1/0)||"a")#true
if (1/0) then speak("a") ;end#a
while (1/0)#ずっとb
speak("b")
end
speak(!toNumber("a"))#true
speak(toNumber("a")&&"a")#false
speak(toNumber("a")||"a")#a
if toNumber("a") then speak("a") ;end#表示なし
while toNumber("a")#表示なし
speak("b")
end
16.11.10.追加
#InfinityはInfinityとのみ等しい
#NaNは何と比較してもfalseを返す((NaN==NaN)はfalse)
inf=10/0
null=getVariable("a")
nan=toNumber("a")
#特殊な掛け算(Infinity)
#負の値を掛けると-Infinity
speak(inf*(-10)) #-Infinity
speak((-10)*inf) #-Infinity
speak((-1)*inf) #-Infinity
speak(inf*(-1)) #-Infinity
#正の値を掛けるとInfinity
speak(1*inf) #Infinity
speak(inf*1) #Infinity
speak(inf*10) #Infinity
speak(10*inf) #Infinity
#Infinity,trueを掛けるとInfinity
speak(inf*inf) #Infinity
speak(inf*true) #Infinity
speak(true*inf) #Infinity
#0,null,NaN,false,文字列を掛けるとNaN
speak(0*inf) #NaN
speak(inf*0) #NaN
speak(inf*null) #NaN
speak(null*inf) #NaN
speak(inf*nan) #NaN
speak(nan*inf) #NaN
speak(inf*"") #NaN
speak(""*inf) #NaN
speak(inf*"a") #NaN
speak("a"*inf) #NaN
speak(inf*false) #NaN
speak(false*inf) #NaN
#特殊な掛け算(null)
#Infinity,NaN,""でない文字列を掛けるとNaN
speak(null*inf) #NaN
speak(null*nan) #NaN
speak(null*"a") #NaN
#数値,"",null,true,falseを掛けると0
speak(null*(-10)) #0
speak(null*(-1)) #0
speak(null*0) #0
speak(null*1) #0
speak(null*10) #0
speak(null*"") #0
speak(null*null) #0
speak(null*true) #0
speak(null*false) #0
#特殊な掛け算(NaN)
#何を掛けてもNaN
speak(nan*(-10)) #NaN
speak(nan*(-1)) #NaN
speak(nan*0) #NaN
speak(nan*1) #NaN
speak(nan*10) #NaN
speak(nan*inf) #NaN
speak(nan*null) #NaN
speak(nan*nan) #NaN
speak(nan*"") #NaN
speak(nan*"a") #NaN
speak(nan*true) #NaN
speak(nan*false) #NaN
#特殊な割り算
speak("A1")
speak(inf/(-10)) #-Infinity
speak(inf/(-1)) #-Infinity
speak(inf/0) #Infinity
speak(inf/1) #Infinity
speak(inf/10) #Infinity
speak(inf/null) #Infinity
speak(inf/"") #Infinity
speak(inf/true) #Infinity
speak(inf/false) #Infinity
speak(inf/inf) #NaN
speak(inf/nan) #NaN
speak(inf/"a") #NaN
speak("A2")
speak((-10)/inf) #0
speak((-1)/inf) #0
speak(0/inf) #0
speak(1/inf) #0
speak(10/inf) #0
speak(inf) #Infinity
speak(""/inf) #0
speak(true/inf) #0
speak(false/inf) #0
speak(inf/inf) #NaN
speak(inf) #Infinity
speak("a"/inf) #NaN
speak("B1")
speak(null/(-10)) #0
speak(null/(-1)) #0
speak(null/0) #NaN
speak(null/1) #0
speak(null/10) #0
speak(null/null) #NaN
speak(null/"") #NaN
speak(null/true) #0
speak(null/false) #NaN
speak(null/inf) #0
speak(null/nan) #NaN
speak(null/"a") #NaN
speak("B2")
speak((-10)/null) #-Infinity
speak((-1)/null) #-Infinity
speak(0/null) #NaN
speak(1/null) #Infinity
speak(10/null) #Infinity
speak(null/null) #NaN
speak(""/null) #NaN
speak(true/null) #Infinity
speak(false/null) #NaN
speak(inf/null) #Infinity
speak(null) #null
speak("a"/null) #NaN
speak("C1")
speak(nan/(-10)) #NaN
speak(nan/(-1)) #NaN
speak(nan/0) #NaN
speak(nan/1) #NaN
speak(nan/10) #NaN
speak(nan/inf) #NaN
speak(nan/null) #NaN
speak(nan/nan) #NaN
speak(nan/"") #NaN
speak(nan/"a") #NaN
speak(nan/true) #NaN
speak(nan/false) #NaN
speak("C2")
speak((-10)/nan) #NaN
speak((-1)/nan) #NaN
speak(0/nan) #NaN
speak(1/nan) #NaN
speak(10/nan) #NaN
speak(inf/nan) #NaN
speak(null/nan) #NaN
speak(nan/nan) #NaN
speak(""/nan) #NaN
speak("a"/nan) #NaN
speak(true/nan) #NaN
speak(false/nan) #NaN
コメントする
コメントするには、ログインする必要があります。
#足し算は、どちらかが文字列なら結合される speak("10"+10) #1010 #これはspeak("10",10)と同じだからわかるのですが speak(("10")-3) #7 speak("10"+10-3) #1007 #このあたりの仕組みがよくわかりませんね #とくに07が二桁になっているところ追記:"10"+7でなく1010から3引いてるから1007なんですね
追記>そう、そこでなぜか計算順序が変わってますよね、不思議です。
speak("10"+10-16) #994 speak("10"+10-16+"10") #99410 speak("10"+10-16+"10"-4) #エラー speak("10"+10-16+"10"+10) #9941010 speak("10"+10-16+"10"+10-14) #9940996 speak("10"+10-16+"10"+0) #994100 speak("10"+10-16+"10"+0-4) #994096 speak("10"+10-16+"10"+0+1) #9941001 speak(10+"10"+10-16+"10"+10) #1009941010 speak(10+10+10-16+10+10) #34 speak(10+"10"+10-16+10+10) #101014 speak(true + 10+10+10-16+10+10) #35 speak(false + 10+10+10-16+10+10) #34 speak(null + 10+10+10-16+10+10) #NaN #"null"もNaN speak(" " +10+10+10-16+10+10) #101014 speak(" " +10+10+10-16+10+"10") #10100410