#:g1: 漸進的型付けとCommon Lisp

Posted 2021-12-07 21:44:40 GMT

Lisp一人 Advent Calendar 2021 8日目の記事です。

五六年に漸進的型付けというのが若干流行った気がするのですが、今はどうなっているのでしょう。
Pythonに型アノテーションを付けて書くようにするようなことは今の職場でも行なっているので、実はそこそこ身近になってきているのでしょうか。

Common Lispは漸進的型付け(を先取りしていた)か

この概念を知った時に、普段Common Lispを書いてる感覚そのままじゃないかと思ったのですが、<漸進的型付け>という型システムとのことなので、似たようなものなのか、全然違うものなのか。
久し振りに<漸進的型付けとは何か>のページを眺めたら、

『いくつかの言語は、すでにオプションの型アノテーションを持っていますが、
...オプションの型アノテーションを持つ言語には Common LISP, Dylan, Cecil, Visual Basic.NET, Bigloo Scheme, Strongtalk 
があります。漸進的型付けは、これらの言語がオプションの型アノテーションで何をするかについての基盤を提供することを意味します。』

という風にCommon Lispにも言及されていました。やはり似たようなものなのだろうか。

Common Lispは漸進的型付けではない

<漸進的型付けとは何か>を読み進めていっても、Common Lispと漸進的型付けの関係はいまいち分からなかったので、筆者の論文にあたってみたところ、元はScheme and Functional Programming Workshop 2006で発表したもののようです。
なんだ元はLisp畑の研究なのかと思ったりもしましたが、

Bigloo Schemeは漸進的型付け的なものを持つが、

Several programming languages provide gradual typing to some
degree, such as ...and the Bigloo dialect of Scheme 

Common Lispは持たないとあります。

Common LISP and Dylan include optional type annotations, but the annotations are not used for type checking, they are used to improve performance.

Common Lispは、実行効率を上げるための指定でありチェック機構ではない、ということですが、それはそれで納得です。

一応Biglooのマニュアルを確認してみると

2.8 Type annotations
Type information, related to variable or function definitions, can be added to the source code. If no type information is provided, runtime checks will be introduced by the compiler to ensure normal execution, provided that the user has not used compilation flags to prevents this. If type information is added, the compiler statically type checks the program and refuses ones that prove to be incorrect.

とのことで、Common LispでいうとSBCL等の処理系の使用感ともそんなに変わらない気がします。

さてこの『いや、Common Lispもコンパイル時に型チェックしてくれるではないか?』という感覚はどこに由来するのか。
これは以前にこのブログにも書きましたが、実はCMUCL系のPythonコンパイラで(declare type)の宣言をコンパイル時の型チェックに扱う拡張が現在では主流になっているため、Common Lispもコンパイル時の静的チェックサポートしている、という印象が強くなったのではないでしょうか。

ちなみに、Allegro CLも1990年代にこの流れに乗っていたと思います(文献があった憶えがあるが資料見付からず)

まとめ

いろいろ書きましたが、Siek氏らが提唱する漸進的型付けは、静的/動的のハイブリッドな型チェックを体系化したものなので、Common Lispが漸進的型付けをサポートするということであれば、この体系を取り込む必要があると思われます。

とはいえ、2021年の現状では型アノテーション付きのPythonよりはSBCL等のCommon Lisp処理系の方が開発時の静的チェックが効きますし実用的だなという印象です。

※なおチェックのためにはセッティングが重要なので適切に設定しましょう。
開発時は、

(proclaim '(optimize (debug 3) (safety 3)))

あたりにしておくと大抵の処理系で結構チェックは効くと思います。


HTML generated by 3bmd in LispWorks 7.0.0

comments powered by Disqus