- 条件分岐を書けば書くほど、コードがぐちゃぐちゃに…
- andとor、何がどう違うのか毎回迷ってしまう
AutoLISPを使い始めた方なら、そんな悩みを一度は感じたことがあるのではないでしょうか。
条件分岐はプログラムの流れを決める大事な要素ですが、論理演算を正しく使えていないと、思った通りに動かない・読みにくい・直しにくいプログラムになってしまいがち。
私はAutoLISPを独学し、業務の自動化・効率化に役立つプログラムを5年以上作成しています。数行で書けるような簡単なプログラムから、1000行以上の少し複雑なプログラムまで様々なツールを作成してきました。
そもそもAutoLISPってなに?という方はこちらの記事をご覧ください。
>>AutoCADユーザー必見!【AutoLISPを覚えるべきメリット5選】デメリットも解説
当記事ではAutoLISPの論理演算の基本をわかりやすく解説します。各関数の特徴や使い方を丁寧に解説するので、初心者の方でも安心して読み進められます。
「分岐処理がなんとなく書ける」から、「自信を持って論理演算を使いこなせる」状態を目指して、一緒に理解を深めていきましょう。
あなたに代わってAutoLISPプログラムを作成します
AutoLISPで作業を自動化したいけど、プログラミングに詳しくないのでツールが作れずにお悩みの方へ。5年以上のAutoLISP経験を活かしてAutoCADを自動化するツールを作成します。既にお持ちのAutoLISPプログラム修正も対応可能です。
AutoCADの面倒くさい作業から解放されたい方は、下記リンク先の「ココナラ」からお気軽にご相談ください。
>>AutoCADが楽になるプログラムを作成します|ココナラ
最短2日で納品します
論理演算とは「いくつかの条件をまとめて判断するしくみ」

プログラムで処理をするとき、「この条件とこの条件、両方を満たしていたら実行したいな」と思う場面はよくあります。そんなときに使えるのが「論理演算」です。
論理演算とは条件が正しい(真)か正しくない(偽)か判定するしくみのこと。以下の3つの演算を組み合わせて様々な条件を判定できます。
- and
- 条件がすべて真のときだけ真と判定し、条件が1つでも偽なら偽と判定する演算。論理積とも呼ばれる。
- or
- 条件のいずれか1つが真のときに真と判定し、条件がすべて偽の場合だけ偽と判定する演算。論理和とも呼ばれる。
- not
- 条件が真のときは偽と判定し、偽の場合は真と判定する演算。論理否定とも呼ばれる。
AutoLISPの場合は条件が真なら「T(nil以外)」、偽なら「nil」という特別な値で判定します。真と判定するのはnil以外のときなので、条件の結果が数値や文字列でも真と判定されるところに注意してください。
また、AutoLISPには論理演算用の関数が用意されており、条件分岐の関数とセットでよく使われます。
AutoLISPの条件分岐関数については、こちらの記事で解説していますので参考にしてください。
>>【初心者向け】処理を自由に切り替えよう!条件分岐のAutoLISP関数2選

効率的なプログラムを作るためにも、論理演算は身につけておきたい基本のひとつです。
AutoLISPの論理演算関数3選|使いどころと注意点を解説

今回ご紹介する論理演算のAutoLISP関数は以下の3つです。
- and
- or
- not
それぞれの関数がどんな場面で役立つのか、そして使うときに気をつけたいポイントなどについてわかりやすく解説します。

プログラム例も紹介していきますので、ぜひ最後までご覧ください。
すべての条件が真か判定する関数「and」

andは与えられた条件(引数)がすべて真(nil以外)のときだけ、真と判定するAutoLISP関数です。すべての条件が満たされたときだけ処理を進めたいときに使えます。
andの動作を理解するうえで、覚えておきたい特徴は以下のとおり。
- すべての引数が真(nil以外)ならTを返す
- 引数は左から順番に判定される
- 引数のいずれか1つが偽(nil)の場合は、その時点でnilを返す
- 引数がない場合はTを返す
andは与えられた引数がすべて真(nil以外)だった場合にTを返します。「全部OKだったらOK」と判定すると思ってください。
(and T 10 "文字列") ; ⇒ T
引数は左から順番に判定していくので、引数の並べ方次第で判定タイミングを自由に設定できます。
(and A B C)

上記の例では、一番左の引数であるAから判定を行います。
もし、引数の中に1つでも偽(nil)が含まれていた場合、その時点でandはnilを返します。判定していない残りの引数は判定がスキップされるので注意してください。
(and T nil 10) ; ⇒ nil(2番目の引数が偽)

1つでも条件を満たさなければ、全体としては偽になります。
少し意外かもしれませんが、引数がない場合はTを返します。「何も条件がなければ、すべての条件が満たされている」と判定されるためです。
(and) ; ⇒ T
andの特徴を理解しておくことで、論理演算がよりスムーズに書けるようになります。慣れてきたら後述するorやnotと組み合わせて、複雑な条件もシンプルに整理していきましょう。
条件のいずれかに真があるか判定する関数「or」

orは与えられた条件(引数)のうち1つでも真(nil以外)なら、真と判定するAutoLISP関数です。たとえば「Aレイヤーが使われている」または「図形が選ばれている」など、どれか1つでも条件が満たされていれば処理を先に進めたいときに使えます。
orの基本を理解するために、覚えておきたいポイントは次の4つ。
- すべての引数が偽(nil)のときだけnilを返す
- 引数は左から順番に判定される
- 引数のいずれか1つが真(ni以外)の場合は、その時点でTを返す
- 引数がない場合はnilを返す
orは与えた引数がすべて偽(nil)だった場合だけ、nilを返します。
(or nil nil nil) ; ⇒ nil

どの条件も当てはまらなかったときだけ、偽と判定されます。
andと同様に、複数の引数がある場合は左から順番に判定していきます。引数のいずれか1つが真(ni以外)の場合はその時点でTを返すため、優先したい条件を先に書くといった工夫も可能。
(or A B C)

上記の例では、Aが真(nil以外)ならその時点で処理が止まり、BとCは判定されません。
また、何も引数を与えない場合は、判定するものがないため結果はnilになります。「どの条件も満たさない=すべて偽」とみなされるので、覚えておきましょう。
(or) ; ⇒ nil
orの仕組みがわかると、条件分岐をもっと自由にわかりやすく書けるようになります。シンプルな構文で複雑な判断ができるのも大きな魅力です。
真偽の判定を逆にする関数「not」

notは与えられた条件(引数)の真偽を逆に判定するAutoLISP関数です。ある条件が「正しくないとき(=偽)」にだけ処理を行いたい、という場面でよく使います。
notの基本的な特徴は次の3つ。
- 引数が真(nil以外)ならnilを返す
- 引数が偽(nil)の場合はTを返す
- 引数がない場合はエラーとなる
notに与えた引数が真(nil以外)ときは判定結果が偽となるので、nilを返します。
(not T) ; ⇒ nil
(not "test") ; ⇒ nil
引数が偽(nil)の場合は真と判定されるため、Tを返します。
(not nil) ; ⇒ T

引数がnilのときにTを返す性質は、値が空かどうかチェックしたいときに役立ちます。
notは前述したand、orとは異なり、引数を省略することができません。引数がない場合はエラーで処理が止まってしまうので注意してください。
(not) ; エラー: 引数の数が少なすぎます
notは「〜ではない」を表すシンプルな関数です。判定を反転させたいときや、値の有無をスッキリ確認したいときに便利なので、ぜひ活用してみてください。
AutoLISPの論理演算で「条件の見える化」をしよう

今回ご紹介した関数を以下にまとめます。
関数 | 内容 | 使用例 |
and | 引数がすべて真のときにTを返し、 引数が1つでも偽ならnilを返す | (and T 10 "文字列") ; ⇒ T (and T 10 nil) ; ⇒ nil |
or | 引数のいずれかが真のときにTを返し、 引数がすべて偽の場合だけnilを返す | (or 10 nil nil) ; ⇒ T (or nil nil nil) ; ⇒ nil |
not | 引数が真ならnilを返し、 引数が偽の場合はTを返す | (not nil) ; ⇒ T (not "test") ; ⇒ nil |
論理演算は条件をただ判定するだけでなく、プログラムの意図をはっきり見せるための大切な要素です。and・or・not を上手に使って、わかりやすく修正しやすいプログラムを目指しましょう。