Sponsored links

【AutoLISP リスト】仮の自作関数をリストの値で一気に処理 mapcar & lambda 複数の引数の場合

Sponsored links
unrecognizable woman walking dogs on leashes in countryside 応用
Photo by Blue Bird on Pexels.com
Sponsored links

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

今回はmapcarとlambdaを関数で複数の引数がある仮の自作関数を作ります。

Sponsored links

予備知識

自作関数の定義をコマンド定義内でする記事です。
この中のコマンド例をリスト、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))
Jagaimo
Jagaimo
例に挙げたコマンドtest1、test2、test3、test4、test5は書き方は違ってもどれも同じ働きをします。
自分がわかりやすい書き方を使えばいいと思います。
でも、いろんな書き方を知っておくと、誰かが作ったAutoLISPを解読するときに役に立ちます。 
 
 
 
 

まとめ

  • mapcar でリストで引数を渡して繰り返し処理ができる。
  • 関数 lambdaを使うと引用関数として1度だけ使える仮の自作関数を定義することができる。
  • 引数が複数必要場合は、引数毎のリストを渡す。

関連記事

引数が一つの場合の類似記事です。

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

mapcar lambdaを使った作図コマンドのサンプルです。

Comments