こんにちは!はこです。
AutoLISPを独学で覚えて、5年以上業務で使用しています。
「関数って何?」
「AutoLISPではどうやって関数を定義するの?」
こんな疑問をお持ちのAutoCADユーザーに向けて、AutoLISPの関数について解説していきます。
プログラミングにおいて、無くてはならない存在である関数の使い方が理解できるようになるのでぜひご覧ください。
プログラミングの必需品!AutoLISPの関数ついて解説
関数とは
関数とはあるデータを受け取り、決められた処理を行って、その結果を返す命令のことです。
関数の名前を「関数名」、受け取るデータを「引数」、処理が完了して返ってくる結果を「返り値」と呼びます。
関数を実行するには関数名と引数が必要になり、次のように記述します。
(関数名 引数1 引数2 …)
関数によっては引数を必要としないものあります。
また、関数には「標準関数」と「ユーザー定義関数」の2種類が存在します。
標準関数とは
変数にデータを代入する関数「setq」、リストを作成する関数「list」などあらかじめAutoLISPに用意されている関数を「標準関数」と呼びます。
簡単な処理をするものから複雑な処理をするものまで、さまざま関数が用意されています。
基本的にVisual Stdio Codeなどのエディタで記述するとき、青字になるものが標準関数です。
ユーザー定義関数とは
標準関数を組み合わせて、独自の関数を作ることを「関数定義」といいます。
また、ユーザーが独自に作った関数を「ユーザー定義関数」と呼びます。
関数定義をするには「defun」という標準関数を使い、次のように記述します。
(defun 定義関数名
(引数1 引数2 ・・・ / ローカル変数1 ローカル変数2 ・・・)
)
別の関数から受け取ったデータが設定した引数に代入され、定義関数内で使えます。
また、引数の後ろに記述した、「/」以降の変数は「ローカル変数」として定義されます。
ローカル変数とグローバル変数
ローカル変数とは定義された関数内でのみ使える変数のことです。
定義された関数の外では初期化されます。
また、別の関数内で同名のローカル変数が定義されていても別の変数として扱われるので、データが重複することはありません。
(defun test1 (/ a)
(setq a 10)
)
(defun test2 (/ a)
(print a)
)
上の例では、2つの関数内で同名のローカル変数aが定義されています。
関数test1では変数aに10を代入、関数test2では変数aのデータが表示されます。
test1→test2の順で実行すると、test2の変数aは中身が空なのでnilが表示されることになります。

ちなみに、「print」は変数の中身を表示する関数です。
これに対して、グローバル変数とはすべての関数でデータが共有される変数です。
AutoLISPではローカル変数以外の変数をグローバル変数として扱います。
また、図面ファイルを閉じないかぎりグローバル変数のデータは保持されるので注意してください。
関数の返り値
他のプログラミング言語では返り値を返すため、何かしらの処理が必要になります。
AutoLISPの場合は関数内で最後に評価されたデータが自動的に返り値となるので、特別な処理は不要です。
(defun test (/ a)
(setq a 15)
)
上の例では、関数testを実行したときの返り値は整数15となります。
関数定義の方法4種
一部、先に説明したところもありますが、関数定義には次の4種の書式があります。
引数なし、ローカル変数定義なしの場合
別の関数からデータを受け取らず、ローカル変数も使わないときには次の記述をします。
(defun 定義関数名 ()
)
引数なし、ローカル変数定義ありの場合
別の関数からデータを受け取らないが、ローカル変数は使う場合は次の記述をします。
(defun 定義関数名
(/ ローカル変数1 ローカル変数2 ・・・)
)
引数あり、ローカル変数定義なしの場合
別の関数からデータを受け取るが、ローカル変数は使わない場合は次の記述をします。
(defun 定義関数名
(引数1 引数2 ・・・)
)
引数あり、ローカル変数定義ありの場合
別の関数からデータを受け取り、ローカル変数も使う場合の記述は次の通りです。
(defun 定義関数名
(引数1 引数2 ・・・/ ローカル変数1 ローカル変数2 ・・・)
)
ユーザー定義関数のコマンド化
定義関数名の先頭に「c:」を付けるとユーザー定義関数がコマンド化されます。
そのため、AutoCADのコマンドラインに関数名を入力するだけでその関数を実行可能です。
下の例では「test」と入力するとコマンドラインに「hako」と表示されます。
(defun c:test ()
(print "hako")
)

Cドライブの「c:」とは関係ありません。
コメントアウト
プログラムの式が何十行、何百行と増えてくると、どこでどんな処理をしているか分かりづらくなってしまいます。
そのため、プログラムの途中で処理の説明を記述する必要があります。
AutoLISPではセミコロン「;」以降がコメントアウトされて、処理の説明文を記述することができます。
コメントアウトされたところはプログラムの処理上、無視されます。
(defun test (/ a)
;変数aに10を代入する
(setq a 10)
)
まとめ
今回の記事の内容をまとめます。
- 関数とは
・あるデータを受け取り決められた処理を行って、その結果を返す命令のこと
・引数:受け取るデータ
・返り値:処理の結果 - 標準関数とは
・あらかじめAutoLISPに用意されている関数 - ユーザー定義関数とは
・標準関数を組み合わせてユーザーが独自に定義した関数
・関数「defun」で定義する - ローカル変数とグローバル変数
・ローカル変数:定義した関数内でのみ使える変数
・グローバル変数:すべての関数で使える変数 - 関数の返り値
・関数内で最後に評価されたデータが返り値となる - ユーザー定義関数のコマンド化
・関数名の先頭に「c:」を付ける - コメントアウト
・「;」以降はコメントアウトされる