Die "alte" Art
my-when Makro
(define-macro my-when
(lambda (test . body)
`(if ,test (begin ,@body))))
Sie sehen, wie einfach solche Erweiterungen in Scheme vorzunehmen sind. Makros werden mit define-macro eingeleitet, erhalten einen Namen ( my-when), erwarten Parameter (hier test . body und eine "passende " Ersetzung ( `(if ...) ). Betrachten wir die Ersetzung genauer:
Vor der Klammer des if befindet sich ein "Backtick" (umgekehrtes einfaches Hochkomma). Diesen Backtick kann man mit dem doppelten Hochkomma ( " ) in der Shell-Programmierung vergleichen. Das schon bekannte einfache Hochkomma ( \' ) hat hingegen bei Lisp eine ähnliche Funktion wie bei Shells. Während im ersten Fall bestimmte Zeichen eine Bedeutung erhalten (in Scheme sind das , und ,@, , bei der Shell das Dollarzeichen), ist im zweiten Fall diese Sonderbedeutung aufgehoben. (vgl. Backtick vs. normales Hochkomma)
Nach diesen Erklärungen ist es sicher Interessant, unser neu definiertes Kontrollflusselement in Aktion zu sehen:
(my-when 1 0) -> 0
(define foo 2) (my-when (< foo 3)
"foo ist kleiner als 3")
-> "foo ist kleiner als 3"
Unser Makro expandiert anscheinend wie gewünscht. Was man auch überprüfen kann. Sie müssen dazu aber mzscheme auf der Kommandozeile aufrufen, da diese Auswertung in der Scheme- Entwicklungsumgebung nicht funktioniert. Hier die Expandierung unseres my-when-Makros:
> (expand-defmacro '(my-when (< 1 2)"True"))
-> (#%if (< 1 2) (#%begin "True"))
Die Integration von neuen und alten Elementen ist nahtlos. Es ergeben sich dadurch attraktive Anwendungsgebiete, wie z.B. Konfigurationsmöglichkeiten für Ihre Software, die Sie mit einer in Scheme eingebetteten Sprache konfigurierbar machen, ohne dabei auf die Vorteile einer vollständigen Programmiersprache verzichten zu müssen. Diese Vorteile sind bei Lisp inhärent, daher sollte einen der Erfolg des Emacs mit seinem Emacs-Lisp nicht wundern oder die Entscheidung der FSF, in allen ihren Anwendungen Guile, eine Scheme- Implementierung, als Skriptsprache einzusetzen.
(define al '(1 ,(+ 1 2) 3))
-> (1 ,(+ 1 2) 3))
(define a2 `(1 ,(+ 1 2) 3))
-> (1 3 3)
Bei diesen beiden fast gleich aussehenden Ausdrücken zeigt sich, dass das Komma vor einem Ausdruck dessen Auswertung erzwingt.
Für \' und ` gibt es auch "sprechende" Namen, \' steht für quote und ` für quasiquote. Bei der Expandierung von ,@ ist zu beachten, dass es sich bei body um eine Liste handelt. Mit ,@ wird die Liste aufgeteilt und jedes einzelne Listenelement eingefügt.
|
Die "R5RS"-Art
Wenn Sie define-syntax mit Bekanntem vergleichen, können Sie vielleicht eine Analogie zur Fallunterscheidung feststellen. Mit define-syntax my-when-new wird dem Makro ein Name gegeben ( my-when-new ).
my-when-new Makro
(define-syntax my-when-new
(syntax-rules ()
((my-when-new test body ... )
(if test (begin body ...)))))
Nach syntax-rules folgt eine Reihe von Mustern, in denen das Makro auftreten kann. In unserem Fall besteht nur eine Möglichkeit: (my-when ...) . Dieses Muster verlangt zunächst den Namen des Makros, dann einen Test test und anschließend etwas wie body ... . Die ... stehen für beliebig viele weitere Ausdrücke.
Sollte nun ein my-when-new in der geforderten Form gefunden werden, wird die nachfolgende Transformation ( (if test (... vorgenommen, in der Ersetzung werden keine speziellen Expandierungszeichen benötigt. Die Namen der in der Schablone auftauchenden Variablen, werden "automatisch" zugeordnet.
Wie die Schablonen aussehen müssen, entnehmen Sie bitte dem R5RS-Report, den Sie in DrScheme unter den Manuals finden können. Gehen Sie dazu auf den Menüpunkt Help Helpdesk und wählen dort Help Desk Manuals Revised(5) ... aus. Hier ein weiteres Beispiel (aus dem Report):
my-and Makro
(define-syntax my-and
(syntax-rules ()
((my-and) #t)
((my-and test) test)
((my-and test1 test2 ...)
(if test1 (my-and test2 ...) #f))))
Das ist doch ziemlich beeindruckend. Sie haben ein wie in C arbeitendes and in nur sechs Zeilen Scheme implementiert. Interessant ist hauptsächlich das letzte Muster, in dem mehrere Tests an my-and übergeben werden. Es handelt sich dabei um eine rekursive Makroexpansion, d.h. dieses Makro wird solange expandiert, bis es kein weiteres Makro mehr enthält. Sobald sich bei der expandierten Form ein Wahrheitswert von "falsch" ergibt wird #f zurückgegeben.
| Whitepaper |
|
Open Source Datenintegration in der Praxis: Fallstudien und Anwendungsbeispiele
Über die letzten Jahre hinweg haben sich Open Source Lösungen als fester Bestandteil des gesamten Datenintegrationsmarktes etabliert. Viele Unternehmen haben bereits das Open Source Modell für Ihre Datenintegrationsprojekte aufgegriffen. Das vorliegende White Paper illustriert anhand ausgewählter Fallstudien und Anwendungsbeispiele die Implementierung von Open Source Datenintegration in der Praxis und benennt die daraus resultierenden Vorteile.
Download PDF (Registrierung erforderlich)
|
|
The Role of Open Source in Data Integration
Obwohl in den letzten Jahren viele technische Fortschritte erzielt werden konnten, verfügen die meisten Datenintegrationsprozesse nach wie vor nur über eine sehr begrenzte Automatisierung. Das vorliegende White Paper von dem Industry Analyst Mark Madson wird zunächst ein grundlegendes Verständnis von Daten Integration vermitteln, die Vorzüge von Open Source Lösungen für Daten Integration erläutern und Ihnen professionelle Empfehlungen geben, damit Sie Ihre Integrationsjobs noch einfacher und produktiver gestalten können.
Download PDF (Registrierung erforderlich)
|
Dieser Online-Artikel kann Links enthalten, die auf nicht mehr vorhandene Seiten verweisen. Wir ändern solche "broken links"
nur in wenigen Ausnahmefällen. Der Online-Artikel soll möglichst unverändert der gedrucken Fassung entsprechen.
|