Open gciatto opened 3 years ago
These notes are relative to version 1.1.1
of the slides:
======= 12/05/2021 su nuove slide v. 1.1.1 =======
NB è cambiata la numerazione, non mi ci raccapezzo: ho solo capito che la vecchia slide 90 ora è la 101, ma non so dove abbia inserito nuove slide prima.
===================================================
OCCHIO: tutti i link cliccabili portano nel posto sbagliato, es slide 146 nuva, cliccando sulla riga evidenziata si zompa 200 slide avanti
slide 143 nuova: resto perplesso sul '_0' emesso per tutte le variabili, non le distingue. Non dovrebbe essere _0, _1, ... ?
Vale sui primi due formatter. Altrimenti sembrano la stessa variabile..
Inoltre, sempre nell'esempio: il termine '$VAR' ha un significato particolare? Se no, se è solo un esempio di termine "strano", non aiuta la comprensione aver scelto proprio "VAR" come nome.
Meglio qualcosa di diverso, agnostico, privo di qualsiasi pre-significato inteso.
Se invece avesse un significato specifico andrebbe detto perché da qui non emerge.
slide 144-146 (eccezioni): vedi dubbi sopra, ossia il dubbio di cui alle slide 99/100 (vecchia numerazione) e l'opportunità, viceversa, di aggiungere magari un'eccezione per il caso della slide 107 (ora 119, penso)
slide 154: avrebbe bisogno di due parole di spiegazione sotto, per chiarire dove sia esattamente l'effetto del cached unificator. Ossia: al di là del fatto che abbia cachato, dove
sta il guadagno? Dove lo vedo? Dall'esempio non mi sembra si veda
slide 156: carino l'esempio del custom unificator, ma per maggior chiarezza chiamerei quell'unificatore "myUnificator", perché "unificator" è un po' vago..
slide 157: (infix) molto carino :)
--slide 158 e seguenti (collections)
slide 162: non dice cosa sia un RetrieveResult e questo rende di difficile comprensione il successivo esempio alla slide 169.
Aggiungerei: "returns the pair (retrieved element, rest of the collection) as a suitable RetrieveResult instance"
slide 169: esempi retrieve: ok, ma rimuovere proprio f(1) con retrieveFirst può far pensare che rimuova il primo elemento, che solo casualmente è f(1), non "il primo che fa match".
Suggerirei di rimuovere f(2), così si capisce meglio. Richiamerei anche la spiegazione sopra (cfr commento alla slide 162)
Inoltre, servirebbe un ulteriore esempio da inserire nella slide 170: che succede se faccio retrieve f(X)? Lì sì che si capisce cosa significhi "retrieve FIRST".
Se poi i fatti fossero più sofisticati, es. f(a,1), f(a,2), f(b,3), f(b,5), f(c,4), si potrebbe fare una retrieve(f(b,X)) e vedere cosa restituisce.
[ vedi anche slide 182, discorso analogo ]
slide 177: aggiungere che plus si rimappa sull'operatore + (forse scontato ma non fa male ribadirlo, non tutti sono familiar con Kotlin a questo livello, e ogni linguaggio fa a suo modo a questo riguardo)
slide 178: occorre specificare cosa sono i dati dei due casi concreti Success e Failure, soprattutto il primo
slide 182: vedi commento alla slide 169
slide 185: English --> composed OF (by si usa solo per i brani musicali, dove c'è un autore)
slide 186: "implemented in Kotlin" -- necessariamente? solo Kotlin? o volendo anche Java, Scala, etc.?
slide 193: carrying some variableS
--nota preliminare alla osservazioni seguenti: ANTICIPARE LE DUE SLIDE 206/7! altrimenti non si capisce nulla
slide 197: compare dal nulla Solver.classic che NON era presente né nell'UML precedente né nelle descrizioni. Immagino chi sia, ma non è mai detto che ci siano dei solver "predefiniti" - quali?
Inoltre andrebbe detto che l'identiticatore staticKb si riferisce alla proprietà omonima.. capisco sembri tautologico ma non lo è..
slide 199: idem con patate, qui compare anche Solver.classic.solverOf che non si capisce cosa faccia di diverso dai solverWithBuiltins precedenti.. è un alias per 0 builtins? (cfr. slide 201)
slide 200: occorre un commento sotto che contestualizzi la scelta di 1 ms - potrebbe essere troppo poco in una macchina, yielding no solutions, o più del previsto in un'altra, yielding magari 2 o 3 soluzioni.
Scritto così, il risultato è indeterminabile a priori...!
slide 201: vedi commento alla slide 199, va chiarito cosa fanno queste factory
Inoltre: va chiarito il tipo di solution.exception: se lo converti in HaltException per beccare l'exitStatus, significa che era qualcos'altro, più generale => diciamolo
slide 200 vs 202: a volte si usa factOf, a volte Fact.of: non ci si raccapezza più. Sono la stessa cosa? Non lo sono? Qual è la ratio d'uso?
(vedi anche slide 205)
slide 204: scritto così, la questione mutable/immutable solvers è tutto fuorché chiara. Riformulerei tutta la descrizione, così:
solvers are immutable by users, and only expose properties for the inspection of their state
- e.g., their state changes, but only because of internal resolution steps, not due to external actions
mutable solvers, instead, expose methods enabling users to explicitly alter the solver state
slide 205: qui di nuovo si usa solverOf MA POI si caricano anche dei builtins.. come detto sopra ci sono forse troppi modi diversi, ma simili, di costruire le cose: non si coglie la ratio di quando usare l'uno e quando l'altro
slide 206/7: ADESSO lo dice?
slide 208: non è chiaro cosa siano solve-classic (col trattino, in italic) e la consorella solve-streams (non è mai stato detto)
inoltre, dye typo: "accessbile" --> accessible; e nel box rosa, SolveFactory --> SolverFactory (anche slide 313)
MA SOPRATTUTTO: qui manca l'UML che mostri la gerarchia, senza la quale l'esempio alla slide 210 non si segue compiutamente (perché usa la classe astratta SolverFactory)
slide 209: vale il commento alla slide 205, ne presenterei UNO SOLO, il resto declassiamolo a scelta interna. Manterrei Solver.classic e Solver.streams, e renderei nascoste le due classi XXSolverFactory
slide 210: va sviluppato con qualcosa di più, perché così si intuisce appena ma dà troppo per scontato, è un esempio che non esemplifica
slide 212: English: mancano due "it" --> it is currently focussing / it has constructed so far
slide 214: formulazione della frase altamente misleading, quel novel (Mutable)SOlver fa pensare che si crei un mutable solver sempre, invece intende solo con il factory method mutable. Rifraserei opportunamente
slide 216: ... or register/2 (the latter, from the :oop-lib module)
slide 217: i mutable solvers possono SOLO ricevere la loro KB dinamicamente, o ANCHE prima, come i solver classici? Scritto così è ambiguo -> chiarire
slide 218: scritto così, l'esempio è potenzialmente misleading perché può far pensare che le due println in qualche modo dipendano dalle due teorie definite inizialmente, che invece NON sono state ancora usate.
Opportuno scambiare l'ordine delle righe: PRIMA le tre righe col solver+le due println, POI le definizione di theory1 e 2, che socì verrebbero usate subito dopo. Lindo e chiaro :)
slide 220: typo: provisioing --> manca una N
slide 221: typo: proprity --> priority
slide 222: opportuno aggiungere un commento, o nel codice o sotto, circa il fatto che il predicato g/1 viene trasferito d'autorità nella dynamic KB proprio a causa della direttiva, cosicché la dynamicKB non è vuota e la staticKB non contiene g/1
slide 225: come 186, solo in Kotlin?
slide 226: qualcosa non torna.. Jiesava? Inoltre il Camel Case non è quello, anzi qui sembra tutto minuscolo!
A parte ciò, servirebbe spiegare meglio la NECESSITA' di questi alias, oltre a darne la sintassi: a che servono? Che bisogno soddisfano? Non è scontato, uno non se lo aspetta.. motivare!
slide 230: il commento nelle functions ha un doppio "here" che probabilmente è un typo
Inoltre: scrivere "alias.of.the.lib" coi dots fa pensare che sia una naming convention: se lo è, va spiegato meglio perché non si capisce (cfr se non alla slide 235 dopo, NDR)
altrimenti a questo stadio eviterei: meglio un commento come negli altri casi sotto, così è anche uniforme, poi il dettaglio emerge dopo (slide 235) e lì si capisce
slide 231: ultimo bullet, IP? In generale eviterei acronimi non ovvi
slide 232: "lazily enumerated" intende LE SOLUZIONI? Non è scritto -> va precisato (si potrebbe pensare fossero le primitive, visto che si parla di loro, ma parrebbe strano)
slide 234: "in code" ..? non c'è codice --> va nella slide seguente 235, penso
slide 235/6: magari due righe di spiegazione/commento in più ci starebbero.. chi legge deve indovinare sia che predicato sia, sia l'uso di certe strutture (es. sequenceOf) che magari sono state presentate, ma centinaia di slide fa
In particolare, slide 236: perché usi BigInteger.ZERO invece di Integer? (cfr anche slide 246) Serve un commento per il lettore altrimenti ci si perde
slide 242: ma println non dovrebbe stampare " a :- true. b:-true. c:-true", secondo quanto mostrato in precedenza? Ora invece il ":-true" viene omesso..?
Inoltre sarebbe utile un commento alla riga chiave del codice perché ci sono molte cose date per scontate.. agevolerei il povero lettore
slide 243: più che "Problem" intitolerei il box "Issue", perché non è un problema (di 2P o di altri), è una caratteristica che serve supportare per rispondere a un'esigenza del mondo
slide 246: ok, ma perché usi BigInteger.ONE invece di Integer? (cfr anche slide 236) Serve un commento per il lettore altrimenti ci si perde
Inoltre occorrerebbe commentare anche il caso else: perché qui nopn lanci eccezione se l'argomento non è intero? Stai definendo next(pippo) come pippo? Alquanto arbitrario, per lo meno va detto...
slide 247: typo: evalued --> evaluated
slide 250: anche qui il codice avrebbe bisogno di qualche commento, la parte chiave (il when) è difficile da seguire, è molto dato per scontato che chi legge sappia/ricordi tutto
slide 251: nell'ottica di un manuale comprensibile a tutti, eviterei "prosumers" che come termine è un po' aulico. Sostituirei com "both consumers and producers"
Soprattutto:cos'è MP??
slide 252: univoke non esiste! -> unique, unambiguous
slide 256: if the channel is over --> has reached EOF (o altra formulazione: is over non mi pare si possa dire qui, non è un'attività..)
slide 258: riformulerei l'ultima frase, solo perché dire "out of" in un InputChannel fa un po' specie --> from
Inoltre: nel caso JS quindi cosa si può usare in alternativa? Viene spontaneo chiederselo, visto che poi per gli output il mapping su Console.log e Console.error invece c'è
slide 259: typos nel commento --> blockS until a line IS prompted
slide 262: ChannelStore o ..chi? Il titolo della slide si riferisce a una entità che NON C'E' NELLO SCHEMA
slide 266: servirebbe un commento per stdOut, la lambda con quell'it non rende chiaro chi sia it in quel contesto, si deduce solo dalle stampe dopo ma non è chiarissimo
slides 268-9-270: ma se NotableFlag serve solo per il builtin, perché non si chiama BuiltinFlag..?
slide 274: typo: perfomed (manca una R)
slide 275: typo: prints NOTING -> Nothing
slide 279: dire che l'eccezione "provokes" un certo evento mi sembra fuorviante, solitamente è il contrario: viene lanciata in risposta a tale evento, che quindi è già accaduto per cause esterne
slide 296: allargare figura, è illeggibile
slide 298: comes with 4 "more" abstract sub-classes -- more? Non ha senso, sono sottoclassi.. se invece era "4 more", è inutile --> 4
Inoltre, "to be preferred" fa pensare che sia solo un consiglio, ma dal contesto sembrerebbe di fatto l'unica scelta coerente --> to be CHOSEN
slide 304: dubbio riguardo al TypeError: il secondo argomento può anche ssere variabile, scritto così è riduttivo (per non dire errato)
slide 313: anche qui typo SolveFactory -> SolverFactory (manca la R)
inoltre, altro typo "are no excetion" (manca la P)
infine, anche qui non è chiaro il modo di scrivere ":solve-classic" e ":solve.streams"
=== arrivato alla slide 318: INIZIARE MACCHINA A STATI, solve-classic module
The following notes are relative to version
0.32.0
of the slides: