Sponsored links

【AutoLISP リスト】仮の自作関数にリストで情報を渡す apply & lambda 

Sponsored links
応用
Sponsored links

関数 lambdaを使うと、一連の流れをひとまとめにして、applyなどで引用関数として渡せる1回だけ使う仮の自作関数を作ることができます。

Sponsored links

予備知識

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、必要な引数は 数値 AngXYで、

指定した点から、角度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
Jagaimo
関数quote は 関数functionが使われることもあります。私の知る限り機能は同じです。
コンピューター言語がどのようにして作成されていくのか知りませんが、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
Jagaimo
例に挙げたコマンドtest1、test2、test3、test4、test5は書き方は違ってもどれも同じ働きをします。
自分がわかりやすい書き方を使えばいいと思います。
でも、いろんな書き方を知っておくと、誰かが作ったAutoLISPを解読するときに役に立ちます。 
 
 
 
 

まとめ

  • 関数 lambdaを使うと、関数apply の引用関数として1度だけ使える仮の自作関数を定義することができる。

関連記事

よくある一連の流れを自作関数にする。ことについて。

コマンド関数内で一時的な自作関数を使った作図コマンドのサンプルです。

Comments