AutoLISP関数 関数解説

AutoLISPの比較演算関数を初心者向けに解説!使い方の基本をマスターしよう

comparison-operation_eyecatch
  • 条件の結果が自分のイメージとズレる
  • 「=」とequalの違いがいまいちピンとこない
  • リスト同士ってどうやって比べればいいんだろう?

AutoLISPで条件分岐を書くときに欠かせないのが「比較演算関数」です。「=」「/=」「<」「>=」といった関数は見た目がシンプルですが、正しく使い分けないと意図しない結果になることも。

私はAutoLISPを独学し、業務の自動化・効率化に役立つプログラムを5年以上作成しています。数行で書けるような簡単なプログラムから、1000行以上の少し複雑なプログラムまで様々なツールを作成してきました。

そもそもAutoLISPってなに?という方はこちらの記事をご覧ください。
>>AutoCADユーザー必見!【AutoLISPを覚えるべきメリット5選】デメリットも解説

当記事ではAutoLISPの比較演算関数について、それぞれの特徴や違いを初心者向けに解説します。使い方をしっかり理解すれば、プログラムがわかりやすくなり、エラーも減らせます。

比較演算を学びたい方や使いこなしたい方にとって、役立つ内容をまとめましたのでぜひ最後までお読みください。

あなたに代わってAutoLISPプログラムを作成します

AutoLISPで作業を自動化したいけど、プログラミングに詳しくないのでツールが作れずにお悩みの方へ。5年以上のAutoLISP経験を活かしてAutoCADを自動化するツールを作成します。既にお持ちのAutoLISPプログラム修正も対応可能です。

AutoCADの面倒くさい作業から解放されたい方は、下記リンク先の「ココナラ」からお気軽にご相談ください。
>>AutoCADが楽になるプログラムを作成します|ココナラ

比較演算とは2つの値を比べて判断する演算

comparison-operation_caption1

比較演算は2つの値や式を見比べて「同じか?」「どちらが大きいか?」などを判断するためのしくみです。条件が成り立てば「真(正しい)」、そうでなければ「偽(正しくない)」が返されます。

はこ
はこ

AutoLISPの場合、真は「T」、偽は「nil」という特別な値で表現します。

条件が成り立つかどうかの判断は、条件分岐や繰り返し処理などプログラムの流れをコントロールする際に欠かせません。

AutoLISPの条件分岐について知りたい方はこちらの記事をご覧ください。
>>【初心者向け】処理を自由に切り替えよう!条件分岐のAutoLISP関数2選

比較に使う記号は「比較演算子」と呼ばれ、主に以下のようなものがあります。

比較演算子意味
=2つの値が等しいときに真を返す
<左の値が右の値よりも小さいときに真を返す
>左の値が右の値よりも大きいときに真を返す
はこ
はこ

たとえば、a>bという式はaがbよりも大きい場合に真、そうでない場合に偽を返します。

比較演算を理解することは、プログラムに柔軟な判断力を持たせる第一歩となります。これからご紹介するAutoLISPの比較演算関数を通じて、実際の使い方を一緒に見ていきましょう。

条件分岐がもっとスムーズに!AutoLISPの比較演算関数7選

comparison-operation_caption2

今回ご紹介するAutoLISPの比較演算関数は以下の7つです。

  • =
  • /=
  • <
  • <=
  • >
  • >=
  • equal
はこ
はこ

1つずつ順番に解説していきます。

"等しい"を調べるならこれ!値が等しいか判定する関数「=」

comparison-operation_func1

「=」は与えた引数を比較して、数値的に等しいか判定するAutoLISP関数です。「=」を使いこなすために覚えておきたいポイントは次の4つ。

  • 与えた引数がすべて等しいときだけTを返し、1つでも等しくないときはnilを返す
  • 文字列の比較もできる
  • リストの比較はできない
  • 引数が1つだけのときはTを返す

「=」は引数として与えられたすべての値が等しいときにだけTを返します。1つでも違う値があれば、結果はnilになります。

(= 10 10 10) ; → T
(= 10 10 5) ; → nil
はこ
はこ

引数は2つだけでなく、一度に複数の値を比較できます。

「=」は数値だけでなく文字列の比較も可能。

(= "abc" "abc") ; → T
(= "abc" "ABC") ; → nil

引数が文字列の場合、アスキーコードで1文字ずつ比較されるので、大文字と小文字は区別されます。

アスキーコード(ASCIIコード)

ASCII(American Standard Code for Information Interchange)コードとは、数値・アルファベット・記号などを7ビットで表現した文字コードの一つ。10進数では各文字に0~127の文字コードが割り当てられている。
>>【情報基礎】ASCII(アスキー)コード 一覧表 | 電気設計人.com

また、「=」ではリストの比較はできないので注意してください。

(= (list 1 2 3) (list 1 2 3)) ; → nil
はこ
はこ

リストを比較したいときは、後述するequalを使うのがおすすめです。

ちなみに引数が1つだけのときはTを返します。

(= 1) ; → T
はこ
はこ

「等しい」という条件は破られていないので、判定は真(T)になります。

「=」は数値だけでなく文字列の比較にも使える便利な関数です。使いやすい反面、アスキーコードで判定される点や対応していない型があることには注意が必要。特徴を押さえて上手に使いましょう。

"等しくない"をさっと調べる便利な関数「/=」

comparison-operation_func2

「/=」は与えた引数を比較して、数値的に等しくないか判定するAutoLISP関数です。「/=」には次のような特徴があります。

  • 2つの連続する引数が等しくない場合はT、等しい場合はnilを返す
  • 同じ引数でも並び順によっては判定結果が変わる
  • 文字列の比較もできる
  • 引数が1つだけのときはTを返す

「/= 」は与えた引数を順番に比較して、連続する2つの引数が等しくない場合にTを返します。どれか1組でも等しいものがあると、結果はnilになります。

(/= 1 2 3) ; → T(すべて異なる)
(/= 1 2 2) ; → nil(2と2が等しい)
はこ
はこ

「=」と同様に複数の引数を与えることができます。

「/=」は一番左の引数から、となり同士を比較していくので、引数の並び順によっては判定結果が変わることも。たとえば、以下のように与える引数が同じでも、並び順によって結果が変わってしまう点に注意してください。

(/= 1 2 1) ; → T(となり同士は異なる値なので真と判定)
(/= 1 1 2) ; → nil(1がとなりに並んでいるので偽と判定)
はこ
はこ

引数全体ではなく、となり同士のペアで比較します。

また、文字列の比較にも対応しており、等しくない文字列が並んでいればTが返され、1つでも一致すればnilを返します。

(/= "abc" "def") ; → T
(/= "abc" "abc") ; → nil
はこ
はこ

アスキーコードで比較するので大文字小文字も区別されます。

「=」と同じように、引数が1つだけのときはTを返します。比較する相手がいない場合は、真と判定されるので覚えておきましょう。

(/= 100) ; → T

「/= 」は「値が異なるかどうか」をまとめて調べられる便利な関数です。数値や文字列にも対応しており、条件分岐に活用しやすいのが特徴。ただし、比較はとなり同士の引数で行われるため、仕組みを理解して使うことが大切です。

直感的に使える!値が小さいかを調べる関数「<」

comparison-operation_func3

「<」は左側の引数が右側の引数よりも数値的に小さいかを判定するAutoLISP関数です。「<」を使うときに重要となるポイントは以下の3つ。

  • 各引数がその右側の引数よりも数値的に小さい場合はT、異なる場合はnilを返す
  • 文字列の比較もできる
  • 引数が1つのときはTを返す

「<」は各引数がその右側の引数よりも小さいかどうかを順にチェックします。すべてのペアで「小さい」が成立すればTを返し、どこか1か所でも成り立たなければnilになります。

(< 1 2 3) ; → T(1 < 2 < 3)
(< 2 2 3) ; → nil(2 < 2 が成り立たない)
はこ
はこ

左から順に大きくなっていればTを返すと覚えてください。

「<」は文字列にも対応しており、アスキーコードの順序に従って比較が可能。

(< "apple" "banana") ; → T("a" < "b")
(< "abc" "ABC") ; → nil(大文字よりも小文字の方が数値的に大きい)

ちなみにアスキーコードの値は大文字よりも小文字の方が大きいです。上記のような場合、判定は偽(nil)となるので覚えておきましょう。

ただし、「<」で比較できるのは数値同士または文字列同士だけです。以下のように数値と文字列を一緒に与えるとエラーになるので注意してください。

(< 10 11 "a") ; → エラー: 比較に対する引数のタイプが間違っています: 11 "a"

「<」に1つだけ引数を与えた場合はTを返します。ほかの比較関数と同じように「比較対象がない=矛盾がない」とみなされるためです。

(< 10) ; → T

「<」は数値や文字列が順に小さいかどうかをまとめて調べられる便利な関数です。文字列にも使えることや、引数が1つでも使えるといった特徴を知っておくと、条件の書き方がぐっとスムーズになります。

小さいか同じかを判定するシンプルな関数「<=」

comparison-operation_func4

「<=」は左側の引数が右側の引数よりも数値的に小さいまたは等しいかを判定するAutoLISP関数です。「<=」の覚えておきたい特徴は次の3つ。

  • 各引数がその右側の引数よりも数値的に小さいまた等しい場合はT、異なる場合はnilを返す
  • 文字列の比較もできる
  • 引数が1つのときはTを返す

「<=」は各引数がその右側の引数以下(小さいまたは等しい)かどうかを、順番にチェックしていきます。すべてのペアで条件を満たしていればTを返し、ひとつでも違えばnilを返します。

(<= 1 2 2 3) ; → T(1 ≦ 2 ≦ 2 ≦ 3)
(<= 5 4 6) ; → nil(5 ≦ 4 が成り立たない)

「<」と同様に「<=」も文字列の比較に対応しており、アスキーコードの順序に従って比較が可能。

(<= "apple" "banana") ; → T("a" < "b")
(<= "abc" "ABC") ; → nil(大文字よりも小文字の方が数値的に大きい)
はこ
はこ

アスキーコードでは大文字と小文字が区別されているので、上記の例では偽(nil)と判定されます。

ちなみに引数がひとつだけの場合、比較相手がないため常にTを返します。

(<= 10) ; → T
はこ
はこ

「比較すべきものがない=矛盾がない」と見なされます。

「<=」は「小さい」だけでなく「等しい」場合も判定できる便利な関数です。数値や文字列をまとめて比べられるのが特長。細かな動きも知っておくと、条件分岐がよりスムーズに書けるようになります。

大きい値を見分ける基本の関数「>」

comparison-operation_func5

「>」は左側の引数が右側の引数よりも数値的に大きいかを判定するAutoLISP関数です。「>」を使うときに押さえておきたいポイントは以下の3つ。

  • 各引数がその右側の引数よりも数値的に大きい場合はT、異なる場合はnilを返す
  • 文字列の比較もできる
  • 引数が1つのときはTを返す

「>」は左から右へ順に、各引数が次の引数よりも大きいかどうかをチェックしていきます。すべての比較が成り立てばTを返し、ひとつでも条件に合わなければnilを返します。

(> 5 3 1) ; → T(5 > 3 > 1)
(> 5 3 3) ; → nil(3 > 3 が成り立たない)
はこ
はこ

左から順に小さくなっていればTを返すと覚えてください。

前述した比較関数と同様に、アスキーコードで文字列を比較することも可能。

(> "z" "a") ; → T("a"より"z"の方が数値的に大きい)
(> "abc" "ABC") ; → T(大文字よりも小文字の方が数値的に大きい)
はこ
はこ

大文字と小文字はアスキーコードが区別されているので注意してください。

引数が1つだけの場合は比較する相手がいないためTを返します。

(> 100) ; → T

「>」は数値や文字列が順に大きいかどうかをまとめて調べられる関数です。アスキーコードでの比較や、引数が1つのときの動きなども知っておくと、条件分岐を書くときに役立ちます。

"以上"を判定する便利な関数「>=」

comparison-operation_func6

「>=」は左側の引数が右側の引数よりも数値的に大きいまたは等しいかを判定するAutoLISP関数です。「>=」の特徴は以下のとおり。

  • 各引数がその右側の引数よりも数値的に大きいまた等しい場合はT、異なる場合はnilを返す
  • 文字列の比較もできる
  • 引数が1つのときはTを返す

「>=」は引数を左から順に比べていき、それぞれの値が次の値以上大きいまたは等しいかどうかをチェックします。すべての比較で条件を満たしていればTを返し、ひとつでも成り立たないとnilを返します。

(>= 5 4 4 3) ; → T(5 ≧ 4 ≧ 4 ≧ 3)
(>= 5 6 4) ; → nil(5 ≧ 6 が成り立たない)
はこ
はこ

複数の引数をまとめて比較することもできます。

ほかの比較関数と同じように、「>=」は数値だけでなく文字列同士の比較にも対応。

(>= "zebra" "apple") ; → T("z" > "a")
(>= "cat" "cat") ; → T(等しい)
(>= "abc" "ABC") ; → T(大文字よりも小文字の方が数値的に大きい)
はこ
はこ

文字列の比較はアスキーコードで行います。

「>=」に引数を1つだけ渡した場合、比較する相手がいないためTを返します。

(>= 100) ; → T

「>=」は数値や文字列が「以上かどうか」をまとめて調べられる便利な関数です。特徴を知っておくことで、条件分岐もよりスッキリ書けるようになります。

誤差があってもOK!ゆるめの"等しい"をチェックする関数「equal」

comparison-operation_func7

equalは誤差を考慮して値が等しいか判定するAutoLISP関数です。equalの基本的な特徴は以下の4つ。

  • 比較する引数が数値的に等しければTを返し、等しくなければnilを返す
  • 数値と文字列だけでなくリストの比較もできる
  • 誤差を考慮して比較できる
  • 比較できる引数は2つのみ

equalは比較する引数が数値的に等しければTを返し、等しくなければnilを返します。前述したほかの比較関数では数値と文字列しか比較できませんが、equalは数値と文字列だけでなくリストの比較もできます。

;; 数値の比較
(equal 10 10) ; → T(同じなので真)
(equal 10 20) ; → nil(異なるので偽)

;; 文字列の比較
(equal "Hello" "Hello") ; → T
(equal "Hello" "HELLO") ; → nil(大文字小文字も区別される)

;; リストの比較
(equal (list 1 2 3) (list 1 2 3)) ; → T(要素がすべて一致)
(equal (list 1 2 3) (list 3 2 1)) ; → nil(順番が違うので偽)
はこ
はこ

equalはデータの「中身」が同じかどうかを見ているので、リストもひとつひとつの要素まで比べてくれます。

equalは誤差を考慮した値の比較が可能。たとえば、10.0と10.1を比較するときに精度として0.1を与えると、2つの値は等しいと判定されます。

(equal 10.0 10.1 0.1) ; → T
はこ
はこ

図面上から取得した座標や寸法には微妙に誤差が含まれていることもあるので、「だいたい同じ」を判定してくれるequalはとても実用的です。

ただし、equalは「=」のように3つ以上の値を比較することができません。3つ以上の値を比較したいときはandを使って、2つずつ値を比較しましょう。

(and (equal 5 5) (equal 5 5)) ; → T

andはすべての条件を満たすときにTを返すAutoLISP関数です。詳しく知りたい方はこちらの記事をご覧ください。
>>「and」「or」「not」を使いこなそう!AutoLISPの論理演算入門

equalは数値・文字・リストを比べられる便利な関数です。誤差も考慮してくれるので、図面上の微妙な違いにも対応できます。2つの値しか比べられない点だけ注意しつつ、実践でもどんどん使ってみてください。

AutoLISPの比較演算関数を使いこなしてスマートな処理を目指そう

comparison-operation_caption3

今回ご紹介した比較演算関数を以下にまとめます。

関数内容使用例
=値が等しいか判定する(= 10 10 10) ; → T
(= 10 10 5)  ; → nil
/=値が等しくないか判定する(/= 1 2 3) ; → T
(/= 1 2 2) ; → nil
<より小さいか判定する(< 1 2 3) ; → T
(< 2 2 3) ; → nil
<=以下(より小さいまたは等しい)を判定する(<= 1 2 2 3) ; → T
(<= 5 4 6) ; → nil
>より大きいか判定する(> 5 3 1) ; → T
(> 5 3 3) ; → nil
>=以上(より大きいまたは等しい)を判定する(>= 5 4 4 3) ; → T
(>= 5 6 4)   ; → nil
equal誤差を考慮して値が等しいか判定する(equal 10.0 10.1 0.1) ; → T

比較演算関数はプログラムの判断を支える大切なパーツです。それぞれに特徴があり、うまく使い分けることでプログラムがグッとわかりやすくなります。今回の内容をヒントに、少しずつ自分のペースで使いこなしていってみてください。

AutoCADが楽になるプログラムを作成します AutoCADを効率化して面倒な作業から解放されましょう!

-AutoLISP関数, 関数解説