ローカル変数とグローバル変数を使い分ける
defunのスラッシュ以降に変数を宣言すると、実行中だけ使うローカル変数になります。関数の前後で値を比べ、外側の変数との関係を確認します。
始める前に
先に確認すると読み進めやすい記事:
確認の手順
- 掲載例のtestglobalとtestlocalを読み込みます。
- testglobalを実行した後、!aで外側の値を確認します。
- testlocalを実行し、関数内で表示される値を確認します。
- もう一度!aを入力し、実行前の外側の値が保たれていることを確認します。
そもそも変数とは?
AutoLISPにおける変数は、データを一時的に保存する「箱」のようなものです。数値、文字列、座標リストなど、さまざまなデータを格納できます。(setq a 10) ; 変数aに10を代入
グローバル変数とは?
グローバル変数は、プログラムの外からでもアクセス可能な変数です。つまり、関数が終了した後も値が保持され、他の関数からも参照できます。
定義例:
(defun drawline () ; グローバル変数を使用 (setq pnt1 (getpoint "\n始点を指定: ")) (setq pnt2 (getpoint "\n終点を指定: ")) (command "line" pnt1 pnt2 "") )
この場合、pnt1とpnt2はグローバル変数となり、関数終了後も値が残ります。
メリット:
- 複数の関数間でデータを共有できる
- 状態保持が必要な処理に便利
デメリット:
- 予期せぬ値の上書きによるバグの原因になりやすい
- 名前の衝突リスクが高まる
ローカル変数とは?
ローカル変数は、関数の中だけで有効な変数です。関数内の一時的な値として扱われ、終了すると同じ名前の外側の変数は元の状態に戻ります。
定義例:
(defun drawline (/ pnt1 pnt2) ; ローカル変数を宣言 (setq pnt1 (getpoint "\n始点を指定: ")) (setq pnt2 (getpoint "\n終点を指定: ")) (command "line" pnt1 pnt2 "") )
スラッシュ / の後に並べた変数がローカルとして扱われます。
メリット:
- 他の関数との干渉を防げる
- 保守性・可読性が高まる
デメリット:
- 関数外で値を使いたい場合には不向き
実験してみよう!
AutoCADのコマンドラインで以下を試してみてください:(defun c:testglobal () (setq a 100) (princ "\nGlobal a = ") (princ a) ) (defun c:testlocal (/ a) (setq a 200) (princ "\nLocal a = ") (princ a) )
先に (c:testglobal) を実行すると、外側の a は100になります。続けて (c:testlocal) を実行した場合、関数内では200が表示されますが、終了後の !a は100のままです。ローカル変数の実行前にあった外側の値は保持されます。
使い分けの指針
| 用途 | 使う変数 |
|---|---|
| 計算・入力など、1回の処理だけで使う値 | ローカル変数 |
| 複数の処理で共有する設定 | 名前の衝突と上書きに注意してグローバル変数を使う |
| ユーザー入力の保持 | 処理中だけ必要ならローカル変数。次の処理まで保持する場合は保存先を決める |
| デバッグ・ログ | 必要な範囲を決め、通常はローカル変数を基本にする |
まとめ
AutoLISPでは、変数のスコープを意識することで、より安全で保守性の高いコードを書くことができます。特に複雑なスクリプトや複数関数を扱う場合、ローカル変数を基本とし、必要に応じてグローバル変数を使うのが鉄則です。
結果の確認
先にtestglobalでaを100にした場合、testlocalの終了後も外側のaは100です。ローカル変数を使っただけで、既存のグローバル変数が消えるわけではありません。
参照資料
対象環境・動作確認
AutoLISP対応環境(関数・OSごとの対応は要確認)。内容更新:2026年10月5日。掲載コードのCAD実機検証は未実施です。図形を変更する例は、コピーした図面で結果を確認してください。