【ティラノ初心者向け】個人的なプログラミングする時の心構え&プログラミング頻出概念周りのざっくり話
まあ私、本職が本職なので……(web系まわりばっかやるSE・PG)
※なお休職するまで精神やられたのは主に崖っぷちチキンレースをさせられてた体制と理不尽お客様側のせいなのでプログラミング自体に精神をやられたわけではない
1.心構え編
心構え、すなわちマインドセット、意外と大事。
要約すると「割とガッツは必要だけど、失敗は誰にでもあるさでGO!GO!」になる。
①バグもエラーも出しまくるものである
「バグが出た!」「エラーが出た!」
……これは開発において日常茶飯事です。
むしろ、バグやエラー出しまくってそこから学ぶのが本番、まである。
というか、一番バグやエラーを吐かせてはいけないタイミングとは何かわかりますか?
答えは「リリース後」です。
それでもバグやエラーは「関係ないゼ☆」と言わんばかりに湧きます。ええ、やつらは湧きます。
なので逆に考えるのです。
「開発中に見つかって良かった!」、と(伊達にリリース後ゲームでバグ複数出したわけではない顔つき)(これは個人趣味だから割と許される特権)
お仕事だと特に納期が絡むので、このバグの原因がわからないと発狂するのですが、趣味で、さらに個人裁量が大きいのであれば、そこにかけられる時間はかなり自由うらやましいよね本職の方面からするとね
なので、バグやエラーが「コンニチハ!」して来ても必要以上にビビることはないです。
ビビってたらこいつらをひねり潰すヒマもありません。
バグやエラーは出るものです。
湧くものです。出まくるものです(本職でもケアレスミスでよくやらかすし、そのケアレスミスで丸一日溶かしたことある)
必要以上にビビらず、ゆっくりと原因を探しましょう。
なんなら一晩じっくりことこと寝かせて熟考すると、「もしや」(ここで豆電球が点灯する表現)が浮かぶ時もある。
そうして、バグ・エラーを屈服させるのです。
うん? JavaScriptは友達だよ?
とはいえ、エラーメッセージの意味は出すたびにある程度理解するようにしましょう。
英語でもビビるな。ギリシャ語とかよくわかんない言語の適当なウィキペのページ見てから英語を見ればビビり感は減退するぞ(真顔)(英語に対する個人的ライフハック)(なお古代ギリシャ語履修した関係で本人はギリシャ語ではそこまで……な模様)
そうしてエラーメッセージの意味を取れるようになってきた果てに、チリツモ経験則で、その内「んじゃ、あの辺が怪しいか」ってできるようになります。
②「自分には理解できない」と思っちゃダメ
はなから「理解できない」と思って他人のソースや説明を見たりすると、どうあがいても理解できない率が高いです。
「理解できない」という予防線は、勝手に自己認識として理解を回避します、マジで(経験則※)
「理解はできる、たぶん」前提で、理解したい内容の説明が自分に合うかどうか、で考えましょう。
後は相談できる人がいるなら、その人に直接聞いちゃう。
やり過ぎてもアレですが、人間関係が構築されてればこそ、アナタが理解できるツボを押さえた簡単な説明をしてくれるかもしれません。
※本職の方で「理解できない」って思い込んでる人間が、バチクソ忙しい中でこっちにありとあらゆるエラー(割と簡単な英文)丸投げしだしたり、説明した実装してくれなくてキレた経験がある。まして、後輩ならともかく、年次的にはあーた先輩じゃないのさ……他所からの応援とはいえ、同じPG・SEなんだからてめーの部署の教育どうなってんだゴルァ(中指)って向こうの上司にカチコムぐらいの権利はあるよねってなった。
③完璧に理解しなくても良い
「②でああ言っといて?」と思うかもしれませんが、プログラミング自体は究極0/1の世界ですが、それは機械上の話であって、開発する我々は人間です。
完璧な理解ができてればこそ……な部分がないとは申しませんが、完璧目指して詰んで無理解(いわば0)よりも、かじったレベル(いわば0.5)の方で良い(better)のです。
それこそ、試行錯誤してればその内自然と理解も深まります(とはいえ罠も潜んでるので、そこは検索力が物を言う時がある)
私だって偉そうに言ってるけど全部理解してるわけじゃねーもんな。
実際本職でも、「理解してないけど、このコードがないと正常に動かない!」というものを「おまじない」と言ったりします。マジやで。
ここでポイントなのは「おまじないコードの内容は理解していない」が、「おまじないコードがないと他が動かないことは理解している」です。コレ、大きな違い。
なので、最初は部分理解でよいのです。千里の道も一歩から。
④とりあえず試してみるか←大事
試行錯誤、これ大事。
いじくり回せばいじくり回しただけ、経験値はたまる、と言えます。
モノづくり技術者やその気質のある子供とかが時計とか解体するのと同じです。
いじくり続けるのが経験値になる。
ついでに達成感という成功体験を味わうのも大事。
「これをああしてこうしてみたい」という演出があるなら、それが出来た段階であなたは一つの山を踏破したようなものです。
プログラミングって一つの山じゃなくて、どっちかというと連峰なのよ。
①の通りエラーもバグも、何をどうやっても湧いて出てくるものなので、そればっかり気にしたらダメです。
普通に本職SE・PG歴二桁いっても死ぬほどケアレスミスでバグ出してエラー吐かせるし、下手すると丸一日溶かすもん(私だ)(上司もしてた)
それよりも頭の中で想像したのと同じ動きが実現したことを喜び、祝いましょう。
そして、それを積み重ねましょう。
そうすると、気が付いたらゲームが出来上がってます。
ね、簡単でしょ?
2.プログラミング周辺の頻出概念
①オブジェクト
オブジェクト。Object。訳すなら「モノ」。
これだとなーんもわかりませんね。
しかし、プログラミングやってる人間でもこいつの正確な理解とこいつの簡単な説明を両立できる人間は少ない、と私は断言します。
だって新人時代の教本がそうだったもん。
というわけで言語学方面(意味論)から文系SEの私は攻めます。
さて、「モノ」とはいえ、オブジェクトはobjectであって、thingではないのです(重要)
ではobjectとは本来的にどういう意味でしょう↓。
↑「物、物体」の他に、「目標、対象、目的語」などの意味があることがわかりましたね。
ついでに↑の語源のとこも見てください。
ラテン語のob(対する)-ject(投げる)から構成されたのがobjectという語です(ちなみにpro(前に)-ject(投げる)-er(者)でプロジェクターだったりする。さらに脱線するとこのjectの部分って「サイは投げられた(Alea jacta est)」のjactaと同じってことです、この変化は人称や時制も絡むが)
というわけで、同じ「物」であってもthingではなく、objectである理由がここにうかがえます。
すなわち、プログラミング上で言う「オブジェクト」とは「何かしらの目標、目的を達成するという方向性を持ったモノ」であるのです。
そのため、オブジェクトと一口に言っても多種多様です。
が、基本的には「(なんとか)オブジェクト」って感じで「なんとか」の部分はいろいろに変わります。
そして、大体その「なんとか」を様々な目的に合わせて良い感じにいじくったりする関数(後述)とかを持っててくれるので、「なんとか」に対する十徳ナイフ的なところもあります。
とりあえずのざっくり理解としてはこんなもんで大丈夫なはずです。
②変数
処理結果や処理で使用する値を保存するための箱です。
ベースがJavaScriptのティラノの場合、入れるだけなら型をあんまり意識しなくて良いんですが、それが逆に罠だったりするのが注意なもの。
はい、変数には型というものが付随します。
要は変数という「箱の中身はなんじゃろな〜」、を「先に種類だけ教えますね」してるのが型。
代表的なものは文字列(String)、数値(Integer)、真偽値(Boolean)……浮動小数(Float)は要るか?
いや浮動小数(Float)は計算結果がなんかおかしいってなった時に自分で調べてもろて……
まあ、この型が異なるだけでエラー出たり、分岐条件がうまくいかなかったりするので、代表的な文字列(String)、数値(Integer)、真偽値(Boolean)の三種類は確実に頭に叩き込みましょう。
文字列(String)→文字通り文字。クォーテーション(Javascriptではシングル・ダブル問わない)で囲われた物は中身がなんだろうとこれとして扱われる("123"や"true"は文字列になる)
数値型(Integer)→文字通り数。計算したい場合、こいつを使う。Intで略されがち。これとして扱いたい場合、クォーテーションで囲ってはならない(✕"123"←文字列になる、◯123)
真偽値(Boolean)→trueかfalseの二択の型。boolで略されがち。これにしたいならやはりクォーテーションで囲っちゃダメ(✕"true"←文字列になる、◯true)
③代入、宣言
代入は変数に値を入れること。
宣言は変数を作ること。
まあJavascriptは最悪宣言しなくても代入した瞬間に変数爆誕するし、ティラノ内で共有するものなら、宣言なしでティラノが用意しているf(セーブデータ単位の変数)、tf(一時変数)、sf(システム変数)に作らなくてはならないのだけど……
なお、代入するには左辺に変数、右辺に入れたい内容を置いて=で繋いであげる。
//宣言と代入一度にやるとこう
//宣言はvarかletを使うんだけど、初心者はvar使った方が制約気にしなくていいから良いかな
var test="代入する文字列";
let test=123;
ただし、先に言った通り、ティラノ内で共有する変数についてはティラノが用意しているf、tf、sfを利用しなくてならない、です。
※[iscript]~[endscript]内で宣言した変数はその[iscript]~[endscript]内でしか生きない
で、ティラノの用意しているf、tf、sfはさっきちらっと()内で説明したけど、より詳細にするとこんな感じ。
そして、全部宣言(つまりvarやlet)は不要です(後でここわかるかもね)
f:「f.任意の変数名」で使う。セーブデータ単位で保持される
tf:「tf.任意の変数名」で使う。一時変数のため、作成されてからゲームを起動してる間は保持されるが、ゲームを終了すると破棄される=存在しなくなる。なお、システム構造的には一応セーブデータをまたいで存在する。
sf:「sf.任意の変数名」で使う。システム変数のため、常に保持される。セーブデータをまたぐ。
たとえば、ゲームの累計クリア回数(ここで言うクリアは何かしらのエンドにたどり着いたこと)を保持しておきたい、という場合は「sf.loopcnt」みたいな名前で初回起動時に0にして、後は各エンドに到達してタイトルとかに戻る前にこのsf.loopcntっていう変数に1を足す処理をしてあげればいいわけですね。
JavaScriptだとこうね。
//自分自身に1加算したのを格納する
//この場合処理方向は右から左(←)と思ってもらえれば
sf.loopcnt=sf.loopcnt+1;
逆に、現在の分岐状況などはセーブデータ単位の「f」に変数を設定して管理するのが良いでしょう。これはセーブデータまたいだら意味ないからね。
じゃあtfの使いどころ、というと……マクロ実行結果を入れたり、後はセーブデータ関係ないミニゲームとかの得点とかかな……?
④比較
JavaScript上ではif文や三項演算子(←は上級者向けなのでスルーでよし)、ティラノ上ではifタグやcondパラメータで使用します。
この比較の書き方をすることで「任意の変数が指定した値や変数を基準として一致してるか」とか「不一致か」とか、「以上」とか「未満」とか条件を作れます。
なお、比較のための記号を比較演算子、と呼ぶ(別にこれ自体は覚えなくても問題ない)
また厳密比較と緩い比較の二つの概念があります。まあ、基本は緩い比較で事足りるので、とりあえず緩い比較だけ説明します。
ちなみに、変数の型の概念はここの比較で影響出る場合あるので、比較作る時に型は注意です。
一致比較「任意の変数1==任意の変数2または値」:これで「==」の左辺の「任意の変数1」が右辺の「任意の変数2」または「値」と一致しているか、という条件にできる
不一致比較「任意の変数1!=任意の変数2または値」:これで「!=」の左辺の「任意の変数1」が右辺の「任意の変数2」または「値」と不一致か、という条件にできる
数値型系の未満比較「任意の数値型変数1<任意の数値型変数2または値」:これで「<」の左辺の「任意の数値型変数1」が右辺の「任意の数値型変数2」または「値」未満か、という条件にできる
数値型系の超過比較「任意の数値型変数1>任意の数値型変数2または値」:これで「>」の左辺の「任意の数値型変数1」が右辺の「任意の数値型変数2」または「値」を超過しているか、という条件にできる
数値型系の以下比較「任意の数値型変数1<=任意の数値型変数2または値」:これで「<=」の左辺の「任意の数値型変数1」が右辺の「任意の数値型変数2」または「値」以下か、という条件にできる
数値型系の以上比較「任意の数値型変数1>=任意の数値型変数2または値」:これで「>=」の左辺の「任意の数値型変数1」が右辺の「任意の数値型変数2」または「値」以上か、という条件にできる
※以上以下の「<=」と「>=」の記号の順番は入れ替えちゃダメ(別の意味になっちゃうのでエラーが出る)
また、↑の比較の書き方で作った条件を複数合わせて、AND条件(全部の条件満たさないとダメ)やOR条件(どれかの条件満たしてればOK)もできます。
AND条件「任意の比較1&&任意の比較2」:これで「任意の比較1という条件」と「任意の比較2という条件」を両方満たしているか、という条件にできる。なお、さらに「&&」で比較を繋いでいくことで、より複数の条件を満たしているか、という条件を作れるが読みにくくなる点に注意。
OR条件「任意の比較1||任意の比較2」:これで「任意の比較1という条件」と「任意の比較2という条件」のどちらか一方でも満たしているか、という条件にできる。AND条件と同じく更に「||」で比較を繋いでいくことで、より複数の条件の中のどれか一つを満たしているか、という条件を作れるがやっぱり読みにくくなる点に注意。
また、AND条件とOR条件の併用もできますが、これには「()」での条件のグルーピングが必要で、注意が必要です。
AND条件にOR条件を付加する「(任意の比較1&&任意の比較2)||任意の比較3」:この場合、「任意の比較1」と「任意の比較2」の双方を満たしているか、「任意の比較3」を満たしているかの条件になります。
OR条件にAND条件を付加する「(任意の比較1||任意の比較2)&&任意の比較3」:この場合、「任意の比較1」と「任意の比較2」のどちらかを満たしている上で「任意の比較3」を満たしているかの条件になります。
⑤if文(ティラノだとifタグ)
基本の条件分岐。条件に合致する/しないの二択。
④で説明した比較の書き方で条件を指定する。
JavaScriptのif文は以下の通り
if(比較での条件){
条件に一致した時の処理を書く
}else{
条件に一致しなかった時の処理を書く
}
ティラノのifタグが
[if exp="比較での条件"]
条件に一致した時の処理を書く
[else]
条件に一致しなかった時の処理を書く
[endif]
なのでとても似てますね。
なお、条件に一致しなかった時の処理が不要であれば、
if(比較での条件){
条件に一致した時の処理を書く
}
ティラノのifタグだと
[if exp="比較での条件"]
条件に一致した時の処理を書く
[endif]
こんな感じに書けます。
⑥配列
変数の一種だが、一つの変数の中に複数の部屋があるもの。変数の長屋。
部屋番号は0から始まり、「配列変数[部屋番号]」で中身の値をチェックできます。この部屋番号は数値型です。なお、この部屋番号のことをインデックスと呼ぶ。
ティラノはJavascriptベースなので一つの配列の各部屋にどんな型の値が入っても問題はありません(プログラミング言語によっては配列内の型を統一しなければならない縛りがある)
なお、配列の中に配列を入れることも可能なので(いわゆる多重配列)、長屋から変数のマンションにすることも可能だし(この場合「配列変数[外側配列の部屋番号][内側の部屋番号]」で値のチェックが可能)、団地にもできる(「配列変数[外側配列の部屋番号][内側の部屋番号][さらに内側の部屋番号]」)
いくらでも配列の中に配列を入れることは可能だが、その分管理が大変になるので、慣れるまではせいぜい二重構造(要はExcelみたいな縦軸横軸の表になる)に留めておいた方が良いです(ループと配列処理の申し子(弊社比)より)
作成方法としては以下の書き方。
ちなみに配列は英語でarrayなので、よく解説サイトの見本コードでは変数名がarrとかになってたりする。
//1.とりあえず部屋数上限決めないで配列作ってから後から中身を追加する
//var test=new Array();という書き方でも上限決めない空の配列は作れる
//とりあえず空でもいいからこいつは配列ねってしないで配列として追加しようとするとエラー吐く
var test=[];
test[0]=1;
test[1]=2;
//2.部屋数上限決めて部屋だけ作る
//これで3部屋(インデックスは0、1、2)持った配列が爆誕する
var test2=new Array(3);
//3.部屋数上限決めて初期値も入れてつくる
//これはvar test3=["A","B","C","D"];も同じ動きする
var test3=new Array("A","B","C","D");
//-----ここまでJavaScript-----------------------------------------------------
//ティラノで使う場合、[iscript]~[endscript]=ビルダーのJavaScriptコンポーネント内で
f.test=[];
//とか、[eval exp="f.test=[]"]とかで1のパターンができます。
⑦JSON
JSONはJavaScript上のオブジェクト型と同形式でデータをまとめたもの……というとわからないのは承知済み。
もっと簡単に言うと、配列と同様、変数の長屋ではあるけれど、配列の数値でしかないインデックスと異なり、部屋には任意の文字列の名前(キーと呼ぶ)を付けられます(別のプログラミング言語では同様の構造のものを「連想配列」と呼ぶ)
もちろん多重構造にもできるし、これを配列の部屋に入れることもできる(ただこれは慣れてからのがイイ)
JSONの変数を作る時や値を見に行く時は以下のようになります。
//1.空のJSON作って後から入れるパターン
//(最初にJSONってしとかないで追加するとエラーで怒られる)
var test={};
//対象の変数名の後ろにピリオド打ってから部屋の名前直書きでJSONの中身の作成・値へのアクセスが可
test.test_room1=1;
//配列みたいに[]で指定することも可能だけどこの場合は[]内部の部屋名を文字列にする必要がある
test["test_room2"]=2;
//2.中身もいっぺんに作っちゃうパターン
//部屋名:部屋に入れる値でワンセットかつ繰り返す時にはこのワンセットの間に「,」が必要なので注意
var test2={
test_room1:1
,test_room2:2
};
//-----ここまでJavaScript-----------------------------------------------------
//ティラノで使う場合、[iscript]~[endscript]=ビルダーのJavaScriptコンポーネント内で
f.test={};
//とか、[eval exp="f.test={}"]とかで1のパターンができます。
//したらば、[eval exp="f.test.test_room1=1"]とかで1のパターンの値代入ができます。
ちなみに気付いた人は気づいたかもしれないが、ティラノの変数の外側部分(f、tf、sf)はそもそもとしてこのJSON形式として宣言されており、そこに開発者が変数としてキーと値を足してくって構造になってます(さっき言ってた後でわかるかも、コレ)
⑧ループ
プログラミング基本項目の中でも、ティラノでできなくて、JavaScriptのみでできる数少ないもの。
⑥で説明した配列や⑦で説明したJSONと組み合わせて使うfor系が一番日の目を見ることが多い。
系って言う通り次の種類がある。
基本のfor文:for(var 任意のカウント用変数名=開始の値;ループを続ける条件(大体カウント用変数見る);1周後のカウント変数どう扱うか){繰り返したい処理;}って書く。基本形。
for in文:for(var 任意の変数名 in 配列またはJSON変数){繰り返したい処理;}って書く。inの前の任意の変数に繰り返し中の配列のインデックスまたはJSONのキーが入る。
for of文:for(var 任意の変数名 of 配列またはJSON変数){繰り返したい処理;}って書く。for inと似てるけど違うのは、ofの前の任意の変数に繰り返し中の配列の部屋またはJSONの部屋そのままが入る。
//基本のforの例
var test=["A","B","C","D","E"];
//カウント用変数は大体i("i"ndex)を使うことが多い
//ループ条件はtest.length(配列変数.lengthでその配列の部屋数が取れる)未満の間
//(配列は0始まりなのでtestの部屋数は5だが、インデックスの最大値は4)
//i++で一周ごとに1加算
for(var i=0;i<test.length;i++){
//デベロッパーツールのコンソールに配列の内容を出す(console.log(出力したい内容);)
console.log(test[i]);
}
//for inの例
//for inだとi("i"ndex)かk("k"ey)とすることが多い
//自動的にinの後ろの変数の配列ないしJSONを全部ループしてくれる
for(var i in test){
//デベロッパーツールのコンソールにiと配列の内容を出す(console.log(出力したい内容);)
console.log(i);
console.log(test[i]);
}
//for ofの例
//for ofだと配列/JSONにかかわらず、i("i"tem)とすることが多い
//自動的にofの後ろの変数の配列ないしJSONを全部ループしてくれる
for(var i of test){
//デベロッパーツールのコンソールにi=配列の内容を出す(console.log(出力したい内容);)
console.log(i);
}
使い方としてはこんな感じになる。
もちろん、ループの中でループも可能です。こういう時、内部のループの変数は、なぜか外側のループの変数の次のアルファベットが使われることが多い(外側がiなら内側jみたいな)
使いこなせたら初心者からはレベルアップできる反面、ティラノで使いこなすのは少々骨が折れる(ティラノ純正処理としてループがなく、[iscript]~[endscript]=ビルダーのJavaScriptコンポーネント内でしか使えない=ティラノ側に処理させるためにはJavaScriptからティラノタグ呼び出すみたいなことをする必要がある)ので、自分の費やす労力のバランスを取ろう。
⑨関数
通常、プログラムはメインの処理が進行する本処理とこの関数からなることが多いです。
ティラノ的にはシナリオの中のラベルと[s]で終わるのが本処理系で、サブルーチンとマクロがこの関数とほぼ同義で……いいんじゃないかな?
という説明をするとティラノ公式読み込んだ方は「なるほどねー」してくれるかもしれません。
だが、ここで説明やめないよ?
この関数、自分で作る場合は、そもそもの本処理内で繰り返し行う処理や、煩雑過ぎる部分を抜き出して、本処理に対する下請け工場みたいな感じで分離させたものです。
それこそティラノのマクロやサブルーチンはこっちと近い。
自分で作る、という風に言ったということは、自分で作らない、つまりそのプログラミング言語で最初から用意されてる関数を使う、という場合も普通にあります。
これはティラノだと公式タグ使う感覚。
さて、ティラノのタグやマクロだと、タグによってはどういう処理してほしいか、でいろいろパラメーターを渡しますね。
関数もそういう風に処理に必要なもの(変数越しだったりダイレクトだったり)を渡せます。
この渡すものを通常、引数と呼びます。ただ英語だとparameter(パラメーター)やargument(アーギュメント)なんやね(ここちょっと使い分けがある。エラーメッセージでよく出るのはargumentの方なのでエラーメッセージにargumentって出てたら、引数関係がおかしいって言われてる)
とはいえ、「なんかJavascript調べなあかん」となった時に関数が関係したら、大体の日本語の解説は引数って書いてるので頭の片隅に入れときましょう。
で、この引数は下請け工場である関数くん側で定義してるので、下請け工場内の規格と合ってない=型が関数側の想定と合わないとエラーが出たりします(それこそargument云々って出る)。これは大いに注意。
そして関数くんによってはそもそも何も渡さなくていい場合もあります。
さらに関数は下請け工場なので、加工が終わったものを上納してくれるパターンもあります。
この上納されるものは戻り値や返り値と呼ばれます。
これはティラノではできない(サブルーチンやマクロの中でティラノ用の変数に仕込んで引き渡すしかない……その値をどう使うかによってtf一時変数、fセーブ単位変数、sfシステム変数のどこに格納するか選んでください)
さて、先にオブジェクトと変数と型の話をしましたね。
そして、これまでに何度か、「ティラノのベースはJavascript」と言いました。
なんと、Javascriptは変数の型がオブジェクトとして機能して変数からその型に関する関数を呼び出せます(まあオブジェクト指向言語あるあるなので他のプログラミング言語でもあるんだけど)
……なお、何言ってるかわからんってなった人は正解。
もっと簡単に言うなら、JavaScriptくんの変数は自分の中身の種類によって、その内容をイイ感じに扱うための関数を事前に用意してくれてます。
使い勝手が良いところでいくと、数値型変数にはtoString(他の型にもある場合はある)っていう「内容を自動的に文字列化しますよ」って関数が引っ付いてたりする。
なお、これの使い方はこう↓
let test = 123;
let test2 = test.toString();
//↑toStrin()gは「.」の前の変数を自動的に引数としてくれるので引数指定なし
//これによってtest2にはtestの数値型123から文字列化された123が入る。testの方は数値型のまま
//ティラノでも[iscript]~[endscript]=ビルダーだとJavaScriptコンポーネントの中で使えます
f.test=123;
f.test2=f.test.toString();
⑩syntax error
突然の英語にビビった人、戻ってきてご着席ください。
なぜなら、「syntax error」という文字列を今後アナタは何度も見ることになるでしょうから。
これは「構文ミスエラー」ってやつです。
大体これと共に「unexpected (何かの文字)」ってエラーメッセージ(ごくまれにちょっと違う)が出ます。
簡単に言うと、「JavaScriptの構文として読み解けへんのやけど!」って機械側が文句つけてきてます。
まあ、この場合、機械が正しいので文句の原因を直す必要があります。
これの原因は大体ケアレスミス。慣れても減らないケアレスミス(私も上司もどかどかやるし、やりまくるので慣れました)
というのも、今までJavaScriptのコードの見本をちょいちょい書きましたね?
で、大体一行の処理末尾って「;」か「{」か「}」で終わります。
これらが欠けると、このエラーが起きます。
純粋にif文の条件書く「()」も複合条件とかした時に、開始と終了の整合性取れてなかったり、文字列の開始の「"」や「'」の整合性が取れてない時にも出ます。
そんな感じで出る率が高い&ケアレスミスなので慣れてないと気が付きにくいです。
なので、このエラーが出た時はJavaScript部分の一行ごとの末尾や、ifやemb、evalなどのexpやcondに埋め込んだ処理のクォーテーションの状態などを確認しましょう。
⑪コメントアウト
コメントアウト、とはプログラムに影響しないメモ書きを残したり、既存処理をいったん実行時に影響をさせないように「コメント」という形にすることを言います。
ティラノでは、ティラノスクリプトとしての範囲は「;」をつけるとその行のそこから後ろは全部コメント化されます。
JavaScriptは「//」をつけると、その行のそこから後ろは全部コメント化されます。
ここまでで書いてるJavaScriptのコードの日本語のところ、全部頭に//ついてるのはコピペしても問題ないようにコメントアウトしてるわけです。
ティラノの[iscript]~[endscript]=ビルダーのJavaScriptコンポーネント内では「;」の方は効かないので、「//」を使いましょう。
なお、コメントアウトは処理の説明を入れられるだけでなく、エラーの調査にも使えます。
たとえば、エラーが出ている処理をいったんコメントアウトして、()等の整合性を考えながら、コメントアウトを少しずつ解除していくことで、どこでエラーが起きてるか、探ることが可能なのです。
地道? 地道にやらんとならんのだ、こればっかりは……(ごくまれに予想外のところに潜んでたりするぞエラーの原因)
あと、慣れない内のケアレスミスでの構文ミスは気づきにくいので、これで該当行に見当つけてから探す方が楽。
⑫インデントとネスト
ここまで書いてきた見本JavaScript・見本ティラノの中で、ifやループの範囲の処理の行頭、私、字下げしてましたよね?
これはコードを読みやすくする工夫、です。
一つのかたまりにつき、どれだけ字下げするか、は人によって異なりますが……JavaScriptなら大体半角スペース×2か×4、あるいはタブ1つ……かな。
こういう字下げをインデントと呼びます。
ティラノでもifタグなら私はインデント入れる。
そして、そうして字下げする部分をネストと言います(本来的にはネストだからインデントするんだけど、この説明なら逆の方がわかりやすいなって)
ちなみに可読性(ソースの読みやすさ)という観点からはこのネスト=インデントはあんまり深くしない方が良い、と一般的に言われます。
ようは、調子こいてifの中にifを大量に書いたり、ループの中にループ入れまくるんじゃねえ、って話。
ティラノのifタグはそんな使い方したらバリクソ重くなるので、そもそもそこまでできないと思いますが……
ただ、ソースの読みやすさの保持については未来の自分が楽できるので、心がけるようにしましょう。
3.こんなもんじゃろか
とりあえずこんなもんじゃろか。
⑪のコメントアウトテクは整合性取りながら解除はif文が深いと難しかったりします。
なので⑫のネスト深くすんなやの話、は心がけましょう。
まあ、個人開発の場合、未来の自分が過去の自分に対して殺意湧かすだけにはなる……つまりお仕事とかだと過去にソレを組んだ人に対してだな……