2010-09-15 15 views
14

Ho il seguente record:Come posso digitare suggerimento su un array?

(defrecord Signal [samples ^double sample-rate ^double scaling-factor]) 

Come posso specificare samples ad essere un doppio array?

Sto usando clojure 1.2.0

Edit:

@dreish ottengo il seguente output quando chiamo (show Signal) dopo le modifiche dal Levand:

[35] <init> (Object,double,double) 
[36] <init> (Object,double,double,Object,Object) 
[37] __extmap : Object 
[38] __meta : Object 
[39] sample_rate : double 
[40] samples : Object 
[41] scaling_factor : double 

So che suggerimento di tipo non primitivo è appena usato per evitare riflessioni. Da http://clojure.org/datatypes

  • nota che attualmente un tipo accenno di tipo non-primitivo non sarà utilizzato per vincolare il tipo di campo, né l'arg costruttore, ma sarà utilizzato per ottimizzare il suo uso nei metodi della classe

Grazie a tutti!

risposta

18

Ti piace questa:

(defrecord Signal [^doubles samples ^double sample-rate ^double scaling-factor]) 

Rich Hickey ha aggiunto questo un po 'indietro:

Aggiunto Tipo suggerimenti speciali per gli array primitivi - #^interi, #^carri, #^anela, #^raddoppia

Vedere http://clojure.org/news per una discussione su come funziona.

Non ho un ambiente Clojure con me per vedere se questo è ancora il modo migliore per farlo. Suppongo che il #^sintassi è stato aggiornato per^insieme a tutti gli altri suggerimenti di tipo a Clojure in 1.2

Edit: Un altro post del blog su di esso: http://asymmetrical-view.com/2009/07/02/clojure-primitive-arrays.html

5

sono d'accordo con la risposta di Levand su cui accenno tipo da utilizzare, ma potresti voler verificare se defrecord utilizza effettivamente questi suggerimenti tipo. Nella mia installazione (anche 1.2.0), non è così.

user=> (defrecord Signal [^doubles samples ^double sample-rate ^double scaling-factor]) 
user.Signal 
user=> (use '[clojure.contrib.repl-utils :only [show]])  
nil 
user=> (show Signal) 
=== public final user.Signal === 

[stuff deleted] 

[38] <init> (Object,Object,Object) 
[39] __extmap : Object 
[40] __meta : Object 
[41] sample_rate : Object 
[42] samples : Object 
[43] scaling_factor : Object 

[more stuff deleted] 

Come si può vedere, gli argomenti del costruttore (38) e le variabili membro (41-43) sono ancora pochi Object s. (Gli array sono riferimenti in ogni caso, ma sarà bello essere un giorno in grado di memorizzare i numeri disimballati in un record, una volta che la funzione viene implementata.)

4

di approfondire ciò che dreish ha scritto:

Come è attualmente implementato (1.2), i tipi hint non si manifestano nell'API (variabili di istanza, firme del costruttore/metodo), ma piuttosto sono usati per eliminare le chiamate di riflessione all'interno dell'ambito lessicale. Per esempio:

 
user=> (set! *warn-on-reflection* true) 
true 
user=> (defprotocol P (foo [p])) 
P 
user=> (defrecord R [n] P (foo [_] (.intValue n))) 
Reflection warning, NO_SOURCE_PATH:4 - reference to field intValue can't be resolved. 
user.R 
user=> (defrecord R [^Number n] P (foo [_] (.intValue n))) 
user.R 

Il problema che rimane è la boxe dei numeri primitivi, anche se un doppio array è-un oggetto, quindi non ci preoccupa.

Detto questo, credo che ci siano alcuni miglioramenti nel ramo principale (1.3) tali che le variabili di istanza, ecc., Possano essere emesse come tipi primitivi basati sul tipo di suggerimento.

Problemi correlati