標準愚痴出力

個人的なIT作業ログです。もしかしたら一般的に参考になることが書いているかもしれません(弱気

静的型付け言語に慣れた開発者が 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 …)
  • 関数内関数で済むなら、それですませる(その関数名はローカルで)

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

以上