2017-08-18 7 views
2

AutoCADのナレッジWebサイト:
""注:同じ名前の複数のユーザー関数を定義できますが、各定義には異なる数または種類の引数を使用できます。
誰でもこの機能を使用していますか?私は試しましたが、全く動作しません。 私は、この(file::AppendFile arg1)のように呼び出すだけで、最新の定義されたfunction.Ifを呼び出すことができますは、AutoCAD、私があまりにも少ない引数を与えると述べた
enter image description hereAutolispユーザー関数のオーバーロード

+0

'::'はAutolispのシンボル名の一部として特別な意味を持っていますか、それとも単にあなたが使っている規則ですか? –

答えて

1

"注:同じ名前の複数のユーザー関数を定義できますが、それぞれの定義で異なる数または種類の引数を受け入れることができます。

これは、AutoLISPのは不可能である。最後に評価defun式は、名前空間でのシンボルのすべての以前の定義を上書きします - 二defun式は即座になりますように、それ故にあなたの例ではfile:AppendFile関数は2つの引数を必要とします関数を再定義する。

2つの引数(異なる長さの引数のリストを指定すること以外)を提供する唯一の方法は、式の評価の前にfile:AppendFile関数を評価することです。

2

私はインストールのAutoCADとコンピュータではないので、私がチェックすることはできませんAutoLISPの場合ドキュメンテーションが述べるように動作しますが、さまざまな引数を関数に渡すための回避策を見てきました。

トリックは、すべての引数を単一のリストとして渡し、関数の本体でそのリストを処理することです。たとえば、次のように

(defun myFunction (argsList/path header) 
    (setq path (car argsList)) 
    (setq header (cadr argsList)) 
    (someFunction path "a" header) 
) 

...そして、あなたは(myFunction '(arg1))または(myFunction '(arg1 arg2))であなたの関数を呼び出すと思います。

上記の私の例では、リストコンストラクタリテラルを使用しているので、実際の文字列 "arg1"と "arg2"を渡すことに注意してください。変数の内容を渡す場合は、代わりに(myFunction (list var1 var2))という形式を使用する必要があります。

これは少し醜いですが、それはオプションです。

関連する問題