Common Lisp - Programming Languages from Hell
Transcription
Common Lisp - Programming Languages from Hell
Common Lisp Kategorisierung S-Expressions Variablenbindung Common Lisp Programming Languages from Hell Thomas Reschenhofer TU-München Sommersemester 2010 CLOS Common Lisp - Fazit Common Lisp Kategorisierung S-Expressions Variablenbindung Agenda Überblick über Common Lisp • Kategorisierung • S-Expressions • Makros • Reader-Makros • Variablenbindung • lexikalische Bindung • dynamische Bindung • CLOS • Method Dispatching • Metaprogramming CLOS Common Lisp - Fazit Common Lisp Kategorisierung S-Expressions Variablenbindung Kategorisierung Kategorisierung • Funktional • Imperativ • Objektorientiert • Strikt auswertend • Dynamisch getypt • Reflexiv CLOS Common Lisp - Fazit Common Lisp Kategorisierung S-Expressions Variablenbindung S-Expressions Allgemeines zur Syntax • Code als S-Expressions • S-Expressions sind verschachtelte Listen CLOS Common Lisp - Fazit Common Lisp Kategorisierung S-Expressions Variablenbindung Makros (Normale) Makros in Common Lisp • Transformation des Syntaxbaumes • Ausführung in der Macro Expansion Time Example ( defmacro i ( operand1 operator operand2 ) ( list operator operand1 operand2 )) CLOS Common Lisp - Fazit Common Lisp Kategorisierung S-Expressions Variablenbindung CLOS Common Lisp - Fazit Reader-Makros Reader-Makros in Common Lisp • Manipulation der Syntax • Ausführung noch vor dem Reader Example ( s e t - m a c r o - c h a r a c t e r #\[ # ’( lambda ( stream char ) ( let (( sexpr ( r e a d - d e l i m i t e d - l i s t #\] stream t ))) ( list ( second sexpr ) ( first sexpr ) ( third sexpr ))))) ( s e t - m a c r o - c h a r a c t e r #\] ( g e t - m a c r o - c h a r a c t e r #\) )) Common Lisp Kategorisierung S-Expressions Variablenbindung Zusammenfassend Unterschied zu Funktionen • Makros in Macro Expansion Time • Reader-Makros noch vor Reader • Keine Runtime - Daten • Parameterwerte sind S-Expressions/Code CLOS Common Lisp - Fazit Common Lisp S-Expressions Kategorisierung Variablenbindung Variablenbindung Als Einführung Wie verhält sich z.B. Java? Example static int x = 1; static int foo () { return x ; } public static void main ( String [] args ) { int x = 2; print ( foo ()); } Ausgabe 1 CLOS Common Lisp - Fazit Common Lisp Kategorisierung S-Expressions Variablenbindung CLOS Lexikalische Variablenbindung Lexikalische Variablenbindung in Common Lisp • Mit let • Gleichnamige “globalere” Variablen werden überdeckt Example ( let (( x 1)) ( defun foo () x ) ( let (( x 2)) ( print ( foo )))) Ausgabe 1 Common Lisp - Fazit Common Lisp Kategorisierung S-Expressions Variablenbindung CLOS Dynamische Variablenbindung Dynamische Variablenbindung in Common Lisp • Mit defvar • Gleichnamige “globalere” Variablen erhalten neuen Wert • Bis Ende des Gültigkeitsbereiches Example ( defvar x 1) ( defun foo () x ) ( let (( x 2)) ;Anfang Gültigkeitsbereich ( print ( foo ))) ;Ende Gültigkeitsbereich ( print ( foo )) Ausgabe 2 1 Common Lisp - Fazit Common Lisp Kategorisierung S-Expressions Variablenbindung Zusammenfassend Einsatz • Einfache, temporäre Anpassung der Umgebung • Standardbeispiel: Standard-Output Problem Schwindende Übersicht/Berechenbarkeit • durch steigende Komplexität des Programms • durch Multithreading Abhilfe: Namenskonvention ( defvar * var-name * value ) ( defvar var-name value ) ;Richtig ; Falsch CLOS Common Lisp - Fazit Common Lisp Kategorisierung S-Expressions Variablenbindung CLOS Common Lisp Object System Klassen • (Mehrfach-) Vererbung • Slots Generische Funktionen • Spezialisierungen • Methodenkombinationen Common Lisp - Fazit Common Lisp Kategorisierung S-Expressions Variablenbindung CLOS Common Lisp - Fazit Common Lisp Object System - Klassendefinition Example ( defclass shape () ()) ( defclass rectangle ( shape ) (( height : initform 5) ( width : initform 5))) ( defclass circle ( shape ) (( radius : initform 5))) ;Instanzierung ( defvar my-rec ( make-instance ’ rectangle )) Common Lisp S-Expressions Kategorisierung Variablenbindung CLOS Kommunikationsarten Message Passing • Methoden werden in Klassen gruppiert • Klasse bestimmt aufzurufende Methode • Beispiel (Java): myObject . message ( param ); Method Dispatching bzw. Generic Dispatching • Methoden werden mit generischeren Funktionen gruppiert • Generische Funktion bestimmt aufzurufende Methoden Common Lisp - Fazit Common Lisp Kategorisierung S-Expressions Variablenbindung Method Dispatching CLOS Common Lisp - Fazit Common Lisp Kategorisierung S-Expressions Variablenbindung CLOS Generische Funktionen - Beispiel Example ( defgeneric area ( any-shape )) ( defmethod area : before (( s shape )) ( print " Area of shape : " )) ( defmethod area (( c circle )) ( print (* 3.14159 ( square ( slot-value c ’ radius ))))) ( defmethod area (( r rectangle )) ( print (* ( slot-value r ’ height ) ( slot-value r ’ width )))) ( area my-rec ) Ausgabe ‘‘Area of shape: ‘‘ 25 Common Lisp - Fazit Common Lisp Kategorisierung S-Expressions Variablenbindung CLOS Common Lisp - Fazit Metaobject Protocol Was ist ein Metaobject? • Alle Klassen, Slots, Methoden,. . . sind auch Objekte = Metaobjects • Besitzen Eigenschaften • Basis- und Subklassen • Initialwerte • Method Qualifier Was ist ein Metaobject Protocol? • Verhalten & Möglichkeiten der Metaobjects heißt Metaobject Protocol • Einsatz des MOP heißt Metaprogramming Common Lisp Kategorisierung S-Expressions Variablenbindung CLOS Metaobject Protocol - Beispiel Example ( area my-rec ) ( let (( m ( find-method # ’ area ( list ’: before ) ( list ( find-class ’ shape ))))) ( setf ( first ( m e t h o d - q u a l i f i e r s m )) ’: after )) ( area my-rec ) Ausgabe ‘‘Area of shape: ‘‘ 25 ---------------25 ‘‘Area of shape: ‘‘ Common Lisp - Fazit Common Lisp S-Expressions Kategorisierung Variablenbindung CLOS Common Lisp - Fazit Zusammenfassend Common Lisp Object System • Führt das Klassenkonzept ein • Führt generische Funktionen ein Method Dispatching • Pendant zu Message Passing • Erlaubt Kaskadieren von Methoden (Methodenkombinationen) Metaobject Protocol • Erlaubt Implementierung von domain specific languages • Manipulation des Verhaltens zur Laufzeit Common Lisp S-Expressions Kategorisierung Variablenbindung CLOS Common Lisp - Fazit S-Expressions/Makros • Sehr mächtiges Makrosystem • Manipulation der Sprache durch die Sprache selbst Dynamische Variablenbindung • Einfache, temporäre Anpassung der Laufzeitumgebung • Unübersichtlichkeit und Unberechenbarkeit Common Lisp Object System • Method Dispatching • MOP als Möglichkeit, Objekte zur Laufzeit anzupassen Common Lisp - Fazit