関数 lambdaを使うと、一連の流れをひとまとめにして、apply、mapcarなどに渡す引用関数として1回だけ使う仮の自作関数を作ることができます。
今回はmapcarとlambdaを関数で複数の引数がある仮の自作関数を作ります。
予備知識
自作関数の定義をコマンド定義内でする記事です。
この中のコマンド例をリスト、mapcar、lambdaを使って書き換えていきます。
mapcar は、リストの値を処理して結果をリストで戻す関数です。
ここでは戻り値のリストは関係なく、「リストの値を処理する」という機能を活用します。
自作関数 を定義して繰り返す
以下の図を作図するコマンドを作ります。
まずは自作関数を関数内で定義した場合です。
(defun c:Test1 ( / Example Pt1)
(setq Pt1 (getpoint))
(defun Example (Ang X Y / Pt2)
(setq Pt2 (polar Pt1 (/ (* Ang pi) 180) X))
(command-s "._LINE" Pt1 Pt2 "")
(command-s "._CIRCLE" Pt2 Y)
)
(Example 0 50 10)
(Example 30 30 5)
(Example 60 40 2.5)
(Example 90 60 20)
(princ))
引数としてAng、X、Yを渡すと、
「点Pt1から角度Angに向かって長さXの線を引いて半径Yの円を描く」
という内容の自作関数Exampleを繰り返して作図します。
詳しくはこちらの記事にあります。
関数 mapcar
mapcarでは、引用関数を指定し、そこで使う引数をリストで渡すと、リストの要素の数だけ繰り返すことができます。
実行する引用関数にExampleを指定し、必要な引数 Ang、X、Y、それぞれのリストを渡します。
(list 0 30 60 90) がAngのリスト、 (list 50 30 40 60) がXのリスト、 (list 10 5 2.5 20) がYのリストです。
リストの要素の数(ここでは4回)、値を変えながら引用関数として渡した自作関数Exampleを繰り返します。
(defun c:Test2 (/ Pt1 Pt2)
(setq Pt1 (getpoint))
(defun Example (Ang X Y / Pt2)
(setq Pt2 (polar Pt1 (/ (* Ang pi) 180) X))
(command-s "._LINE" Pt1 Pt2 "")
(command-s "._CIRCLE" Pt2 Y)
)
(mapcar
(quote Example)
(list 0 30 60 90)
(list 50 30 40 60)
(list 10 5 2.5 20)
)
(princ))
quote とlistは ‘ で省略できます。
(defun c:Test3 (/ Pt1 Pt2)
(setq Pt1 (getpoint))
(defun Example (Ang X Y / Pt2)
(setq Pt2 (polar Pt1 (/ (* Ang pi) 180) X))
(command-s "._LINE" Pt1 Pt2 "")
(command-s "._CIRCLE" Pt2 Y)
)
(mapcar
'Example
'(0 30 60 90)
'(50 30 40 60)
'( 10 5 2.5 20)
)
(princ))
関数 mapcar lambda
関数 lambdaを使うと、mapcarの引用関数として1回だけ使える仮の自作関数を定義することができます。
下記は、コマンドtest2で自作関数Exampleを使った所に、lambdaを使って自作関数Exampleのコードをそのまま入れて仮の自作関数にしたものです。
(defun c:Test4 (/ Pt1 Pt2)
(setq Pt1 (getpoint))
(mapcar
(quote (lambda (Ang X Y)
(setq Pt2 (polar Pt1 (/ (* Ang pi) 180) X))
(command-s "._LINE" Pt1 Pt2 "")
(command-s "._CIRCLE" Pt2 Y)
))
(list 0 30 60 90)
(list 50 30 40 60)
(list 10 5 2.5 20)
)
(princ))
quote と list の省略形です。
(defun c:Test5 (/ Pt1 Pt2)
(setq Pt1 (getpoint))
(mapcar
'(lambda (Ang X Y)
(setq Pt2 (polar Pt1 (/ (* Ang pi) 180) X))
(command-s "._LINE" Pt1 Pt2 "")
(command-s "._CIRCLE" Pt2 Y)
)
'(0 30 60 90)
'(50 30 40 60)
'(10 5 2.5 20)
)
(princ))
自分がわかりやすい書き方を使えばいいと思います。
でも、いろんな書き方を知っておくと、誰かが作ったAutoLISPを解読するときに役に立ちます。
まとめ
- mapcar でリストで引数を渡して繰り返し処理ができる。
- 関数 lambdaを使うと引用関数として1度だけ使える仮の自作関数を定義することができる。
- 引数が複数必要場合は、引数毎のリストを渡す。
関連記事
引数が一つの場合の類似記事です。
よくある一連の流れを自作関数にする。ことについて。
mapcar lambdaを使った作図コマンドのサンプルです。
Comments