Lisp, Verständnisproblem

FM41

FM41

Jungspund
hallo,

ich arbeite gerade den online LISP Kurs der UNI Trier durch.

Die Aufgabe lautet
4. Definiere eine Funktion NREST, die zwei Argumente, einen atomaren Ausdruck und eine Liste hat. Sie soll -1 liefern, falls der atomare Ausdruck nicht in der Liste ist und sonst angeben, wieviele Elemente in der Liste noch nach dem Ausdruck stehen.

und die Lösung
Code:
(DEFUN NREST (ITEM LIST)
    (1- (LENGTH (MEMBER ITEM LIST))))

Bis zu dem Length bin ich gekommen, aber warum das 1- ? Ich habe nirgendwo eine Erklärung dafür gefunden.

besten Dank, gruß
Felix
 
Wenn das Element nicht in der Liste ist, ist der Wert von (length (member item list)) 0. (1- 0) <=> (- 0 1) => -1.

Wenn das Element in der Liste ist, ist der Wert von (member item list) der Teil der Liste ab 'item' (inklusive).
Beispiel:
Code:
(member 3 (list 1 2 3 4 5 6))
> (3 4 5 6)
(length (list 3 4 5 6))
> 4
Hier stehen ja nach der Zahl 3 noch drei Elemente in der Liste, also muss man vom Rueckgabewert von (length (member list item)) 1 subtrahieren, weil man sonst das gesuchte Element (item) selbst mitzaehlen wuerde.

Ich hoffe, das ist jetzt ein bisschen klarer :)
 
hallo nyx, vielen Dank nun habe ich es verstanden! Das Ausschlaggebende war (1 - 0) <=> (- 0 1) , ich wusste nicht das dies Äquivalent ist.

vielen Dank, gruß
Felix
 
danke für den Link das scheint mir wirklich sehr hilfreich. 1- und 1+ sind quasi wie i++ oder i-- . Besten dank!

gruß
Felix
 
1- und 1+ sind quasi wie i++ oder i-- . Besten dank!
Ich weiß der Thread ist schon fast einen Monat alt und das Problem schon gelöst, doch die Aussage will ich dennoch ungern so stehen lassen: 1+ und 1- unterscheiden sich von i++ und i-- darin, dass die Variable nicht verändert wird. i++ verändert die Variable, 1+ tut dies nicht:
Code:
> (setf a 3)
3
> (1+ a)
4
> a
3

Die Lisp-Äquivalente zu i++/i-- wären (setf i (1+/- i)) oder (incf/decf i).
 

Ähnliche Themen

Squid nur zum maskieren der eigenen IP, nicht für Webserver auf port 80

Server-Monitoring mit RRDTool

Zurück
Oben