Programmazione funzionale con JSL, chiunque?Qualcuno scrive JSL utilizzando la programmazione funzionale e, in tal caso, disponi di un set standard di funzioni che utilizzi?
Ad esempio, la funzione map semplificata di seguito svolge tutto il lavoro di un ciclo for, quindi è sufficiente specificare un'espressione e un elenco e la funzione restituisce un elenco con la funzione valutata per ciascun elemento. In R, una funzione simile e varianti della stessa possono essere trovate nel pacchetto "fusa" di Lionel Henry e Hadley Wickham.
// A function to evaluate an expression for each item in a list
//
// x__ A list
// fn__ An expression containing ___ (three underscores) that
// is replaced with each element of x__
//
// Returns a list the same length as x__.
//
map = function( {x__, fn__},
r__ = {};
for(i__ = 1, i__ <= N items( x__ ), i__++,
r__ = Insert( r__, Eval( substitute(Name Expr( fn__ ), Expr(___), Expr( x__[i__] ) ) ) );
);
return(r__);
);
//Data to evaluate
vals = { 1, 2, 3, -3, -2, 0.5, -1.1, 5.3, 2.7, 0 };
//number of entries above zero
map( vals, Expr( ___ > 0 ) );
//sum of fractional parts
sum( map( vals, Expr( Mod( ___, 1 ) ) ) );
Re: Programmazione funzionale con JSL, chiunque?Grazie molto 
Trasforma ciascuno.
Re: Programmazione funzionale con JSL, chiunque?In JMP 16 sono state introdotte tre funzioni che facilitano questo con funzioni native. Sembrano diversi dagli altri linguaggi ma sono altrettanto "funzionali" (ridendo del mio gioco di parole):
For Each() //Do something for each member - similar to apply
Transform Each() //Calculate something for each member - similar to map
Filter Each() //Return members for which a condition is true - similar to filter
Troverai maggiori informazioni su queste funzioni in questo file della guida:
https://www.jmp.com/support/help/en/17.1/index.shtml#page/jmp/conditional-and-logical-functions.shtml#ww10169888
Re: Programmazione funzionale con JSL, chiunque?Nel frattempo, c'è un carta geografica funzione ora direttamente disponibile in Jmp?
Così utile!
https://reference.wolfram.com/lingual/ref/Map.html
Re: Programmazione funzionale con JSL, chiunque?Ho bisogno di trascorrere un po' di tempo con la tua libreria poiché queste funzioni funzionano in modo leggermente diverso da quello a cui sono abituato, ma è fantastico e grazie per la condivisione!Senza dubbio mi hai appena fatto risparmiare un sacco di tempo!
Re: Programmazione funzionale con JSL, chiunque?È strano che tu mi abbia chiesto, ho implementato qualcosa del genere qualche mese fa e ho pensato che in quel momento potesse essere utile ad altri. L'ho appena pubblicato qui: https://community.jmp.com/t5/JMP-Scripts/MFR-a-Functional-Programming-Library-for-JSL/ta-p/47803
Spero che lo troverai utile.
A proposito, preferisco usare funzioni anonime rispetto alle espressioni, anche se dovevo passare da una all'altra a seconda del problema che stavo cercando di risolvere.
Re: Programmazione funzionale con JSL, chiunque?La funzione if memorizzata è un po' un trucco ed è per questo che l'ho elencata per seconda. La funzione analizza l'elenco per generare l'istruzione if e quindi scrive quel JSL in un file che viene quindi incluso nel programma.
Ho provato una funzione che creava le istruzioni if al volo, ma il miglioramento delle prestazioni è stato enorme e mi sono reso conto che il codice era piuttosto statico, quindi era più semplice memorizzare la funzione if generata e quindi utilizzarla.Re: Programmazione funzionale con JSL, chiunque?Come si passa il codice da valutare alla funzione if memorizzata?Oggi utilizzo sia le espressioni che le funzioni, ma in futuro intendo standardizzare un unico set.
Una funzione map di esempio che valuta un'altra funzione:
map = function( {x, fn},
r = {};
for(i = 1, i <= N items( x ), i++,
r = Insert( r, fn( x[i] ) );
);
return(r);
);
//Anonymous function
map({1, 2, 3}, function({n}, n/2));
//Named function
foo = function( {v}, v * 2 );
map({1, 2, 3}, Expr( foo ) );Re: Programmazione funzionale con JSL, chiunque?Ho utilizzato questo approccio e dispongo di funzioni per generare diari dinamici da una tabella di dati, convertire una tabella in elenchi nidificati e viceversa e generare finestre di dialogo dell'interfaccia utente.
Ho anche usato JSL per scrivere funzioni if complesse che utilizzo molto (elenca le condizioni, i cambiamenti di stato su true e i cambiamenti di stato quando non sono più true (opzionale)), poiché mi stavo stancando di eseguire il debug dei miei errori di battitura.