Gp:FindPointInList 関数を理解する

ソース コード内の関数の冒頭に、gp:FindPointInList が情報を作業に使用できる形式に変換する方法が説明されています。前出の関数と同様に、Gp:FindMovedPoint 関数は、作業の実行に LISP のリスト操作機能を使用します。リストの操作では、これらの関数に見られるように、mapcar 関数と lambda 関数が一緒に使用されることがよくあります。第 1 に、これらは、名前からだけでは何を行うのか分からない、奇妙で得体の知れない関数です。しかし、使い方さえ分かれば、AutoLISP で最も強力な関数であることが理解できるでしょう。次に、mapcarlambda の概要を簡単に説明します。

mapcar 関数は、リスト内のすべての項目に式を適用(マップ)します。たとえば、整数 1、2、3、4 のリストがあるとすると、mapcar を使用して 1+ 関数を適用し、リスト内のそれぞれの数値に 1 を加えることができます。

(mapcar '1+ '(1 2 3 4))
(2 3 4 5)

mapcar の元々の定義は、最初の引数で与えられた関数を、2 番目の引数(リスト)内の連続する要素に適用する、というものです。mapcar からの戻り値は、適用された関数または式によって変換されたリストです。(実際には、mapcar はそれ以上のことを行えますが、ここではその定義の範囲で十分です。)

上記の例で、リスト '(1 2 3 4) 内の各値は、1+ 関数に渡されます。要するに、mapcar は次の処理を行い、結果として得られた値をリストに組み立てます。

(1+ 1)  -> 2
(1+ 2)  -> 3
(1+ 3)  -> 4
(1+ 4)  -> 5

mapcar の他の例を示します。今度は、null 関数を使用して、リスト内の値が null(真でない)値かどうかを調べています。

(mapcar 'null (list 1 (= 3 "3") nil "Steve"))
(nil T T nil)

このコードは、要するに、次のことを行います。

(null 1)    -> nil
(null (= 3 "3")   -> T
(null nil)   -> T
(null "Steve")   -> nil

mapcar 内で、多くの既存の AutoLISP 関数を使用できます。独自の関数を使用することもできます。たとえば、次のように、equals2 という非常に強力な関数を作成したとします。

(defun equals2(num)(= num 2))
EQUALS2
(mapcar 'equals2  '(1 2 3 4))
(nil T nil nil)

しかし、equals2 は、すべての場合に強力とは限りません。このような場合には、lambda が手軽に使用できます。lambda は、関数定義のオーバーヘッドを持ち続けたくない場合、または持ち続ける必要がない場合に使用します。名前のない関数として定義されている lambda を見る機会があることと思います。たとえば、equals2 という名前の関数を定義する代わりに、関数定義のオーバーヘッドなしに同じ処理を行う lambda 式を書くことができます。

(mapcar '(lambda (num) (= num 2)) '(1 2 3 4))
(nil T nil nil)

このコードは、次のことを行います。

(= 1 2)	-> nil
(= 2 2)	-> T
(= 3 2)	-> nil
(= 4 2)	-> nil

この知識を基に、gp:FindPointInList 関数を見て、その意味を理解してください。繰り返しますが、ソース コード内のコメントを吟味してください。