静的型付け言語に慣れた開発者が AutoLISP でやったアレコレ

(2018.06.02)
「静的型付け言語に慣れた開発者が貧弱なCAD用 Lispでやったアレコレ」からタイトル変更しました

静的型付け言語になれた身としては、欲しい機能がいろいろなくて、つらたにえん。せめて、CommonLisp だったら、もうちょっと楽なんだろうなぁ(使ったことないけど)

(let) がない

ローカル変数は使えるが、宣言できる場所が (defun) の直後だけというのはつらい。もっと使う場所の近くで、狭い有効範囲をきって使いたい。普通は(let)を使うところだが、CAD系Lispには(let)がない。仕方ないので((lambda (/ 変数リスト) … )) で代用するようにした(というのが下記の記事)

early-return がない

他の言語だと、エラーの場合早々に return するのがよいとされているが、CAD用Lispには return 文的なものがない。結果、関数の頭で、エラーチェックをたくさんする時、以下のような問題がある。

  • (if) でエラーチェックすると、正常系のコードが else句の奥底のすごく深いインデントになってしまう
  • (quit) でアプリケーションを終了すると、finally 的処理が呼ばれない(エラートラップ等でひと工夫すればできなくもないが、仕組みが大層)

(cond) を使うようにすれば、エラーケースがたくさんあっても、あまりインデントは深くならない(ただ、エラー条件が複雑になると、うまく書けない時も多い)

(cond
  ((エラー条件1)
   エラー処理1
  )
  ((エラー条件2)
    エラー処理2
  )
  ; 中略
  ((エラー条件N)
    エラー処理N)
  (T
     正常系処理
  )

グローバル変数をうっかり壊してしまう

Perl でいうところの use strict が欲しい。なければ作ればよいのだ。

ソースファイルをS式として読み込んで、(defun)の中身を解析し、未使用の変数や、逆に宣言漏れがあったら、コマンドラインにリポートする。

名前空間がない

いろいろ (load) していると関数名が被ることが懸念される。といっても名前空間がないので、

  • グローバルな名前には接頭語をつける(ありがち)
    • foo.lsp ならば (defun foo-xxxx …)
  • 関数内関数で済むなら、それですませる(その関数名はローカルで)

といった方向で誤魔化す。

以上