Umdruck Grafische Datenverarbeitung

Umdruck Grafische Datenverarbeitung Die Programmiersprache Scheme Scheme ist eine Interpretersprache, die sich in ihrer Syntax eng an Lisp anlehnt. Üb...
Author: Sigrid Esser
4 downloads 0 Views 59KB Size
Umdruck Grafische Datenverarbeitung Die Programmiersprache Scheme Scheme ist eine Interpretersprache, die sich in ihrer Syntax eng an Lisp anlehnt. Über spezielle Funktionen ist die Einbettung des Modellierers Acis in die Sprache realisiert. Jeder unterstützten Acisfunktionalität stehen ein oder mehrere Schemefunktionen gegenüber. Scheme ist wie Lisp funktions- und listenorientiert. Notation und Terminologie Klammern Scheme verwendet Klammern (), um Programme und Daten zusammenzufassen. Klammern treten immer paarweise auf. Eine Einschränkung der Klammertiefe besteht nur aufgrund des beschränkten Adressraumes. Namenskonventionen Scheme verwendet die folgenden Namenskonventionen: ? am Ende eines Prädikatsnamens (Funktionsnamens) zeigt an, daß ein boolescher Datentyp zurückgegeben wird. (#t für TRUE oder #f für FALSE). ! am Ende eines Prädikatsnamens zeigt an, daß ein vorher definierter Speicherplatz in seinem Wert geändert wird ( set! FARBE 2 setzt die Variable FARBE auf den Wert 2). -> in einem Prädiktsnamen zeigt an, daß die Funktion eine Konverteirung des Datentyps vornimmt (list->vector konvertiert eine Liste in einen Vektor mit den Elementen der Liste). Lexikalische Konventionen Groß- und Kleinschreibung werden unterschieden. Bezeichner Bezeichner in Scheme bestehen aus einer Folge von Buchstaben, Ziffern und Sonderzeichen. Bezeichner beginnen immer mit einem Buchstaben. Auch die Sonderzeichen +,-,*,/ do or and else quasiquote begin if quote

case lambda set! cond let unquote define let* unquote-splicing delay letrec Trennzeichen und Kommentare Leerzeichen und Zeilenendezeichen werden als Trennzeichen interpretiert. Trennzeichen trennen Sprachelemente gegeneinander. Leerzeichen dürfen aber in Zeichenketten (strings) vorkommen. Ein Semikolon ";" kennzeichnet den Start eines Kommentars, der bis zum Zeilenende reicht. Weitere Notationen .+- Dürfen überall in einem Bezeichner verwendet werden, nur nicht am Anfang. Alleinstehend sind sie Prädikate. . bezeichnet Paare. ... ist ebenfalls ein Prädikat. () Für Gruppen und Listen ' Zeigt Ausdrücke an, die nicht ausgewertet werden sollen ` Bezeichnet Konstanten ,@ wird in Verbindung mit ` verwendet " Begrenzer für Strings \ Escape Zeichen innerhalb von Strings # Leitet Konstanten ein #\ Einleitung einer Characterkonstante #( Einleitung einer Vektorkonstante #b #o #d #x Für die Bezeichnung von Zahlen Basiskonzepte Variablen und Regionen Jeder Bezeichner (identifier), bei dem es sich nicht um ein syntaktisches Schlüsselwort handelt, wird als Variable benutzt. Eine Variable, die einen Speicherplatz bezeichnet, ist an diesen gebunden (bound). Die Menge aller Variable zu einem bestimmten Zeitpunkt oder an einer bestimmten Stelle wird als Umgebung (environment) bezeichnet. Speicherplatz wird mit Ausdrücken wie define, let, let* und letrec angefordert und an Variable gebunden.

True und False Die Werte für WAHR und FALSCH lauten #t und #f. Ein NIL gibt es nicht. Die Leere Liste wird als #t interpretiert. Abfrageprädikate Mit den folgenden Prädikaten kann auf die gleichnamigen Datentypen geprüft werden: boolean?, pair?, symbol?, number?, char?, string?, vector?, procedure? Ausdrücke Ausdrücke geben immer einen Wert zurück, wie Variablenbezeichner, Literal, Prozeduraufruf oder Bedingung. Ausdrücke sind in zwei Kategorien unterteilt, Primitive oder Konstrukte (compounds, derived). Variablen und Prozeduraufrufe gehören zu den Primitiven. Variablen Eine Variable wird im folgenden durch bezeichnet. Sie ist an den Speicherplatz gebunden. Die Referenzierung von undefinierten (ungebundenen) Variablen verursacht einen Fehler. Literale Ausdrücke Literale Ausdrücke werden durch (quote ) ("") '(Literal) bezeichnet. Beispiele sind "test.scm" 'test.scm und 123. Prozeduraufrufe Prozeduraufrufe werden in der Form ( ) bezeichnet. Neben vorgegebenen Prozeduren können eigene durch Lambda-Ausdrücke definierte Prozeduren aufgerufen werden. Beispiel: (+ 1 2 3 4) ergibt den Wert 10. Lambda Ausdrücke Lambda Ausdrücke werden als Prozedur ausgewertet. Ein Lambda Ausdruck hat folgendes Aussehen: (lambda ) Dabei bezeichnet Parameter eine Liste aus einem oder mehreren Parameter und Körper eine Liste aus einem oder mehreren Ausdrücken. Beispiele: (define test (lambda (n1 n2) (+ n1 n2) )) (test 2 5) ;; wird als 5+2 = 7 ausgewertet (define test (lambda (l1 l2) (car l2) ))

(test 1 (2)) ;; wird als 2 ausgewertet (1. Element des 2. Parameters (define test (lambda (. l1) (car l1) )) (test 1 2 3 4 5) ;; wird als 1 ausgewertet Bedingte Ausdrücke Es gibt zwei Formen von if Ausdrücken (if ) (if ) Zunächst wird der Ausdruck ausgewertet. Ist dieser wahr (#t), wird ausgewertet, ist er falsch (#f), so wird ausgewertet. Bei und handelt es sich um Listen. Das Ergebnis dieser Auswertung wird als Resultat der Bedingung zurückgegeben. Falls fasch ist und keine Aleternative angegeben ist, so ist der Rückgabewert unspezifiziert. Zuweisungen Variablen kann mit set! ein Wert zugewiesen werden. Die Syntax lautet: (set ) Ausdruck wird ausgewertet und sein Ergebnis wird der Variablen zugewiesen. Das Resultat von set! ist nicht spezifiziert. Die Variable muß in der Umgebung von set! oder in der obersten Stufe (top level) definiert sein. Beispiel: (define test 1) (set! test 2) Zusammengesetzte Ausdrücke Bedingter Ausdruck cond Ein cond Ausdruck hat das folgende Format: (cond ...) hat die Form ( ...) und die Form ( else ...). Die Testbedingungen der werden sequentiell ausgewertet bis eine von ihnen den werte wahr #t liefert. Für diese werden die folgenden Ausdrücke ausgewertet. Das Ergebnis des letzten Ausdrucks liefert das Resultat des cond Ausdrucks. Falls alle den Wert fasch #f liefern und keine else Alternative spezifiziert ist, so liefert der cond Ausdruck den Wert falsch #f. Bindende Konstrukte Die drei bindenden Konstruktoren let, let* und letrec geben Scheme eine Blockstruktur. Die Syntax dieser Prädikate ist identisch. Sie unterscheiden sich jedoch in der Form ihrer Auswertung und im Gültigkeitsbereich. let hat die Syntax:

(let ) mit in der Form (( )...). Dabei kann ein Ausdruck sein. Zunächst werden alle Werte der Ausdrücke berechnet. Erst dann werden die Werte den Variablen zugewiesen. kann eine Liste mehrerer Ausdrücke sein. Da zuerst die Ausdrücke berechnet werden, dürfen die Variablen in den Ausdrücken nicht verwandt werden. Die Variablen sind lediglich im Bereich von gültig. let* hat entsprechend let die Syntax: (let* ) mit in der Form (( )...). Dabei kann ein Ausdruck sein. Die Werte der Ausdrücke werden sequentiell von links nach rechts berechnet und den Variablen sofort nach der Berechnung zugewiesen. Deshalb können bei let* im Gegensatz zu let weiter links stehende Variable in den Ausdrücken verwandt werden. Die Variablen sind lediglich im Bereich von gültig. letrec hat wie let und let* die Syntax : (letrec ) mit in der Form (( )...). Dabei kann Initial ein Ausdruck sein. Zunächst werden alle Variablen definiert, um dann die Werte der Ausdrücke zu berechnen und zuzuweisen. Eine Variable darf in lediglich einmal erscheinen. kann eine Liste mehrerer Ausdrücke sein. Die Variablen sind lediglich im Bereich von gültig. Da den Variablen jedesmal neuer Speicherplatz zugewiesen wird, können mit letrec rekursive Prozeduren definiert werden. Festlegen der Reihenfolge Mit dem begin Prädikat kann die Reihenfolge der Abarbeitung einer Liste von Ausdrücken von links nach rechts festgelegt werden. Die Syntax lautet: (begin ...) Mit diesem Prädikat kann die Reihenfolge der Abarbeitung insbesondere für Ausgaben festgelegt werden. Beispiel: (begin (display (+ 3 4)) (newline) (display (* 2 4)) (newline) (display (+ 1 3)) (newline) ) Iteration Iterationen können mit dem do Prädikat durchgeführt werden. do spezifiziert eine Menge von Variablen, initialisiert sie und legt fest, wie sie bei jedem Schleifendurchlauf geändert werden. Die Syntax lautet: (do (( ) ...) ( ...)

Kommandofolge ) Zunächst werden die Ausdrücke ausgewertet und die Ergebnisse an die gebunden. Danach beginnt die Iterationsphase mit dem Auswerten der Abbruchbedingung . Ist diese erfüllt, wird die Folge von berechnet. Das Resultat des letzten liefert das Resultat von do. Ist das Abbruchkriterium nicht erfüllt, so kann der Schleifenrumpf, durch repräsentiert, ausgeführt werden. Vor der nächsten Ausführung der Iterationsschleife werden die Ausdrücke berechnet und den Variablen neue Speicherplätze zugewiesen. Dann beginnt die nächste Iteration mit dem Auswerten der Abbruchbedingung . (do ((i 0 (+ i 1)) ;; Beispielschleife ) ((> i 5) 5) (eval `(solid:zylinder ,(position (* 20 i) 0 0) ,(position (* 20 i) 0 50) ,10 ) ) ) Das Beispiel konstruiert 6 Zylinder mit den Mittelpunkten (0 0 0) (20 0 0) ... (100 0 0). Bei der Verwendung des do Prädikates ist zu beachten, daß die Variablen sind lediglich innerhalb der do Schleife gültig sind. Falls Schritt weggelassen wird, behält die Variable ihren Wert. Eingebaute Funktionen car gibt das erste Element einer Liste zurück cadr gibt das zweite Element einer Liste zurück caddr gibt das dritte Element einer Liste zurück cdr gibt das letzte Element einer Liste zurück c....r gibt ein Element einer Liste zurück nach der Methode, daß jeder Punkt für ein a oder ein d steht. a bedeutet 1. Element der Liste und d den Rest der Liste. Maximal können 4 Buchstaben eingesetzt werden. append verkettet zwei Listen miteinander cons Fügt ein neues Element an den Anfang eine Liste list Baut aus den Parametern eine Liste length liefert die Länge einer Liste define definiert eine Variable

eval(Ausdruck [environment]) wertet einen Ausdruck aus Beispiel: (define drei (eval (+ 2 1))) (define drei (eval (+ 2 1) (global-environment)))

+ addiert eine Liste von Zahlen - subtrahiert eine Liste von Zahlen * multipliziert eine Liste von Zahlen / dividiert eine Liste von Zahlen = > < = Vergleichsoperatoren Datentypen (Basistypen in C-IO-Notation) (entity count part) Part ist der Teilezähler, count der Entityzähler innerhalb des Parts (gvector %g %g %g) Vector: x y z (position %g %g %g) x y z Koordinaten (color %g %g %g) Farbe: rot grün blau (pick-event %d %d %d %d %d) Mausevent: x y Taste View-id Tastenstatus (ray (%g %g %g)(%g %g %g)) Strahl Anfangs- und Endpunkt (view %d) Adresse des View im Speicher Beispielhafte Geometrieprädikate (wcs Ursprung X-Richtung Y-Richtung) Definiert ein Arbeitskoordinatensystem (wcs:set-aktiv wcs) Aktiviert ein Arbeitskoordinatensystem (solid:block pos1 pos2) Konstruiert einen Block (solid:cone pos1 pos2 radius1 radius2 [ratio [pos3]]) konstruiert einen Konus (solid:cylinder pos1 pos2 radius ratio pos3) konstruiert einen Zylinder (solid:sphere pos1 radius) konstruiert eine Kugel (solid:intersect bodylist) Durchschnitt von Solids

(solid:slice body plane-pos plane-normal) schneidet ein Solid (solid:subtract bodylist) Subtraktion von Solids (solid:unite bodylist) Vereinigung von Solids Beispielprogramm Bohrbild Das Beispielprogramm Bohrbild konstruiert eine vorzugebene Anzahl Bohrungen, die auf einem Teilkreis liegen. Der Teilkreis liegt in der X-Y Ebene des Arbeitskoordinatensystemes. Sein Mittelpunkt liegt im Ursprung des Koordinatensystemes. BOHRBILD.SCM, ;; Beispielprozedur Bohrbild ;; Aufruf ;; (bohrbild Teilkreisdurchmesser Bohrungsdurchmesser ;; Bohrungstiefe Anzahl der Bohrungen) ;; ;; bohrbild konstruiert Bohrungen auf einem Teilkreis um den Ursprung in der x-y Ebene durch ;; Versetzen des wcs kann die Lage des Bohrbildes relativ zum Werkstueck positioniert ;; werden. ;; (define bohrbild (lambda (TKR BR BT NB) (begin ;; Reihenfolge einhalten (display "Selektiere den Koerper von dem die Bohrungen abgezogen werden sollen: ") (let* ((winkelschritt (/ (+ PI PI) NB)) ;; 2 * PI / Anzahl Bohrungen (mainbody (pick:entity (read-event))) ;; Selektieren des Grundkoerpers ) (newline) (do ( ;; Variablendeklaration Initial Schrittfunktion (i NB (- i 1)) ) ( ;; Test und Rueckgabewert (= i 0) mainbody ) (let* ( ;; Bindungen (winkel (* winkelschritt i)) ;; Inkrementiere Winkel (dx (* TKR (cos winkel))) ;; X-Wert

(dy (* TKR (sin winkel))) ;; Y-Wert (newobj ( eval `(solid:cylinder (position ,dx ,dy 0) (position ,dx ,dy ,BT) BR) ) ) ) (solid:subtract mainbody newobj) ;; Koerper von let* ) ;; Ende let* ) ;; Ende do ) ;; Ende erstes let* ) ;; Ende begin ) ;; Ende Lambda )

SCHEME-Kurzreferenz ;; FILE "Scheme Sigs" ;; IMPLEMENTS R^4RS Function Signature Synopsis ;; AUTHOR Kenneth A Dickey ;; DATE 1992 October 2 ;; LAST UPDATED 1992 October 3 ;; NOTES: Extracted from Amiga Gambit QuickTour file

=== FUNCTION SYNOPSIS ===

Here is a quick reference of the signatures of provided functions. Aside from Extensions, there is no attempt at completeness. It is

assumed that the user has a copy of R^4RS or the IEEE/ANSI standard.

Notation: any Scheme data object. * zero or more objects + one or more objects [] optional object

; SYNTAX

(LAMBDA + ) (LAMBDA (* ) + ) (AND *) (OR *) (IF [] ) (COND ( * )... [(ELSE +)] ) (CASE ((+ ) * )... [(ELSE +)] ) (LET [] ( ( ) ) ) (LET* ( ( ) ) ) (LETREC ( ( ) ) ) (BEGIN + ) (DO ( ( )... ) ( * ) * ) ;; Note also R^4RS syntax, below

; IEEE Scheme

(NOT )

(BOOLEAN? )

(EQ? ) (EQV? ) (EQUAL? )

(PAIR? ) (CONS ) (CAR ) (CDR ) (SET-CAR! ) (SET-CDR! ) (CAAR ) (CADR ) (CDAR ) (CDDR ) (CAAAR ) (CAADR ) (CADAR ) (CADDR ) (CDAAR ) (CDADR ) (CDDAR ) (CDDDR ) (CAAAAR ) (CAAADR ) (CAADAR ) (CAADDR ) (CADAAR ) (CADADR ) (CADDAR ) (CADDDR ) (CDAAAR ) (CDAADR ) (CDADAR ) (CDADDR ) (CDDAAR ) (CDDADR ) (CDDDAR ) (CDDDDR ) (NULL? ) (LIST? ) (LIST * ) (LENGTH ) (APPEND + ) (REVERSE ) (LIST-REF ) (MEMQ ) (MEMV )

(MEMBER ) (ASSQ ) (ASSV ) (ASSOC )

(SYMBOL? ) (SYMBOL->STRING ) (STRING->SYMBOL )

(NUMBER? ) (COMPLEX? ) (REAL? ) (RATIONAL? ) (INTEGER? ) (EXACT? ) (INEXACT? ) (= + ) (< + ) (> + ) (= + ) (ZERO? ) (POSITIVE? ) (NEGATIVE? ) (ODD? ) (EVEN? ) (MAX + ) (MIN + ) (+ + ) (* + ) (- + ) (/ + ) (ABS ) (QUOTIENT ) (REMAINDER ) (MODULO ) (GCD * ) (LCM * )

(NUMERATOR ) (DENOMINATOR ) (FLOOR ) (CEILING ) (TRUNCATE ) (ROUND ) (RATIONALIZE ) (EXP ) (LOG ) (SIN ) (COS ) (TAN ) (ASIN ) (ACOS ) (ATAN []) (SQRT ) (EXPT ) (MAKE-RECTANGULAR ) (MAKE-POLAR ) (REAL-PART ) (IMAG-PART ) (MAGNITUDE ) (ANGLE ) (EXACT->INEXACT ) (INEXACT->EXACT ) (NUMBER->STRING ) (STRING->NUMBER )

(CHAR? ) (CHAR=? ) (CHAR-CI=? ) (CHAR