image

A++

Die kleinste Programmiersprache der Welt

Georg P. Loczewski

image

A++

Die kleinste Programmiersprache der Welt

Eine Programmiersprache zum Erlernen der Programmierung

Mit einer Einführung in das Lambda-Kalkül

image

IMPRESSUM

Copyright ©2018 Georg P. Loczewski

A++ : Die kleinste Programmiersprache der Welt

1. Auflage 2018 – Hamburg

tredition GmbH

ISBN

978-3-7469-3098-5 (Paperback)

978-3-7469-3099-2 (Hardcover)

978-3-7469-3100-5 (e-Book)

Verlag & Druck: tredition GmbH

Bei der Zusammenstellung von Texten und Abbildungen wurde mit größter Sorgfalt vorgegangen. Trotzdem können Fehler nicht vollständig ausgeschlossen werden. Verlag, Herausgeber und Autoren können für fehlerhafte Angaben und deren Folgen weder eine juristische Verantwortung, noch irgendeine Haftung übernehmen. Für Verbesserungsvorschläge und etwaige Hinweise auf Fehler sind Verlag und Autor dankbar. Die gewerbliche Nutzung der in diesem Produkt gezeigten Modelle und Arbeiten ist nicht zulässig.

Das Werk einschließlich all seiner Teile ist urheberrechtlich geschützt. Jede Verwertung außerhalb der engen Grenzen des Urheberrechtsgesetzes ist ohne Zustimmung des Verlages unzulässig und strafbar. Das gilt insbesondere für Verfielfältigungen, Übersetzungen, Mikroverfilmungen und die Einspeisung, Verarbeitung und Verbreitung in elektronischen Systemen.

Meiner Frau Ursula und meinen Söhnen Thomas und Johannes in Liebe gewiedmet

image

Inhaltsverzeichnis

Vorwort

1 Einführung

1.1 Konstitutive Prinzipien in A++

Abstraktion

Referenz

Synthese

Closure

Lexical Scope

2 Sprachdefinition

2.1 Syntax und Semantik von A++

Anmerkungen zur Syntax:

2.2 Beispiele zur Syntax von A++

Beispiele zur Abstraktion 1. Alternative in 2.2

Beispiele zur Abstraktion 2. Alternative in 2.2

Beispiele zur Referenz 2.3

Beispiele zur Synthese 2.4

2.3 A++ Erweiterung

Syntax von A++ mit vorgegebenen Primitiv-Abstraktionen

Beispiele zu den Erweiterungen in A++

3 Erste Entfaltung von A++

3.1 Programmierstil in A++

3.2 Grundlegende Logische Abstraktionen

Abstraktionen ‘true’ und ‘false’

Abstraktionen ‘lif’

3.3 Erweiterte Logische Abstraktionen

3.4 Numerische Abstraktionen

Abstraktion für die Zahl ‘0’

Abstraktion für die Zahl ‘1’

Abstraktion für die Zahl ‘2’

Abstraktion für das Prädikat ‘zerop’

Abstraktion für die Zahl ‘3’

Utility-Abstraktion ‘compose’

Abstraktion für die Addition

Abstraktion für die Inkrementierung

Abstraktion für die Multiplikation

3.5 Abstraktionen für Listen

Abstraktion für den Konstruktor

Abstraktion für den Selektor ‘lcar’

Abstraktion für den Selektor ‘lcdr’

Anwendung der grundlegenden Operationen für Listen

Abstraktion für das Ende einer Liste

Abstraktion für das Prädikat ‘nullp’

Abstraktion für die Längenabfrage

Abstraktion zum Entfernen eines Objektes aus einer Liste

3.6 Erweiterte Arithmetische Abstraktionen

Abstraktion für ‘zeropair’

Abstraktion für die Dekrementierung

Abstraktion für die Subtraktion

3.7 Relationale Abstraktionen

Abstraktion für das Prädikat ‘gleich’

Abstraktion für das Prädikat ‘größer als’

Abstraktion für das Prädikat ‘kleiner als’

Abstraktion für das Prädikat ‘größer gleich’

3.8 Funktionen Höherer Ordnung

Abstraktion ‘compose’

Abstraktion für die ‘curry’-Funktion

Abstraktion für die Abbildung einer Liste

Abstraktion für die ‘curry map’-Funktion

Abstraktion für die Auswahl aus einer Liste

Abstraktion für die Suche nach einem Objekt in einer Liste

3.9 Mengen-Operationen

Abstraktion für das Prädikat ‘memberp’

Abstraktion für das Hinzufügen eines Elementes

Abstraktion für die Vereinigung von Mengen

4 Erste Anwendung von A++

4.1 Utility-Abstraktionen

Abstraktion für das sortierte Einfügen in eine Liste

Abstraktion für die Sortierung

4.2 Rekursion

Abstraktion für die Berechnung der Fakultät

Abstraktion für die Summation

Abstraktion für den Zugriff auf ein Element einer Liste

Abstraktion für die Iteration über die Elemente einer Liste

4.3 Imperative Programmierung in A++

Die Abstraktion ’while’ in A++

5 Objekt-Orientierte Anwendung von A++

5.1 Einleitung

Bildung von Klassen

Instanzen von Klassen

Beispiele für Objekt-orientierung in A++

5.2 Erstes Beispiel zur Objektorientierung in A++

Konstruktor für Objekte der Klasse “account”

Erzeugung des Objektes “acc1” durch Aufruf von “make-account”

Senden der Botschaft “deposit” an das Objekt “acc1”

Ausführen der Funktion “deposit”

Detaillierter Code in A++

Anmerkungen zu dem ersten Beispiel zur Objektorientierung

Anmerkungen zum Aufruf der Funktion ‘konto’

5.3 Zweites Beispiel zur Objektorientierung in A++

Anmerkung zu den einzelnen Klassen

Beziehungen zwischen den Klassen

Zusammenfassung

5.4 Drittes Beispiel zur Objektorientierung in A++

Anmerkung zu den einzelnen Klassen

6 Abstraktion, Referenz und Synthese im Detail

6.1 Addition der zwei Zahlen ‘two’ und ‘three’

Synthese von ‘add’ und ‘two three’ (1)

Abstraktion von ‘add’ (1)

Auflösung der Referenz von ‘add’ in [1]

Synthese von (lambda(m n) ... ) und ‘two three’ in [3]

Abstraktion von ‘compose’

Auflösung der Referenz von ‘compose’ in [4]

Synthese von (lambda(f g) ...) und ‘(two f) (three f)’ in [6]

Abstraktion von three:

Auflösung der Referenz von ‘three’ in [7]

Synthese von (lambda(f) ...) und ‘f’ in [9]

Synthese von (lambda(x) ...) und ‘x’ in [10]

Abstraktion von two:

Auflösung der Referenz von ‘two’ in [11]

Synthese von (lambda(f) ...) und ‘f’ in [13]

Synthese vom inneren (lambda(x) ...) und ‘(f (f (f x)))’ in [14]

6.2 Multiplikation der zwei Zahlen ‘two’ und ‘three’

Synthese von mult und ‘two three’

Abstraktion von mult:

Auflösung der Referenz von ‘mult’ in [17]

Synthese von (lambda(m n) ... ) und ‘two three’ in [19]

Abstraktion von compose:

Auflösung der Referenz von ‘compose’ in [20]

Synthese von (lambda(f g) ...) und ‘two three’ in [22]

Abstraktion von two:

Abstraktion von three:

Auflösung der Referenz von ‘two’ und ‘three’ in [23]

Synthese vom inneren (lambda(f) ...) und ‘x’ in [26]

Synthese von (lambda(f) ...) und ‘(lambda(x0) ...)’ in [28]

Synthese vom inneren (lambda(x0) ...) und ‘x1’

Synthese von (lambda(x0) ...) und ‘(x(x(x x1)))’

Umbenennung der Variablen: x –> f und x1 –> x

7 Infrastruktur für A++

7.1 Support-Funktionen

Abstraktion für die Ausgabe einer Zahl

Abstraktion für die Ausgabe eines boole’schen Wertes

Abstraktion für die Ausgabe von Listen

7.2 A++ Interpreter

Linux

MS-Windows

Programmbeendigung

7.3 Initialisierungsdatei für den ARS-Interperter

7.4 WWW-Adressen

8 Erweiterung von A++

8.1 ARS++

8.2 ARSAPI

Anhänge

A Das Lambda-Kalkül

A.1 Syntax eines Lambda-Ausdrucks

A.2 Begriffe und Regeln des Lambda-Kalküls

Assoziativitätsregeln
Gebundene und freie Variable
Alpha-Konvertierung
Beta-Reduktion
Eta-Reduktion
Y-Kombinator

A.3 Beispiele für Beta-Reduktion

Lambda-Kalkül-Programmierung in Scheme-Codierung
Auszuwertende Lambda-Ausdrücke in Scheme-Codierung
Basis-Abstraktionen in Scheme-Codierung.
Anwendung mit Beta-Reduktion

B Gültigkeitsbereich von Namen

B.1 Interpretation von Namen

Dynamic Scope
Static Scope
Global Scope
Local Scope

B.2 Auswirkung der Art der Symbolinterpretation auf die Programmierung

Auswirkung von „Dynamic Scope“ auf die Programmierung
Auswirkung von „Static Scope“ auf die Programmierung
Verdeutlichung der Unterschiede von „dynamic scope“ und „lexical scope“ anhand von Beispielen

Schlusswort

Biographische Daten zur Person des Autors

Verzeichnis der Fundamentalbegriffe

Abbildungsverzeichnis

Listings

Literaturverzeichnis

Index

Vorwort

Zweck des Buches

In diesem kleinen Büchlein, geht es primär darum an der Programmierung interessierten Leserinnen und Lesern ein Instrument vorzustellen, mit dem sie sehr schnell und sehr effizient Programmieren lernen können, ohne sich schon für eine der populären, voll-ausgebauten Programmiersprachen entscheiden zu müssen und ohne einen großen Kostenaufwand zu haben.

1