.. _basic-scope--lesson-label: ===================== 変数のスコープの基本 ===================== このレッスンは約10分で完了します。 解説 ########### 他の言語のように、M言語は変数のスコープにとても特殊な定義があります。 これは、2つの主要な側面を含みます。 * コマンドのラインスコープ * 変数の `ダイナミック スコープ`_ ラインスコープ ############### M言語は、純粋な `命令型言語`_ です。 C言語の式では: :: if(条件式) { コマンド1 コマンド2 コマンド3 } M言語で男で書かれたものは、次のようになります: :: if 条件式 スペース(space) コマンド1 コマンド2 コマンド3 エンドオブライン(EOL) M言語でのスコープは、スペースで始まり、EOLで終わります。 したがって、IFコマンドの前にM言語でのスペースと同等なものとして C言語の開始ブラケット "{" の1つの考え方があります、そのコマンドIFの本体の始まりをマークする意味です。 次に、1つは、M言語でEOLと同等な C言語の閉じ括弧 "}" と考えることができます。したがって、M言語の行末は、IFコマンドの一部として実行されるの本体の終わりを示します。 読みやすくために、しかし、IFの前でラインは、DOと "." 表記を使用によって、垂直フォームに折り畳むことができます。 "." インデントは、Python言語で行われているものに似ています。 :: if 条件 do . コマンド1 . コマンド2 . コマンド3 . command4 変数のスコープ ############## M言語内の変数は `ダイナミック スコープ`_ を持ちます。 実際にこれは、関数が、関数に入る前に定義された変数へのアクセスを有することを意味します。 たとえば、次のコードでは: :: triangle(x) ;; set sum=0 for do quit:x'>1 . set sum=sum+x . set x=x-1 quit sum main() ;; set sum=1500 set x=6 write sum,! set y=$$triangle(x) write sum,! write y,! quit "main" 関数内で定義されている変数 "sum" は、"triangle" 関数の内部コマンドを利用できます。したがって、triangle 関数内のSETコマンドは、 "main" 関数の "sum" 変数に影響を与えています。 ダイナミックスコープは、M言語のみの機能ではありません。これは、他のプログラミング言語では一般的です。特に:Javascript、Matlab、Per、Lisp、`Bash`_ など。 より制御された環境を作成するには、変数のローカルスコープを指定するために、NEWコマンドを使用することがM言語プログラミングでは一般的です。修正された以下のコードでは: :: triangle(x) ;; new sum set sum=0 for do quit:x'>1 . set sum=sum+x . set x=x-1 quit sum main() ;; set sum=1500 set x=6 write sum,! set y=$$triangle(x) write sum,! write y,! quit 今、 "triangle" 関数で "new sum" を使用することは、明確に "sum" 変数がローカルスコープを持っているので、 "triangle" 関数内でそれに加えられた "SET"コマンドは、"main" 関数の中で存在していた "sum" 変数に影響を与えます。 ダイナミックスコープによる意図しない副作用を避けるために、 "NEW" コマンドを使用して、ローカル変数を宣言する習慣で開発することが推奨されます。 .. _命令型言語: http://en.wikipedia.org/wiki/Imperative_programming .. _ダイナミック スコープ: http://en.wikipedia.org/wiki/Scope_%28computer_science%29#Dynamic_scoping .. _Bash: http://wiki.bash-hackers.org/commands/builtin/unset