2.2.3. Funktionen

Funktionen bilden den Kern für das Programmieren mit Lisp.

2.2.3.1. Funktionsaufrufe

Eine Funktion wird durch die Evaluierung einer Liste ausgeführt, deren erstes Element der Name der Funktion ist. Auf den Funktionsnamen folgende Elemente der Liste sind die 'Argumente' der Funktion. Funktionen können keine oder mehrere Argumente besitzen. Hier einige Beispiele für Funktionsaufrufe und deren Ergebnisse (Werte):

;; Ein Funktionsaufruf mit 2 Argumenten

(+ 2 3) ;; -> 5

;; viele Lisp Funktionen können eine variable Anzahl von Argumenten
;; haben:

(+ 7 3 2 1 5) ;; -> 18
(* 3 4 2) ;; -> 24
(+) ;; -> 0
(min 6 17 3 8 12 14) ;; -> 3
(max 6 17 3 8 12 14) ;; -> 17

;; verschachtelte Funktionsaufrufe

(+ 2 (* 3 4) 13 (- 5 4)) ;; -> 26

;;; verschiedene mathematische Funktionen: + - * / abs floor mod expt log round

(abs -3) ;; -> 3
(abs -3.5) ;; -> 3.5

;; Ganzzahliger Teil einer Division

(floor 11 4) ;; -> 2
(floor 17 4) ;; -> 4
(floor 17.3 4) ;; -> 4

;; Rest einer Division

(mod 11 4) ;; -> 3
(mod 11.4 4) ;; -> 3.399996 (!)

;; Exponential- und Logarithmusfunktionen

(expt 2 3)  ;; -> 8
(log 8 2)  ;; -> 3.0

2.2.3.2. Funktionsdefinition

Zusätzlich zu den vorhandenen Funktionen lassen sich eigene Funktionen mit dem Makro defun definieren.

;;; Definition einer Funktion mit einem Argument x:

(defun square (x) (* x x)) ;; -> square

;;; Aufruf der Funktion mit verschiedenen Argumenten:

(square 4) ;; -> 16
(square 6) ;; -> 36

;;; Definition einer Funktion mit einem keyword Argument:

(defun transpose (keynum &key (transposition 0))
  (+ keynum transposition))

(transpose 60) ;; -> 60
(transpose 60 :transposition 4) ;; -> 64

2.2.3.3. Funktionsbezeichnung

Funktionen sind Objekte, vergleichbar mit Datentypen. Um eine Funktion als Objekt zu bezeichnen, wird vor den Funktionsnamen die Zeichenfolge #' geschrieben. Ähnlich wie bei Listen verhindert das dem Funktionsnamen vorangestellte Anführungszeichen die Evaluation der Funktion. Durch das Hashzeichen wird dem Lisp Reader angezeigt, dass es sich bei dem darauffolgenden Symbol um eine Funktion handelt 3

;; Bezeichnung einer Funktion durch das Präfix #'

#'+ ;; -> #<function +>

2.2.3.4. Funktionsapplikation

Um eine Funktion auf Argumente anzuwenden, gibt es die allgemeinen Formen apply und funcall. Bei apply werden die Funktionsargumente als Liste übergeben, bei funcall werden die Argumente wie bei einem Funktionsaufruf aufgelistet:

;;; Applikation einer Funktion auf Argumente:

(apply #'+ '(3 4 5)) ;; -> 12

(funcall #'+ 3 4 5) ;; -> 12
3: Bei Common Lisp gibt es (im Unterschied zum Lisp Dialekt 'scheme') getrennte Namensräume für Symbole und Funktionsnamen. Das führt dazu, dass man Funktionen und Variablen verwenden kann, die den selben Namen haben. Der Lisp Reader erkennt automatisch durch den Kontext, in dem das Symbol auftaucht, ob es sich um eine Variable oder eine Funktion handelt.

results matching ""

    No results matching ""