スクリプトの仕様メモ

投稿者:Material 305033 1 mini cfm_ 投稿日:2016/07/15 19:11

完全に自分用。

例示されているスクリプトは、全て実行して確かめました。
注:明記のない検証では、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




コメントする

コメントするには、ログインする必要があります。

コメント一覧

            mini mosmoss(投稿日:2016/07/16 14:57, 履歴)
#足し算は、どちらかが文字列なら結合される
 speak("10"+10) #1010
#これはspeak("10",10)と同じだからわかるのですが
 speak(("10")-3) #7
 speak("10"+10-3) #1007
#このあたりの仕組みがよくわかりませんね
#とくに07が二桁になっているところ
論理演算の謎の解明おもしろかったです
追記:"10"+7でなく1010から3引いてるから1007なんですね
Material 305033 1 mini cfm_(投稿日:2016/07/17 01:58, 履歴)
読んでくれてありがとうございます。ちょっとだけ本文も追加しました。
追記>そう、そこでなぜか計算順序が変わってますよね、不思議です。
            mini mosmoss(投稿日:2016/07/17 02:26, 履歴)
 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
わかるようで、わからない…
Cdv30200 aoi icon mini aoihikawa(投稿日:2016/07/16 09:24, 履歴)
これはお役立ちメモですね(w
Material 305033 1 mini cfm_(投稿日:2016/07/17 02:01, 履歴)
役に立つならよかったです。複雑で、変な比較等は避けたくなりますね。