• LISt Processor • Lots of Irritants Superfluous Parentheses • Tree-data structure (vs array) • Pionere: dynamic typing, garbage collector, funzioni first class... • Compilatori self-hosted • Code is data
implementation are not so good for: • Persistent storage • Maximizing resource on small machines • Projects with hundreds of programmers • Close communication with foreign code • Delivering small-image applications • Real-time control • Projects with inexperienced Lisp programmers • Some kind of numerical computation • Exploratory Programming • Rapid Prototyping • Minimizing type to market • Single-digit team projects • Compilers & translator • Dynamic dispatch & creation • Tight integration of modules • High degree of interaction • User extensibility Norvig & Pitman – Tutorial on Good Lisp Programming Style - 1993
dal processore, dal compilatore e dal sistema operativo • Il codice è compilabile da qualsiasi compilatore C/C++/objC, su processori a 32 e 64 bit, qualsiasi endianess • Uso di trampolini per supportare tail calls • Altri backend (in sviluppo): x86, ARM, javascript, “universal”
codice sorgente di Gambit non è scritto in scheme ma in C (no ASM), principalmente riguarda l'interfaccia con il SO • Il runtime dipende esclusivamente dalle librerie standard C (clib) • Le applicazioni possono essere distribuite come insieme di “.c” files, Gambit non è richesto sul sistema target
legge la variabile globale “car” ;; 2- verifica che sia una funzione ;; 3- chiama la funzione (declare (standard-bindings)) (car x) ;; Il compilatore sa che “car” ha il ;; significato predefinito ;; e può mettere la chiamata inline
in questo file non vengono mutate (fixnum) ; utilizza solo artimetica fixed (flonum) ; utilizza solo aritmetica float (not safe) ; disabilita il type-checking (debug) ; genera informazioni aggiuntive (not proper-tail-calls) ; disabilita tco (not interrupts-enable) ; disabilita interrupts checks ; (usare con cautela!)
• Closure, continuations, strutture cicliche • Utilizzate per computazione distrubuiti (es: termite) • Sorgente e destinazione possono differire per sistema operativo, processore, word-size, endianess... • Possibilità di definire encoders/decoders per oggetti non serializzabili univocamente (ports, threads...)
…) • Librerie da Gambit (base64, http, …) • Librerie custom (sqlite bindings, csv...) • Web Server • Protocolli usati in sistemi SCADA (fetchwrite, modbus)
Scada (modbus, fetchwrite) in Scheme • Una singola applicazione contiene il web server e l'unità di acquisizione (comunicazione con il PLC) • Unico punto di accesso al db, concorenza gestita dallo scheduler di Gambit (più efficient del locking di sqlite) • Ultimi dati acquisiti immediatamente disponibili al client, senza necessità di accesso al db) • Non (ancora) in produzione.
in C, le applicazioni scritte in Gambit sono ammesse dalle condizioni Apple • Applicazioni esistenti: Farmageddon (gioco 3D), Reversi (gioco strategico), Gambit REPL (sviluppo/educazione) • Possibilitá di sviluppo interattivo grazie al remote REPL, ad esempio connetendosi con Emacs • Infrastruttura di sviluppo inclusa nella distribuzione standard di Gambit.