Sponsored links

【AutoLISP 初めの一歩】ローカル変数の宣言

Sponsored links
初めの一歩
Sponsored links

ローカル変数を宣言すると、コマンド内の変数は、外の変数の影響を受けないし、外の変数に影響をしません。

Sponsored links

ローカル変数とは

(defun c:コマンド名 ( ) ……………………………… )

で、コマンド(関数)を作った時に、そのdefun で定義した範囲内でしか使わない変数のことです。

その逆で、ローカル変数を宣言をせずに、定義の範囲外でも使う変数をグローバル変数と言います。

ローカル変数を宣言するメリット

変数が定義した範囲以外の変数から影響を受けることも影響することもなくなります。

(setq …) で変数に情報を入れると、その情報はメモリに保存されています。
ローカル変数を使って、そのコマンド(関数)内でしか使わないとすると、コマンド(関数)終了後には情報が消えてメモリが空きます。(微々たるものですが)

ローカル変数を宣言する方法

(defun c:コマンド名 (  / ローカル変数) ………………………………. )

このように、コマンド(関数)名の横の( )内に /  を入れて、その後ろにコマンド(関数)内で使用した変数を、入れると、

この変数はローカル変数です!!

と宣言したことになります。

例えば

実際にローカル変数を宣言した場合としていないコマンドを見比べてみましょう。

ローカル変数を宣言した例

(setq Hensu "旧変数")

まずはsetq を使って、変数 Hensu に ”旧変数” という値を入れてください。
!Hensu で値を確かめてみてください。

無事、旧変数がHensu に入っていれば、コマンドラインにこのように出ます。

では、次にこのコマンドを読み込んでください。

(defun c:Hensu1 (/ Hensu)
  
  (princ "setqの前: ")
      (princ Hensu)
         (princ " / ")
 
  (setq Hensu "新変数")

  (princ "setqの後: ")
     (princ Hensu)
  
(princ))

このコマンド Hensu1 では、(defun c:Hensu1 (/ Hensu) このようにローカル変数を宣言しています。

まずHensuの値を表示して、Hensuに”新変数”という値を入れて、その後再びHensuの値を表示する。
というコマンドです。

では、Hensu1 実行してみてください。

setqの前: nil / setqの後: 新変数

と出てきます。

Hensu には、

“旧変数” という情報が入っていたにも関わらず、setq 前には空っぽを意味する nil が出てきました。そして、setqの後には、コマンド内でHensu に入れた “新変数” が表示されました。

そして、コマンド終了後、もう一度 Hensu の値を見てみましょう。

コマンド内でhensuに新変数と入れたのに情報が更新されていません。
コマンド実行前と同じ、旧変数が入っていますね。

このように、ローカル変数を宣言すると、同じ名前の変数でも、コマンド定義の範囲外には影響をされない、影響しないです。

ローカル変数を宣言しなかった場合

すでにHensuには 旧変数が入っている状態だと思いますが、もし入っていなければ、

(setq Hensu "旧変数")

で入れてください。

そして、先ほどのコマンドからローカル変数の宣言を取り外したコマンドHensu2 を読み込んでください。

(defun c:Hensu2 ()
  
  (princ "setqの前: ")
      (princ Hensu)
          (princ " / ")
 
  (setq Hensu "新変数")

  (princ "setqの後: ")
     (princ Hensu)
  
(princ))

setqの前: 旧変数 / setqの後: 新変数

と出てきます。

今回はローカル変数を宣言していないので、コマンド開始前にHensuに入っていた”旧変数”がsetq の前に表示され、setqの後には、コマンド内でHensu に入れた “新変数” が表示されました。

そして、コマンド終了後、もう一度 Hensu の値を見てみましょう。

Hensuが上書きされて新変数になっていますね

このように、ローカル変数を宣言しない場合、同じ名前の変数には、コマンド定義の範囲外からも影響をされ、影響します。

Jagaimo
Jagaimo

コマンド作成中は、変数名を変更したり変数にきちんと値が入ったかどうか確認することも多いから、コマンド作成終了後の最後の仕上げにローカル変数を宣言をするのがおススメです。

まとめ

  • ローカル変数は、defun でコマンド(関数)定義した範囲内でしか使わない変数。
  • グローバル変数は、その範囲以外でも使う変数
  • ローカル変数はコマンド終了後にその変数情報は消えるのでメモリを使わない利点もある。
  • (defun c:コマンド名 (  / ローカル変数) と宣言すれば、その変数はローカル変数になる。
  • コマンド作成が終わった後の最後の仕上げにローカル変数を宣言するのがおススメ

Comments