嘘か真実か
こんにちは!
エカキオです!
今回は、条件分岐について紹介します。
使う関数としては、
(if)関数です。
エクセルの関数などを使ったことある人はなじみがあるかもしれませんね。
if...
DA PUMPが懐かしいですね。
ではさっそく本題に入ります。笑
「nil」 or 「t」
Lispの中では、
嘘、等しくない、×、無 を
nil
と言います。
それに対して、真実、等しい、○、有 を
t
と言います。
(if)関数では、「nil」 か 「nilではない」 かの判断によって、次に作用する動きを変えてくれるのです。
前回の記事を利用します。
(defun c:info ( / li l2 l3) (setq li (entget (car (entsel)))) (setq l2 (assoc 8 li)) (setq l3 (cdr l2)) (princ) )
このうち変数「l3」の値について、(if)関数を使って判断しましょう。
書き方はこうです。
(if (○) (△) (□))
○:条件式を書くとこ
△:○部分がnil以外の場合に実行
□:○部分がnilの場合に実行
○部分について、いろいろな書き方があります。
例えば、等号、不等号など
等しい | = |
等しくない | /= |
超える、未満 | <,> |
以上、以下 | <=,>= |
※以上、以下は、その数値自体を含むということです。
「=」の値は数値、文字列どちらでも利用できます。
Lispでの四則計算及び等号、不等号は以下のように書きます。
(+ 3 5)←3 + 5
結果:8
(= 4 4)
結果:t ←等しい
(= 5 "5")
結果:nil ←等しくない
(= "abc" "abc")
結果:t ←等しい
こんな具合です。
(if)関数を組み込んでみる
では先ほどのコードに(if)関数を組み込んでみます。
例として選択したオブジェクトが"LINE"か否か調べるというものを書きます。
(defun c:info ( / li l2 l3) (setq li (entget (car (entsel)))) (setq l2 (assoc 0 li));図形タイプを抽出「0」 (setq l3 (cdr l2)) (if (= l3 "LINE");条件式 (princ "\nこのオブジェクトはLINEです。");条件式がnilでない場合、実行 (princ "\nこのオブジェクトはLINEではありません。");条件式がnilの場合、実行 );if関数の終わりのカッコ (princ) )
(if)関数部分以外は理解できていますか?
まだ不十分な場合は前回の記事を見ていただくか、コメントでお問い合わせください。
上記のように(if)関数を組み込めました。
気をつけていただきたいこととして、(if)関数の中で実行する部分で
下の赤と緑の文は、一つのカッコしか記載できません。
(if (= l3 "LINE");条件式
(princ "\nこのオブジェクトはLINEです。")
(princ "\nこのオブジェクトはLINEではありません。")
);if関数の終わりのカッコ
そこで登場するのが、
(progn)関数です。
こちらを利用することで、(progn)が大きなカッコになり、そこの中に複数カッコを書くことができます。
例えばこんな感じです。
(if (= l3 "LINE");条件式
(progn
(princ "\nこのオブジェクトはLINEです。")
(princ "\nあなたが選択したものはnilではありませんでした")
);prognの閉じカッコ
(progn
(princ "\nこのオブジェクトはLINEではありません。")
(princ "\nあなたが選択したものはnilでした")
);prognの閉じカッコ
);if関数の終わりのカッコ
複数のカッコを使う場合は、(progn)関数を使わないとエラーになります。
いかがでしたでしょうか。
これで(if)関数、条件分岐が使えるようになりましたね。
それでは、この辺で。
次回は、繰り返し処理についてご紹介していきます。
エカキオ