2014年10月2日木曜日

Maxscript その14 「ブロック式 インデント」

「リファレンス>名前、リテラル定数、および式>単純式>ブロック式」

()を使う事で一連の式をグループ化して評価する事が出来るようだ。ブロック式単体では意味がない事が多いが、他の式と組み合わせて一度に複数の処理をさせるために頻繁に用いられる気がする。

エディターに以下の式を記述して評価。

(
    a = 10
  b = 20
  x = a + b
)

実行結果



ブロック式を使わない場合とリスナーへのアウトプットが異なる

a = 10
b = 20
x = a + b

結果

ブロック式ではブロック内で最後に評価された式が戻り値となるようだ

最後の式をただの値にすると、ブロック式の戻り値は最後の値となる
(
  a = 10
  b = 20
  x = 10 + b
  ok
)
--戻り値がOk値
(
  a = 10
  b = 20
  x = 10 + b
  true
)
--戻り値がBoolean値
(
  a = 10
  b = 20
  x = 10 + b
  x
)
--各式の戻り値の仕様が曖昧だったら変数をダイレクトに記述したり。

この考え方は関数を自分で作る際等にも需要なようだ。「maxscriptは式ベースの言語なので、全ての式は何かしらの答えを返す」という事をいつも頭の片隅に置いておきたい。

ブロック式を用いると、式1つ1つの評価がリスナーに出力されなくなるので、リスナーに情報を出力したい際はprintやformatを用いる。

(
  obj = $Sphere001
  print obj.pos
  format "radius = %\n" obj.radius
)

結果
上からprintの実行結果、formatの実行結果、ブロック式の実行結果となる。この場合のブロック式の戻り値は、最後に実行されるformatの戻り値であるokとなる。

ちなみにセミコロン「;」を使う事で区切りを持たせ、一行で記述する事も可能なようだ。
(obj = $Sphere001;print obj.pos;format "radius = %\n" obj.radius)


「ブロック式は戻り値が1つになる」ので関数に値を渡してあげる際などにも用いられる事もある。
<例>
obj = $Sphere001
format "obj\n%\n" ("name:" + obj.name)

※()を使わないとエラーとなる。
--------------------------------
式の階層構造

ブロック式はブロック式内で新たにブロック式を定義する事が出来るようだ。

(
  obj = $Sphere001
  (
  a = 5
  b = 30
  x = a *b
  print x
  )
  obj = $Sphere001
  print obj.pos
  format "radius = %\n" obj.radius
)

エディターの左側をよく見ると「-」のようなアイコンがあり、ここをクリックすると各ブロック式を畳んだり、開いたり出来る。


スクリプトの意味合いとしては次のようになるようだ。

maxscriptのいくつかの式は、このような階層構造のようなものを持っている。また、そのような構造は特別な意味合いも出てくるようだ。ここでは式の書き方について少し見てみようと思う。

インデントについて
検索「プログラム インデント」 or 「プログラム 字下げスタイル」

プログラムの多くの言語は、上記のような構造を明確にするためにインデント(字下げ)を揃えることが多いように思う。maxscriptでは「TAB」が多く使われる。(ちなみにTABはスペース4個分でもあるそうです)

複数行選択して「TAB」を押すことで、まとめてインデントを空けれる。逆に詰めたい時は「Shift + TAB」で出来るようだ。

maxscriptでは殆どの場合を除き、基本的には見た目が分かりやすくなる以上の意味はないようだが、分かりやすくする事で実際にコードを記述する際に物凄く効率があがる。ただ、エディターで記述する際は、だいたい自動で揃えてくれる。

分かりづらい

分かりやすい

分かりづらい

分かりやすい

このように、各ブロックの始まりと終わりを段落を揃えて明示的にしてあげるとよいらしい。

インデントの揃え方に明確なルールはないようで、行を変えて定義しても問題なく動作するようだ。

構造を明示的にする理由の1つとして、このような構造を持つ式を記述する際には「変数のスコープ」と言われる変数の有効範囲を分かりやすくする意味合いも強い気がする。特にmaxscriptでは、変数の定義が自動で行われ、この変数のスコープによるバグが起きやすい印象がある。特にその仕組みを理解しておきたい。という事で次回は「変数のスコープ」について。
----
tips:Pythonの構文はインデントで管理されており、少しでも間違うとエラーとなる。そのためか多くのプログラムにあるようなブロックがない。全てインデントで表現される。

0 件のコメント:

コメントを投稿