alvisespano / Polygen

The famous random sentence generator.
Other
39 stars 9 forks source link

Generazione template #20

Open corzani opened 4 years ago

corzani commented 4 years ago

Questo non è propriamente un issue, è una feature proposal. Sarebbe interessante se Polygen, in aggiunta al suo classico comportamento, potesse generare dei template come fa Closure Template di Google (Soy Template) in modo che possa essere usato facilmente in un contesto web. Ovvero...

Data una grammatica in input tipo:

S ::= il Animale mangia Frutto ;
Animale ::= gatto | cane ;
Frutto ::= la mela | il mango ;

generare un file foo.js che possa essere utilizzato come:

const grammar = require('./foo.js')

console.log(grammar.get('S')) // Produce un output partendo dal simbolo S, ovvero "il gatto mangia la mela"
console.log(grammar.get('Animale')) // Produce "gatto" o "cane"
tajmone commented 4 years ago

Se ho capito bene, ti riferisci a questo progetto:

Premetto che non conosco Closure Templates, ma dal tuo esempio mi pare di capire che console.log(grammar.get('S')) implichi la generazione di grammatiche manipolabili tramite JavaScript.

Non posso certo rispondere a nome di Alvise, ma così ad occhio direi che esula dalle finalità di Polygen.

Il mio consiglio è quello di scrivere da zero un parser di grammatiche Polygen (in formato sorgente) e poi fornire un'interfaccia utente con le varie funzioni del caso (es. grammar.get('S')). Non dico che sia un compito facile (probabilmente non lo è affatto) ma lo iato tra OCaml e JavaScript è (a mio avviso) troppo grande da consentire una gestione come quella da te proposta.

D'altro canto, PML (Polygen Meta Language Spec 1.0) ovvero la specifica tecnica delle grammatiche Polygen, è di per sé "language-agnostic", concepita per poter essere implementata in diversi linguaggi.

corzani commented 4 years ago

Ciao Tristano, capisco bene cosa intendi, è indubbiamente un'aggiunta che implica una quantità di cambiamenti non indifferente. La mia proposta nasceva dal fatto che un tool come Polygen sarebbe molto interessante lato web, dove a mio avviso, troverebbe il suo spazio ideale. Sono arrivato a questa pagina perchè cercavo un modo per trasformare codice OCaml in JS e sono finito nella issue https://github.com/alvisespano/Polygen/issues/10

Per quel che riguarda l'issue di cui sopra, mi verrebbe da consigliarvi come alternativa... Kotlin, più che Scala. JetBrains ha fatto un buonissimo lavoro e con KotlinJS si può facilmente creare il corrispettivo Javascript. Quindi avere sia la parte su JVM che quella su JS in un unico code base.

Riguardo al tuo consiglio... anni fa dovetti testare un parser generator javascript e scrissi proprio delle regole per "parsare" la grammatica del Polygen che hai menzionato. Diciamo che il parser c'è... manca tutto il resto ;).

Grazie per la risposta.

tajmone commented 4 years ago

Quando fu creato questo repository, e Alvise decidette di rimettere mano ai sorgenti, non hai idea dei problemi che abbiamo dovuto affrontare per tentare di imbastire una toolchain OCaml su sistema operativo Windows. Nonostante la gloria passata di questo grande linguaggio (che io personalmente non conosco né ho usato, ma ne conosco le radici, ed essendo un fan di Rust sollevo il cappello a ML), oggi OCaml non è neanche più ufficialmente supportato per Windows.

Esistono versioni pseudo-ufficiali per Windows, ma per poterle usare godendo di un editor moderno è un vero incubo che richiede acrobazie con WSL per integrare plugin di editor che girano su Windows con applicazioni che girano su Linux (in WSL) usando Node.js come interfaccia (che è già tutto un dire, in fatto di sicurezza informatica, viste le falle di Node.js).

Alla fine io ho desistito a installarlo su Windows. L'idea originale era quella di poterlo compilare sbarazzandosi della dipendenza dalla DLL CygWin, ma il lavoro richiesto era troppo, specie per un linguaggio che non conosco.

Forse oggi sarebbe possibile ritentare, usando MSYS2, ma alla fine converebbe puntare su linguaggi più moderni come Haskell.

Comunque, mi sovviene che qualcuno sulla lista Polygen su Facebook abbia annunciato di aver realizzato un port di Polygen in PHP o JavaScript, non ricordo bene quale dei due, e da quel poco che ricordo (avendo sbirciato il progetto su GitHub) era quasi del tutto uguale a Polygen dal punto di vista della grammatica.

Se ti può interessare, cerco di recuperare quel link (so di averlo salvato sul PC) e te lo posto qui (dammi solo un po' di tempo).

tajmone commented 4 years ago

Ok @corzani, il link era a portata di mano tra i preferiti nel browser.

L'applicazione si chiama InstaGrammar, di Enrico Zeffiro, realizzata in JavaScript (è su Bitbucket, non su GitHub), disponibile anche tramite NPM:

Magari questo applicativo fa al caso tuo?

corzani commented 4 years ago

Perfetto, sei stato gentilissimo, grazie.

alvisespano commented 4 years ago

Grazie Tristano per aver risposto.

tajmone commented 4 years ago

Ci mancherebbe ... anche se non sono più riuscito ad essere presente nel progetto, cerco quantomeno di restare vigile.

L'interesse per PolyGen non tramonta mai! non credo ti "libererai mai" di PolyGen, ha lasciato un segno troppo marcato nella storia dell'informatica ed è destinato a far capolino nonostante le avversità dell'avvento di UTF-8, i mille problemi con la CygWin DLL, e quant'altro — nulla può arrestare la brama di chi vede nel PolyGen (l'unico, originale ed inimitabile) tutte le soluzioni ai problemi della propria esistenza.

D'altronde, in un'era in cui le nostre vite sono già state scritte a priori da statistiche e pianificazioni che mietono la creatività tanto di intere generazioni quanto dei singoli individui, quale altre via resta alla liberazione da tutti i mali se non affidarsi al caso ed al caos totali, e lasciare che essi siano la voce e l'oracolo della nostra vocazione repressa?! E quale strumento meglio di PolyGen è in grado di generare in maniera del tutto casuale le prescrizioni del nostro fato?

L'unica cosa che si potrebbe migliorare in PolyGen è aggiungere un'interfaccia che consenta l'uso di schede dedicate per la generazione casuale tramite seed entropici controllati da oscillatori al quarzo, come quelle usate nella crittografia militare. Allora saremo certi che i nostri oracoli saranno unici e irripetibili, sempre e comunque!

alvisespano commented 4 years ago

Sai che con me sfondi una porta aperta - anzi: un garage spalancato :)