2013-01-17 10 views
6

Molte operazioni comuni sulle raccolte in Julia, come l'eliminazione di un elemento da un Set, sono state ridenominate di recente, con le vecchie funzioni deprecate.Perché queste operazioni comuni sulle raccolte sono state ridenominate in Julia?

Per esempio,

del(IntSet(1,2,3), 1) 

ora si solleva un avvertimento

WARNING: del is deprecated, use delete! instead. 

Alcune delle funzioni rinominati:

@deprecate push  push! 
@deprecate pop   pop! 
@deprecate grow  grow! 
@deprecate enqueue  unshift! 
@deprecate unshift  unshift! 
@deprecate shift  shift! 
@deprecate insert  insert! 
@deprecate del   delete! 
@deprecate del_all  empty! 

Perché sono stati rinominati questi? Aggiungere un! alle funzioni che cambiano lo stato di una raccolta ora una convenzione?

+0

Non ho esperienza con Julia (non ne avevo mai sentito parlare prima) ma ho visto il suffisso '!' In altre lingue. Da una prospettiva di programmazione funzionale, '!' Indica una funzione in cui lo scopo principale è un effetto collaterale mutante. A prima vista Julia sembra essere degnata con l'elaborazione di parellel in mente e la mutabilità aumenta la complessità in concorrenza: così il '!' Rafforzerebbe il fatto che quella chiamata particolare avrebbe bisogno di ulteriore attenzione a tale riguardo (e una funzione alternativa potrebbe essere un'alternativa migliore) . –

risposta

9

È possibile leggere la filettatura julia-devhere. Fondamentalmente, è semplicemente cambiando rispettare la regola descritta nella documentazione arrays:

L'ultima funzione, riempire !, è differente in quanto modifica un matrice attuale invece di costruire uno nuovo. Come convenzione, le funzioni con questa proprietà hanno nomi che terminano con un punto esclamativo. Queste funzioni sono talvolta denominate funzioni "mutanti" o "in-place" .

FWIW Penso che questa sia una buona idea, almeno per Base.

7

L'uso di ! era sempre una convenzione esplicita per indicare la mutazione, non è stata applicata correttamente fino a poco tempo fa. Per push, si potrebbe facilmente sostenere che non è essenziale. Ma usando push! invece di push si rende chiaro che la mutazione avviene in questo caso esattamente nello stesso modo in cui avviene la mutazione quando si utilizza sort!, che è molto diversa da sort.

Questa convenzione punto esclamativo esiste in Schema e Ruby e probabilmente in molte altre lingue. Non esiste in un linguaggio come R che non consentirebbe di eseguire la mutazione senza ricorrere alle viscere sottostanti del linguaggio.

Problemi correlati