
2025/12/27 0:56
**Show HN:** *Rust/WASMで実装した AutoLISP インタープリター ― 33 年前に発明された CAD ワークフロー*
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
概要
Acadlisp は Rust で書かれた AutoLISP インタープリターで、WebAssembly にコンパイルされます。これによりユーザーは従来の AutoLISP コードをモダンなウェブブラウザ上で直接実行し、AutoCAD を必要とせずに SVG や DXF の図面を生成できます。
主要な AutoLISP 構文(、defun)や制御構造(setq、if、while)、算術・三角演算子、リスト操作(cond、car、cdr)、およびnthなどの描画コマンドをサポートしています。(command "LINE" …)
このプロジェクトは、バイエルン州の電気会社向けに1991年に作られたスキーマ生成ツールから発展しました。このツールは CSV 入力、テンプレート、および自己修正 LISP コードを用いてカスタムスキーマを自動化し、LISP のホモアイコン性とシンボリック処理が長らくダイナミックなエンジニアリングワークフローを可能にしてきたことを示しています。
Acadlisp はこのニッチなワークフローを将来にわたって保存し、懐古心と知識の消失への懸念から動機付けられています。インタラクティブデモはオンラインで実行でき、GitHub 上のソースコードは継続的な保守や拡張を歓迎しています。レガシースクリプトをブラウザ上で実行可能にすることで、AutoCAD ライセンスに代わるコスト効率の高い選択肢を提供しつつ、歴史的重要性を持つ LISP ベースのエンジニアリング実践を存続させます。
本文
インタラクティブデモを試す
acadlispとは?
- acadlisp は Rust で書かれ、WebAssembly(WASM)にコンパイルされた AutoLISP インタープリターです。
- ブラウザ上で AutoLISP コードを直接実行できるため、AutoCAD のインストールは不要です。
ストーリー:1991年の回路図ジェネレーター
1991 年、ドイツ・バイエルン州にある小さな電気会社で、機械設置ごとにカスタム回路図を作成する必要がありました。これは時間のかかる手動プロセスでした。
解決策:
AutoCAD に組み込まれたプログラミング言語 AutoLISP を活用しました。CSV ファイル、テンプレート、および LISP コードを組み合わせて回路図生成を自動化するワークフローを発明しました。
- スプレッドシートで部品を定義
- テンプレートに通し
- 完全な技術図面を自動生成
この手法を使った人は私以外には見つかりませんでした。現在では Rust/WASM でインタープリターを構築し、ブラウザ上で同じワークフローを継続できるようにしました。これは一部ノスタルジー、一部知識の保存という意味があります。
LISP と初期 AI
LISP(List Processing)は 1958 年にジョン・マッカーシーによって開発され、数十年にわたり人工知能研究の主要言語でした。LISP の特徴は次のとおりです。
- ホモアイコン性:コードとデータが同じ構造(リスト)を共有
- 自己修正:プログラム自身を書き換えることができる
- シンボル処理:数値だけでなくシンボルを操作
1991 年の回路図ジェネレーターでは、コード自体が書き換えられました。部品を挿入するとさらに部品が追加され、テンプレートが新しいテンプレートを生成しました。
技術的詳細
| 項目 | 内容 |
|---|---|
| 言語 | Rust |
| ターゲット | WebAssembly (WASM) |
| 出力形式 | SVG, DXF(AutoCAD R12/AC1009) |
| サポートされる AutoLISP 関数 | , , , , , 算術演算子 (, , , ), 三角関数 (, , ), リスト操作 (, , , ), 描画コマンド (, ) など |
サンプルコード
; 四角形を描く (defun draw-box (x y w h) (command "LINE" (list x y) (list (+ x w) y) "") (command "LINE" (list (+ x w) y) (list (+ x w) (+ y h)) "") (command "LINE" (list (+ x w) (+ y h)) (list x (+ y h)) "") (command "LINE" (list x (+ y h)) (list x y) "")) (draw-box 10 10 100 50)
リンク
- インタラクティブデモ(JavaScript が必要)
- GitHub のソースコード