+CADLabo.comCAD / LISP / AUTOMATION
AutoLISP初心者講座

ローカル変数とグローバル変数を使い分ける

AutoLISPの基本・図形操作のTips一覧
要点

defunのスラッシュ以降に変数を宣言すると、実行中だけ使うローカル変数になります。関数の前後で値を比べ、外側の変数との関係を確認します。

始める前に

先に確認すると読み進めやすい記事:

確認の手順

  1. 掲載例のtestglobalとtestlocalを読み込みます。
  2. testglobalを実行した後、!aで外側の値を確認します。
  3. testlocalを実行し、関数内で表示される値を確認します。
  4. もう一度!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実機検証は未実施です。図形を変更する例は、コピーした図面で結果を確認してください。