AutoLISP

**AutoLISP**はプログラミング言語LISPの方言である。AutoCADとその派生（AutoCAD Civil 3D、AutoCAD Map 3D、AutoCAD Architecture、AutoCAD Mechanicalなど）で使用するために作成された。AutoLISP関数の一部は、ブラウザベースのAutoCAD Webアプリに含まれている。  

## 特徴
AutoLISPは、ガベージコレクション、不変リスト構造、設定可能なシンボルを備えた、動的スコープと動的型付けを持つ小型のLISP方言である。マクロシステム、レコード定義機能、配列、可変数の引数を持つ関数、letバインディングなどのLIPSに一般的な機能は備えていない。  コア言語を除けば、プリミティブ関数のほとんどは、ジオメトリ、AutoCADの内部DWGデータベースへのアクセス、またはAutoCADでのグラフィカルエンティティの操作に使用される。これらのグラフィカルエンティティのプロパティは、AutoLISPに連想配列として公開される。連想配列では、定義ポイント、半径、色、レイヤー、線種などのプロパティを示すAutoCADグループコードと値がペアになっている。AutoCADは、.LSPファイルからAutoLISPコードを読み込む。  

AutoLISPコードは、プリミティブ関数を使用してAutoCADのグラフィカルエディターを通じてユーザーと対話できる。プリミティブ関数を使用すると、ユーザーはポイントを選択したり、画面上でオブジェクトを選択したり、数値やその他のデータを入力したりできる。AutoLISPには、AutoCAD内で自動レイアウトのモーダルダイアログボックスを作成するための、グラフィカルユーザインタフェース（GUI）またはドメイン固有言語（DSL）であるも組み込まれている。  

## 歴史
AutoLISPは、デビッド・ベッツによって作成されたの初期バージョンから派生したものである。この言語は、1986年1月にAutoCADバージョン2.18で導入され、1995年2月のリリース13まで、リリースごとに機能強化が続けられた。その後、オートデスクはVisual Basic for Applications (VBA)、.NET Framework、などのより流行の開発環境を優先し、オートデスクによる開発は放棄された。しかし、AutoLISPはAutoCADの主要なユーザーカスタマイズ言語であり続けている。  

統合開発環境（IDE）、デバッガ、コンパイラ、およびActiveXサポートを含むAutoLISPの大幅に強化されたバージョンであるVital LISPは、サードパーティ開発者のBasis Softwareによって開発および販売された。Vital LISPは、既存のAutoLISP言語を包括しており、AutoCADオブジェクトモデル、リアクター（AutoCADオブジェクトのイベント処理）、一般的なActiveXサポート、およびその他の一般的なLisp関数へのVBAのようなアクセスが追加された。オートデスクはこれを買収し、Visual LISPと改名し、1997年5月にリリースされたAutoCADリリース14のアドオンとして短期間販売した。これは、1999年3月にリリースされたAutoCAD 2000にAutoLISPの代替として組み込まれた。それ以降、オートデスクはVisual LISPへの主要な機能強化を中止し、VBAと.NET、およびC++に注力してきた。2014年現在、オートデスクはユーザーによるカスタマイズのためにVBAから.NETに変更するという長期プロセスの一環として、7.1より前のバージョンのVBAのサポートを終了した。  

AutoLISPは非常に強い支持を得ているため、他のCADアプリケーションベンダーも自社製品にAutoLISPを追加している。BricsCAD、IntelliCAD、DraftSightなどにはAutoLISP機能があるため、AutoLISPユーザーはAutoCADの代替としてこれらを使用することを検討できる。AutoCAD 2000以降、AutoLISPに関連する開発のほとんどは、元のAutoLISPエンジンがVisual LISPエンジンに置き換えられて以来、Visual LISP内で行われている。AutoLISPまたはVisual LISPを使用して開発されたユーティリティやアプリケーションは数千に上る（LSP、FAS、VLXファイルとして配布）。  

## 例
AutoLISPでの簡単なHello worldプログラムは次のようになる。  

```lisp
(defun hello ( )
    (princ "\nHello World!")
    (princ)
)
```

関数定義内の最後の行に注意する必要がある。引数なしで評価された場合、関数はヌルシンボルを返すが、これはAutoCADのコマンドラインインターフェースでは表示されない。AutoCADコマンドラインはREPLとして機能するため、通常はコマンドラインに「Hello World!」が表示され、その後すぐにの呼び出しの戻り値が続く。そのため、関数の最後の呼び出しがない場合、結果は次のようになる。  

:

関数を使用して同じ結果を得ることもできる。  

より複雑な例は以下のとおりである。


```lisp
(defun c:pointlabel ( / pnt )
    (if (setq pnt (getpoint "\nSpecify point: "))
        (progn
            (entmake
                (list
                   '(0 . "POINT")
                    (cons 10 (trans pnt 1 0))
                )
            )
            (entmake
                (list
                   '(0 . "TEXT")
                    (cons 10 (trans (cons (+ (car pnt) 0.6) (cdr pnt)) 1 0))
                    (cons 40 (getvar 'textsize))
                    (cons  1 (strcat "X:" (rtos (car pnt)) " Y:" (rtos (cadr pnt))))
                )
            )
        )
    )
    (princ)
)
```

上記のコードは、特定のポイントにAutoCADポイントオブジェクトを生成する新しい関数を定義する。この関数は、X座標とY座標を横に表示する1行のテキストオブジェクトを備えている。関数の名前には特別な接頭辞「c:」が含まれており、これによりAutoCADは関数を通常のコマンドとして認識する。ユーザーがAutoCADコマンドラインで「pointlabel」と入力すると、X座標とY座標を入力するか、図面内の場所をクリックしてポイントを選択するように求められる。関数は次にそのポイントにマーカーを配置し、その横に1行のテキストオブジェクトを作成する。このテキストオブジェクトには、アクティブなユーザー座標系(UCS)を基準にして表現されたポイントのX座標とY座標が含まれる。この関数には引数は必要なく、1つのローカル変数「pnt」が含まれる。

上記の例は、組み込みのAutoCADコマンドを使用して記述しても同じ結果を得ることができるが、この方法はAutoCADリリース間のコマンドプロンプトの変更の影響を受ける。

## 脚注

## 外部リンク
*AutoLISP FAQ