概要 - 引数を持つ関数(AutoLISP)

AutoLISP では、多くの関数に値を渡す必要があります。このような値を引数と呼びます。

また、引数を指定できない関数や、省略可能な引数を指定できる関数もあります。ユーザ定義関数に省略可能な引数を指定することはできません。引数を指定したユーザ定義関数を呼び出すときは、すべての引数に対して値を渡さなくてはなりません。

注: 同じ名前のユーザ関数を複数個定義することはできますが、定義それぞれに異なる数またはタイプの引数を指定しなければなりません。

引数として使用するシンボルは、ローカル変数の前の引数リストで定義します。引数は特殊なローカル変数として扱われ、引数の変数はその関数以外では使用できません。同じ名前の複数の引数を持つ関数を定義することはできません。

複数の引数に同じ名前を使用すると、次のエラーメッセージが AutoCAD のコマンド プロンプトに表示されます。

引数名が重複しています:

次のコードは、2 つの引数を指定する関数を定義します。このコードは、両方とも文字列データ タイプとなる引数を想定しています。引数は、結合され、結合結果の文字列として返されます。

(defun ARGTEST ( arg1 arg2 / ccc )
  (setq ccc "Constant string")
  (strcat ccc ", " arg1 ", " arg2)
)
ARGTEST

AutoLISP は常に最後の式を評価した結果を返すため、ARGTEST 関数は希望の値を返します。ARGTEST の最後の行では、strcat を使用して文字列を結合し、その結果の値が返されます。これは、プログラムから戻り値を出力させないための princ 関数を使用しない場合の 1 つの例です。

この関数は、アプリケーション内で繰り返し使用して、1 つの定数文字列と 2 つの変数文字列を特定の順序で結合することができます。この関数は値を返すので、返された値を変数に格納し、後でアプリケーションで使用することができます。

(setq newstr (ARGTEST "String 1" "String 2"))
"Constant string, String 1, String 2"

変数 newstr には 3 つの文字列を結合した値が代入されます。

変数 cccARGTEST 関数の中でローカル変数として定義されていたことに注意してください。関数の実行が完了すると、AutoLISP は変数に割り当てられたメモリを取り戻します。次のコードを使用して、ccc に割り当てられた値を確認することができます。

!ccc
nil

文字列の値が ARGTEST 関数に渡されていない場合、strcat 関数は、次のエラーを返します。

; エラー: 引数のタイプが間違っています: stringp 1

type 関数を使用して、引数のデータ タイプを確認し、適切に対応することができます。vl-catch-apply-all 関数も、strcat 関数によって返されるエラーの捕捉に役立つ場合があります。次のコード例では、結合して結果の文字列を返す前に、ARGTEST 関数が 2 つの文字列値を渡したことを確認するために、type 関数を使用しています。

(defun ARGTEST (arg1 arg2 / ccc retVal)
  (setq ccc "Constant string")

  (if (= (type arg1) 'STR)
    (if (= (type arg2) 'STR)
      (setq retVal (strcat ccc ", " arg1 ", " arg2))
      (prompt "bad argument: arg2 not a string\n")
    )
    (prompt "bad argument: arg1 not a string\n")
  )
  (if retVal
    retVal
    (princ)
  )
)