2015-01-19 11 views
8

Visto che è possibile limitare i parametri delle funzioni a tipi di dati specifici, è ovvio che si potrebbe voler definire il proprio tipo di dati, ma non riesco a vedere nulla nei documenti di Rebol che suggeriscono questo come una caratteristica della lingua (a meno che io non sembra molto bene).Come si definisce il proprio tipo di dati in Rebol?

Quello che mi aspetto è la possibilità di fare qualcosa di simile al seguente:

mytype!: make datatype! ... ; some spec here 

è possibile? Quanto segue non mi riempie con molta speranza:

http://www.rebol.it/giesse/custom-types.r

Dal link:

Scopo: { permette al programmatore di definire i tipi di dati REBOL personalizzato }

E ' è un pezzo di codice piuttosto lungo. Non quello che speravo.

risposta

4

Spesso suggerito, ad oggi non implementato available only as an experimental patch by Giulio.

Eventuali utili proposte tipo di dati personalizzati vengono solitamente insieme con il desiderio di agganciarli in modo che potessero efficacemente cose "sovraccarico" come + o accodare. C'è uno strato interno di astrazione chiamato AZIONE! che in teoria fornisce un posto per mettere questi ganci:

>> type? :append 
== action! 

azioni sono una sorta di "chiamata al metodo" (cioè polimorfica) sul primo argomento, a cui vengono fatti passare i parametri successivi. Attualmente non vi è alcun modo esposto per gli utenti di creare azioni o creare un nuovo tipo di dati che risponde a loro.

Per Rebol 3, i tipi di dati definiti dall'utente sono proposti sotto il moniker "utype" - dai un'occhiata a "What's known about UTYPE! in Rebol?" per ulteriori informazioni.

Nel objects announcement for Red, però, ho notato alcune ammenda di stampa alla fine:

Al fine di aiutare il compilatore Red produrre codice più corto e più veloce, sarà introdotta una nuova direttiva #alias compilazione. Questa direttiva consentirà agli utenti di trasformare una definizione di oggetto in un tipo "virtuale" che può essere utilizzato in blocchi di tipo spec. Per esempio:

#alias book!: object [ 
    title: author: year: none 
    banner: does [form reduce [author "wrote" title "in" year]] 
] 

display: func [b [book!]][ 
    print b/banner 
] 

Questa aggiunta non solo permettere di tipo grana fine il controllo per gli argomenti, ma anche aiutare l'utente a documentare meglio il loro codice.

5

provato un'implementazione di utypes in https://github.com/giuliolunati/rebol/tree/utype

Come esempio, ho implementato complex! utype

Fondamentalmente, utypes vengono implementati come oggetti con metodi speciali a forma tratteggiata: così, .add implementa l'+ op eccetera.

Per ora è possibile sovraccaricare tutte le azioni (ma apportare) e alcuni nativi (funzioni matematiche, confronto, forma, stampo, stampa, sonda)

Problemi correlati