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

Documents pareils