関数 lambdaを使うと、一連の流れをひとまとめにして、applyなどで引用関数として渡せる1回だけ使う仮の自作関数を作ることができます。
予備知識
applyについて。
applyを使うと、複数の引数をリストでまとめて渡すことができます。
自作関数 Example
この自作関数 Exampleを使って説明していきます。
(defun Example (Ang X Y / Pt1 Pt2)
(setq Pt1 (getpoint))
(setq Pt2 (polar Pt1 (/ (* Ang pi) 180) X))
(command-s "._LINE" Pt1 Pt2 "")
(command-s "._CIRCLE" Pt2 Y)
(princ))
関数名はExample、必要な引数は 数値 Ang、 X、 Yで、
「指定した点から、角度Angに長さXの線分を引いて端っこに半径Yの円を描く。」
という機能があります。
この自作関数Exampleを使って、 角度0°に長さ50の線分を引いて線の端に半径Y10円を描く。をコマンドにすると、以下のようになります。
(defun c:test1 ()
(Example 0 50 10)
(princ))
関数 apply
関数applyを使うと、リストで引数を渡すことができます。
(defun c:test2 ()
(apply (quote Example) (list 0 50 10))
(princ))
省略できる関数 quate list を ‘ で省略すると以下のようになります。
(defun c:test3 ()
(apply 'Example '(0 50 10))
(princ))
Jagaimo
関数quote は 関数functionが使われることもあります。私の知る限り機能は同じです。
コンピューター言語がどのようにして作成されていくのか知りませんが、quote function、引用関数を表す関数が2つできちゃってヤヤコシイから、’ で省略して一緒にしてしまえってなったのかなって勝手に思っています。
コンピューター言語がどのようにして作成されていくのか知りませんが、quote function、引用関数を表す関数が2つできちゃってヤヤコシイから、’ で省略して一緒にしてしまえってなったのかなって勝手に思っています。
関数 lambda
自作関数 Example をコマンドの外で別に定義しなくても、関数 lambdaを使うと、applyの引用関数として1回だけ使える仮の自作関数を定義することができます。
下記は、コマンドtest2で自作関数Exampleを使った所に、lambdaを使って自作関数Exampleのコードをそのまま入れて仮の自作関数にしたものです。
(defun c:test4 ()
(apply
(quote (lambda (Ang X Y / Pt1 Pt2)
(setq Pt1 (getpoint))
(setq Pt2 (polar Pt1 (/ (* Ang pi) 180) X))
(command-s "._LINE" Pt1 Pt2 "")
(command-s "._CIRCLE" Pt2 Y)
))
(list 0 50 10)
)
(princ))
もちろん、この場合もquote とlistは省略できます。
(defun c:test5 ()
(apply
'(lambda (Ang X Y / Pt1 Pt2)
(setq Pt1 (getpoint))
(setq Pt2 (polar Pt1 (/ (* Ang pi) 180) X))
(command-s "._LINE" Pt1 Pt2 "")
(command-s "._CIRCLE" Pt2 Y)
)
'(0 50 10)
)
(princ))
Jagaimo
例に挙げたコマンドtest1、test2、test3、test4、test5は書き方は違ってもどれも同じ働きをします。
自分がわかりやすい書き方を使えばいいと思います。
でも、いろんな書き方を知っておくと、誰かが作ったAutoLISPを解読するときに役に立ちます。
自分がわかりやすい書き方を使えばいいと思います。
でも、いろんな書き方を知っておくと、誰かが作ったAutoLISPを解読するときに役に立ちます。
まとめ
- 関数 lambdaを使うと、関数apply の引用関数として1度だけ使える仮の自作関数を定義することができる。
関連記事
よくある一連の流れを自作関数にする。ことについて。
コマンド関数内で一時的な自作関数を使った作図コマンドのサンプルです。
Comments