スクリプトの仕様メモ
      投稿者: cfm_
     投稿日:2016/07/15 19:11
 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