2012-09-01 14 views

Antwort

5

Ich würde nur unintern die abgeleitete Typspezifizierer:

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] 

Auch, wenn Sie wirklich besorgt um jede Spur von der Art, aus irgendeinem Grund zu löschen, können Sie immer abhängig von der Implementierung Code schreiben erreichen Sie es, auch wenn eine solche Funktionalität in der Norm nicht erwähnt wird. Zum Beispiel in CCL (ungetestet, ich abgeschöpft nur den entsprechenden Code):

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

Und hier gehen wir:

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]