2014-04-08 13 views
5

In CLHS 4.3.7 Nella figura 4.8 viene elencato l'insieme di classi che corrispondono agli identificatori di tipi predefiniti. 'parola chiave' non è tra questi. Ma continua dicendo che "Le implementazioni individuali possono essere estese per definire altri specificatori di tipo per avere una classe corrispondente".Modo idiomatico per specializzarsi sulla parola chiave type per i lisps che non rendono una parola chiave una classe

Quindi presumo che questo è ciò che Clozure CL ha fatto per lo specificatore di tipo 'parola chiave' e il codice sottostante sembra confermarlo. In lisps che non lo fanno (ad esempio SBCL e LispWorks che ho controllato) qual è il modo migliore per ottenere il comportamento di Clozure CL? O in mancanza, qualche compromesso praticabile?

Sembra un po 'grossolanamente testare esplicitamente il tipo di parola chiave come ho fatto nella prima definizione del metodo di seguito, ma non riesco a vedere come rendere il tipo di parola chiave in una classe se la mia implementazione di lisp non ha già fatto per me ...

(in-package :cl-user) 

(defmethod foo ((sym symbol)) 
    (let ((type (if (keywordp sym) "keyword" "symbol"))) 
    (format t "symbol specializer with ~A: ~A~%" sym type))) 

#+clozure (defmethod foo ((sym keyword)) 
      (format t "We have keyword ~A~%" sym)) 

;; SBCL 
(foo 'bar) => symbol specializer with BAR: symbol 
(foo :bar) => symbol specializer with BAR: keyword 

;; Clozure CL 
(foo 'bar) => symbol specializer with BAR: symbol 
(foo :bar) => We have keyword BAR 

risposta

6

ANSI Common Lisp definisce nessuna classe con il nome KEYWORD. È un'estensione non portatile di Clozure Common Lisp.

Non esiste inoltre un modo portabile per introdurre una tale classe.

Poiché symbol è una classe integrata, non è possibile estenderlo con una sottoclasse.

Quindi penso che il semplice IF sia brutto, ma necessario. Un'altra soluzione sarebbe molto più coinvolta (immaginate di usare il MOP per introdurre un nuovo modo di dispiegare su una propria struttura di classi parallele per tipi ...).

+1

Ho sentito il tuo "no" definitivo, quindi in questo caso sto davvero chiedendo quale sia il miglior lavoro intorno ... (Inoltre, e questo è solo un cavillo, non il documento CLHS [KEYWORD come tipo? ] (http://www.lispworks.com/documentation/lw51/CLHS/Body/t_kwd.htm)) – gtod

+0

@gtod: grazie, modificato. –

Problemi correlati