- (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 …)
- foo.lsp ならば
- 関数内関数で済むなら、それですませる(その関数名はローカルで)
といった方向で誤魔化す。
以上