2013-08-08 10 views
6

Ho trovato un ottimo esempio di controllo del tipo in LispWorks Hyper Spec, ma il link "type specificifier" porta a un semplice glossario non alla denotazione, e mi sono un po 'confuso con la sintassi.Comprendere gli identificatori di tipo in Common Lisp

In (check-type n (integer 0 *) "a positive integer") cosa significa (integer 0 *)? Suppongo che significhi intervallo compreso tra 0 e infinito, ma è così?

+0

significa un numero intero uguale o maggiore di zero (prima è la il secondo limite inferiore è il limite superiore). –

risposta

4

Sì, è possibile utilizzare gli identificatori di tipo in linguaggio comune, possono essere molto potenti se il compilatore decide di utilizzarli. Mentre è possibile trovare gli usi per il tipo di controllo, i tipi più comuni di specifiche del tipo si presentano sotto forma di declarations.

L'espressione declare non è utilizzata solo per i tipi, ma ha un numero di declaration identifiers e le implementazioni comuni di Lisp sono in realtà gratuite per aggiungerne di proprie.

Il bit che ti interessa è lo 'types' e in particolare quello 'Type Specifiers'. Quella pagina ti darà il minimo su una varietà di modi per specificare i tipi, incluso il modo in cui hai menzionato nella tua domanda.

Ricordati ancora che la tua implementazione non deve usare le dichiarazioni che potrebbe semplicemente ignorarle! Here is some more info on that.

E per alcuni esempi di codice, ecco l'esempio che mi ha fatto capire le basi di come funziona. Here e altro here.

Dal 4.2.3 Type Specifiers:

Se un indicatore di tipo è una lista, l'auto della lista è un simbolo, e il resto della lista è l'informazione di tipo sussidiario. Tale identificatore del tipo è chiamato identificatore del tipo composto. Ad eccezione di quanto esplicitamente dichiarato , gli articoli sussidiari possono essere non specificati. Gli articoli sussidiari non specificati sono indicati con la dicitura *. Ad esempio, per specificare completamente un vettore, il tipo di elementi e la lunghezza del vettore devono essere presenti.

(vector double-float 100) 

Di seguito lascia la lunghezza specificata:

(vector double-float *) 

il seguente lascia il tipo di elemento specificato:

(vector * 100)