Sponsored links

【AutoLISP リスト】リストにした値を同時編集 関数 mapcar と quote

Sponsored links
AutoLISP
Sponsored links

mapcarは、リストになっている複数の値に同じ処理をする関数です。
戻り値もリストです。

Sponsored links

予備知識

リストについて。

AutoLISP 関数 mapcar と quote

mapcar は、リスト内の値を引数に関数を実行して、結果をリストのまま戻します。
mapcarに渡す引数は、引用した関数とその関数の引数になる値をまとめたリストです。

quate は、関数や記号を引用するときに使います。
quateはアポストロフィで省略ができるので、(quate 関数)を ‘関数 と書くことができます。

例)数値リストを文字列リストに変換

mapcar を使って、複数の整数を文字列に変更します。

整数を文字列にする関数は、itoa です。
(itoa 1) で、数値の 1 が文字列に変換されて “1” が戻ります。

それでは、itoa を引用関数として、(quote itoa)、itoa に渡したい数値 1 2 3 4 をリスト (list 1 2 3 4) にして、4つの数値を4つの文字列に変換してみましょう。
コマンドラインに入力して、試してみて下さい。

(mapcar (quote itoa) (list 1 2 3 4))

全ての数値が文字列になったリスト

("1" "2" "3" "4")

が戻り値としてコマンドラインに表示されます。

Jagaimo
Jagaimo
quote も list もアポストロフィで省略できる関数なので、 (mapcar ‘itoa ‘(1 2 3 4)) と書くこともできるよ。
 

引数が複数ある関数をつかう

複数引数がある関数を引用した場合は、必要な引数分のリストを付けます。

例として、+をつかって、2つの引数を足してみましょう。
関数 + は、引数を合算する機能があります。引数として1 と 10 を渡して、
(+ 1 10)
で、11が戻ります。

それでは、mapcar を使って複数の足し算を一気にしてみましょう。

  • 引用関数 +
  • 一つ目の引数 (list 1 2 3 4)
  • 二つ目の引数 (list 10 20 30 40)

これをmapcar に当てはめると、

 (mapcar (quote +) (list 1 2 3 4) (list 10 20 30 40))

これで、各要素が足されて、以下の合算されたリストが戻ります。

(11 22 33 44)
Jagaimo
Jagaimo

ちなみに省略形は 
(mapcar  ‘+ ‘(1 2 3 4)  ‘(10 20 30 40))

mapcar でドットペアを作る

ドットペアを作るcons を引用関数にしてmapcarを試してみましょう。
アポストロフィで省略できる関数、list とquoteがたくさん並ぶので面白いですよ。

cons に必要な引数は、記号と値です。
(cons ‘A 10) で、ドットペア (A . 10) ができますが、cons で使うアポストロフィも quote の略です。
つまり、(cons ‘A 10) は (cons (quote A) 10) の略です。

それでは、
((A . 10) (B . 20) (C . 30) (D . 40))
こののドットペアが並んだリストを mapcar を使って作成します。

(mapcar 
  (quote cons) 
     (list (quote A) (quote B) (quote C) (quote D)) ;記号のリスト
     (list 10 20 30 40) ;値のリスト
)

この場合、記号側のリストはアポストロフィ1つで、list も各記号につくquoteも省略できます。

(mapcar
 (quote cons)
    '(A B C D)
      (list 10 20 30 40)
)

もちろん、cons のquote も、値のリストのlist も省略できるので、

(mapcar 'cons '(A B C D) '(10 20 30 40))

こんなにシンプルになります。

もちろん、どのコードでも結果は同じで

((A . 10) (B . 20) (C . 30) (D . 40))

このドットペアが戻り値になります。

まとめ

  • mapcarは、引用関数をリストの値を引数に実行して、結果のリストを戻す。
  • quote はアポストロフィで省略できる。
  • list はアポストロフィで省略できる。

関連記事

関数cons とドットペアについて。

mapcar の使用サンプル

Comments

  1. 池田 耕治郎 より:

    autocad lisp関数で リスト内の最小値を得る関数
    LIST (34 12 58 9) の最小値である3を得る関数