删除Common Lisp中的类型

Lex*_*Lex 5 lisp common-lisp

Common Lisp是否为使用deftype创建的未定义类型提供了便利 ?

我没有在Hyperspec中找到任何关于它的内容.

dan*_*lei 5

我只是unintern派生类型说明符:

T1> (deftype foo () 'fixnum)
FOO
T1> (let ((bar 1))
      (check-type bar foo))
NIL
T1> (unintern 'foo)
T
T1> (let ((bar 1))
      (check-type bar foo))

Unknown type specifier: FOO
   [Condition of type SIMPLE-ERROR]
Run Code Online (Sandbox Code Playgroud)

此外,如果您真的担心由于某种原因删除该类型的每个跟踪,您始终可以编写与实现相关的代码来实现它,即使标准中未提及此类功能.例如,在CCL中(未经测试,我只是浏览了相关代码):

(defun delete-type (derived-type-specifier)
  (ccl::clear-type-cache)
  (remhash derived-type-specifier ccl::%deftype-expanders%)
  (setf (documentation derived-type-specifier 'type) nil))
Run Code Online (Sandbox Code Playgroud)

现在我们开始:

T1> (deftype foo () "frob" 'fixnum)
FOO
T1> (documentation 'foo 'type)
"frob"
T1> (let ((bar 1))
      (check-type bar foo))
NIL
T1> (delete-type 'foo)
NIL
T1> (documentation 'foo 'type)
NIL
T1> (let ((bar 1))
      (check-type bar foo))

Unknown type specifier: FOO
   [Condition of type SIMPLE-ERROR]
Run Code Online (Sandbox Code Playgroud)