Ho notato che la funzione Remove From() non funziona come previsto (e la sua documentazione è scritta in modo errato sia nell'Indice di scripting che nella Guida di JMP). Sembra comportarsi in modo irrazionale quando l'ultimo elemento viene rimosso dall'elenco.
Ho contattato l'assistenza JMP a riguardo. Secondo loro, il comportamento previsto è il seguente (lo stesso che mi aspetterei):
Il comportamento previsto è che Remove From restituisca gli elementi rimossi, come mostrato nell'esempio per i primi 9 elementi. Inoltre, modifica il contenitore di input rimuovendo gli elementi.
Devo ancora ricevere loro notizie sulla tempistica con cui questo problema verrà risolto e la documentazione aggiornata. Vi farò sapere se avrò notizie con i tempi previsti.
Esempio e una "soluzione alternativa" (se proprio ho bisogno dello stesso comportamento di Remove From, per ora scriverò una mia funzione):
Names Default To Here(1);
m = 1::10;
For Each({item}, m,
earlier_m = m;
// Returns: The original source with the items deleted.
// Doesn't this return deleted list (except when it is last element...)
removed = Remove From(m, 1);
Print(Eval Insert("^removed^ removed from ^earlier_m^"));
);
// workaround?
m = 1::10;
For Each({item}, m,
earlier_m = m;
removed = m[1];
Remove From(m, 1);
Print(Eval Insert("^removed^ removed from ^earlier_m^"));
);
Grazie per la segnalazione. Si noti che questo bug si applica alle chiamate a RemoveFrom() utilizzate su un vettore (matrice) e non ai contenitori di elenchi.
La tua soluzione alternativa sembra ragionevole per i vettori. Se la utilizzi su un elenco, tieni presente che creerai una copia del primo elemento. Per la maggior parte dei tipi, questa soluzione andrà bene: copiare un elemento che fa riferimento a una casella di visualizzazione, una tabella dati o una piattaforma creerà semplicemente un altro simbolo che fa riferimento allo stesso oggetto. Se gli elementi dell'elenco contengono elementi come matrici di grandi dimensioni o array associativi, creerai una copia duplicata di questo oggetto. Anche questo potrebbe non avere un effetto significativo, ma la semantica della soluzione alternativa è leggermente diversa.