2016-03-27 12 views
0

zum BeispielWas heißt divergieren in Lisp

(cond ((< 2 1) 2) ((< 1 2) 1)) hat den Wert 1. OK;

Aber ich sah, dass (cond (diverge 1) (ture 0)) nicht definiert ist, wenn divergieren nicht 'in meinem Hauptbuch.

Was ist die Abweichung in Lisp ??

Ich weiß das nicht.

Auch ich weiß nicht genau was ist Nebenwirkungen in Lisp.

Antwort

2

Wie gezeigt, würden diverge und ture Variablen benennen, die als Boolean ausgewertet werden. Der Wert des gesamten Ausdrucks ist 1, wenn diverge wahr ist, 0, wenn wahr ist, und nil, wenn beides wahr ist.

Da Sie den Kontext nicht angezeigt haben, insbesondere wie diverge und ture gebunden sind, kann nicht mehr über Ihr Snippet gesagt werden.

Vielleicht haben Sie so etwas wie (cond ((diverge 1) (ture 0))) gemeint. Dann wäre diverge ein Operator. Es ist nicht im Common-Lisp-Standard definiert, daher kommt es höchstwahrscheinlich von woanders in Ihrem Buch.

4

den Code ist ursprünglich gemeint Unter der Annahme,

(cond ((diverge 1) (ture 0))) 

dann das Ergebnis dieses Ausdrucks ist nicht definiert (oder besser, divergierenden, auch), wenn wir diverge annehmen eine sein - divergierenden Betrieb - wie der Name schon sagt.

Ein diverging operation ist einer, der nicht zu einem Ergebnis konvergiert, wie zum Beispiel eine Endlosschleife.

Es gibt keine diverge definiert im Common Lisp-Standard (welcher praktische Zweck würde es haben?), So Ihr Buch ist einfach die "Implementierungsdetails" einer divergierenden Berechnung durch Wrapping es in einem Vorgang und benennen es entsprechend.

Beachten Sie, dass der ursprüngliche Code das gleiche Verhalten aufweisen kann, wenn man davon ausgeht, dass diverge ein Symbolmakro ist.

+0

OP-Code könnte gültig sein und endet nie, vorausgesetzt, es gibt etwas wie '(definieren-Symbol-Makro divergieren (Schleife))' anderswo ;-) – coredump

+0

Ah ja, Symbol Makros. Ich wollte die Komplexität niedrig halten, fügte aber eine Notiz hinzu :) –