変数について・関数【setq】
AutoLISPコードを書く上で変数の取り扱いを理解することは必須です。この記事では変数とはどういうものか、変数の値をどのように操作できるかを見ていきます。
目次
変数とは
プログラミングにおける変数とは、データを格納するメモリ上の位置に名前をつけたものです。
AutoLISPにおいても変数は文字列や数値、座標やオブジェクト名など様々なデータを格納できます。
ユーザー入力した値やオブジェクトを取扱うために変数に格納したり、変数データを操作して条件分岐式と組み合わせたりと、使用する頻度はとても多いです。
関数【setq】について
setqは変数に値を割り当てるための関数です。
(setq 変数名 値)
変数を扱う上で一番基本的な形です。オリジナルの変数名を入力し、そこに数値や文字列などの値を代入します。
コード内で初めてこの変数を使用する場合も、2回目以降変数に値を代入する場合も同じようにこの形で記入します。変数に値を代入する際に、すでに値が入っている場合は、自動的に初期化して上書きされます。
例
(setq hensu 10)
この例では変数「hensu」に整数「10」を代入しています。
・複数の変数の割り当て
setq関数は複数の変数と値のペアを同時に扱うこともできます。
例
(setq hensu1 10 hensu2 100 hensu3 1000)
この例では「hensu1」に整数「10」を代入し「hensu2」に整数「100」を代入し、「hensu3」に整数「1000」を代入しています。このようにsetq関数は複数の変数を同時に操作できます。
変数の使い方
・変数の宣言
変数の宣言とは、プログラム内で変数を使用する際にその変数の名前を定義するプロセスをいいます。変数の宣言によりプログラムがその変数の存在と構造を認識し、メモリ内で適切な領域を確保することができます。
AutoLISPでは、基本的に変数を宣言するプロセスを単独で行う必要はありません。
setq関数では変数に値を割り当てることができ、その際に変数の宣言と初期化が同時に行われます。
・defunの引数としての変数の宣言
ただし、defun・defun Cの引数として変数の宣言を行うことができます。
例 (defun kansu (hensu1 hensu2))
(関数呼び出し時)
(kansu 10 100)
この例では「kansu」という名前で独自の関数を定義しており、引数として「hensu1」と「hensu2」を指定しています。
(kansu 10 100)の形でkansuの関数を呼び出して引数として10と100を記入することで、hensu1に「10」、hensu2に「100」の整数が割り当てられます。
・変数の名前のつけ方
変数の名前をつける上での注意点を以下に記載します。
1.アルファベットと数字を使用する
変数名はアルファベットの文字(大文字・小文字)と数字を組み合わせて作成することができます。
ただし、変数名の最初の文字はアルファベットに限られ、数字から始まる変数名は使用することができません。
2.使用できる記号は一部
一部の特殊文字や記号は変数名に使用できません。例えば「-」(ハイフン)は使用できず、「_」(アンダーバー)は使用できるためこちらを使用してください。
3.変数名のわかりやすさを意識する
変数名はどのような用途で使用する変数か、わかりやすいような名前にしてください。特に長いコード内で、この部分が何について書いているのかわかりやすくなります。
また、名前のつけ方に規則性をもたせることでもコードが読みやすくなります。
・変数の値の種類
変数に格納される値の種類と記述方法は、大まかには以下の3種類です。
1.数値変数
「10」や「20.1」のように整数や実数の数値を格納することができます。
例 (setq hensu1 10 hensu2 20.1)
「hensu1」に整数「10」を割り当て「hensu2」に実数「20.1」を割り当てています。
2.文字列変数
"文字列"や"文章も格納できます"などの文字列を格納することができます。文字列として変数を格納するためには「""」(ダブルクォーテーション)で文字列を囲います。
例 (setq hensu1 "文字列" hensu2 "文章も格納できます" hensu3 "10")
「hensu1」に文字列の"文字列"を割り当て「hensu2」に文字列の"文章も格納できます"を割り当て、「hensu3」に文字列の"10"を割り当てています。
「hensu3」に格納した"10"は数値ですが「""」で囲んでいるため文字列として格納されています。数値データとしての意味はなくなってしまっているため、この"10"を利用して計算などを行うことはできません。
3.リスト変数
変数は複数の値をリストとして格納できます。リスト関数を作成するにはlist関数を用いるか「'」(アポストロフィ)を用います。
例 (setq
list1 (list 1 2 3 "文字列"))
(setq
list1 '(1 2 3 "文字列"))
例の2文は同じリスト変数「list1」を作成しています。「1」「2」「3」は数値として、"文字列"は文字列として「1 2 3 "文字列"」のリストを作成しています。このように数値と文字列を混合してリストにすることもできます。
・グローバル変数とローカル変数
グローバル変数とは、プログラムのどこからでもアクセスできる変数です。異なる関数からでもグローバル変数にアクセスできるため、異なる関数間でデータを共有する際に便利です。
変数をグローバル変数とするための特別な宣言はありません。setq関数などで変数に値を割り当てた時点で、その変数はグローバル変数となります。
グローバル変数の値は図面ファイルを閉じた時点でリセットされます。
グローバル変数は想定していない他の関数に影響を与える可能性があります。最小限にしておきましょう。
グローバル変数に対し、ローカル変数は特定の関数内でしかアクセスできない変数です。その関数の処理が終了した時点で初期化されます。
ローカル変数を使用することは、変数の影響範囲を想定し易い(その関数以外への影響を考慮する必要がない)・変数データを格納するメモリを節約できるなどの利点があります。
・ローカル変数の定義の仕方
ローカル変数は次のように定義します。
(defun C コマンド名 (/ 変数名1 変数名2 変数名3...))
defun・defun C関数を用いて、引数を入力する欄に「/ 」(スラッシュ・スペース)からはじめてローカル変数に定義したい変数名を入力していきます。
例 (defun C com (/ hensu1 hensu2 hensu3) (setq hensu1 10 hensu2 100 hensu3 1000)
以上のように記載することで、「hensu1」「hensu2」「hensu3」はローカル変数として定義され、このコマンドの処理が終了した時点で初期化されるため他の関数・コマンドからこの変数の値にアクセスすることはできません。
他の関数・コマンドからアクセスしたい特別な事情を除いて、出てきた変数を一括してローカル変数として宣言しておきましょう!
まとめ
・変数とはデータを格納するメモリ上の位置に名前をつけたもの
・(setq 変数名 値)を基本の形として変数の宣言・値の割り当てを行う
・特別な事情がない限りローカル変数の宣言を行っておく