3

私は受け取るコンパイラ警告の質と量を改善しようとしています -- Common Lisp で、宣言された型とインスタンスに型述語を含める方法はありますか -- 実装固有の回答は問題ありません。興味があります。誰かがやっているなら、それがどのように行われるかを見てください。

CCL で以下をコンパイルします。

(defun non-list (o)
  (not (listp o)))

(deftype non-list ()
  '(satisfies non-list))

(defun example (a)
  (list a))

(declaim (ftype (function (non-list) list) example))

(defun hmm ()
  (declare (optimize (debug 3) (safety 3)))
  (let ((a '(a b c))
    (b '(d e f)))
    (declare (type list a))
    (example '(g h i))
    (example a)
    (example b)))

への最初の呼び出しでコンパイラ警告が表示されますexample-- に対してチェックできるインスタンスを提供するものsatisfiesです。これは良いことです。デバッグ設定を使用すると、実行時エラーが発生しますが、これは良いことです。私が疑問に思っているのは、次のようなものを書くことができるかどうかです。

(defun non-list-typep (type)
  (not (subtypep type 'list)))

そして、少なくとも2番目の呼び出しが宣言された型が述語に失敗するため、コンパイル(example a)時に警告するように何らかの方法で統合しますlistnon-list-typep

乾杯!

4

2 に答える 2

8

少し背景

2 つの異なるものがあります。標準言語のCommon Lispと、Common Lisp を実装および拡張するさまざまな言語です。

言語としての Common Lisp は、コンパイル時にそのようなタイプの警告/エラーを必要としません。実装では、ほとんどの場合、型宣言を無視できます。また、言語は、コンパイラが型宣言を無視しない場合に何をすべきか、およびそれらを使用して静的に型をチェックする方法についても実際には説明していません。

実際の Common Lisp コンパイラは、静的に宣言された型に関して、次のグループに分類されます。

  1. それらをほとんど無視します。たとえば、Symbolics Lisp Machine のコンパイラはこのグループに分類されます。

  2. 主に最適化の目的で宣言された型を使用します。CCLはこのグループに分類されると思います。型の推論や型情報の伝播はあまり行わないと思います。それが、コンパイラが SBCL よりも高速である理由でもあると思います。

  3. 主に最適化の目的で宣言された型を使用しますが、型推論を行うことができ、(最適化のために) 型情報を提供できます。たとえば、LispWorks はこのグループに分類されます。

  4. 最適化の目的で宣言された型を使用し、型推論を行い、型情報を提供し、型宣言をコンパイル時の型アサーションと見なします。CMUCL および SBCL コンパイラは、このグループの主要メンバーです。

したがって、タイプ 2 の実装では、コンパイラに認識させたい場合は、すべてを宣言する必要があります。Common Lisp は宣言を書くためにTHEandを提供することに注意してください。LOCALLY

型宣言を静的な型アサーションとして持ち、コンパイラにそれらをチェックさせたい場合は、SBCLなどのコンパイラを使用することをお勧めします。

型宣言へのアプローチの背景については、SBCL Manual: Handling of Types and Type Errors at Compile Time を参照してください。詳細はこちら: The Python Compiler for CMU Common Lisp . CMU Common Lisp (およびそれ以降の SBCL) のコンパイラは Python と呼ばれることに注意してください。これは、プログラミング言語Pythonとは何の関係もありません。コンパイラは、言語Python (1991) が存在する前に (1980 年代初頭)、既にその名前を持っていました。

于 2012-10-01T17:01:39.090 に答える
1

もう 1 つの方法は、Qiのような型チェック言語を Common Lisp の上に実装することです。あなたが直面している問題を解決するために、defun に関するいくつかのスマートなマクロから始まったと思います。

于 2012-10-18T03:01:36.350 に答える