Was kann schief gehen, wenn ich ein Makro definiere und nur einen seltenen Namen für eine temporäre Variable verwende?

8

Let Over Lambda Kapitel 3 Abschnitt "Unerwünschte Erfassung" sagt:

"Sicherlich können wir uns an so seltene Namen denken, dass das Problem nie auftaucht. Ja, in vielen Fällen können Pakete und die Benennung intelligenter Variablen das Problem der Variablenerfassung lösen. Die meisten ernsthaften Variablen-Capture-Fehler treten jedoch nicht auf In Code, der direkt von einem Programmierer erstellt wird Die meisten Probleme bei der Variablenerfassung treten nur dann auf, wenn andere Makros Ihr Makro (in Kombination mit Ihrem Makro) auf eine Weise verwenden, die Sie nicht erwartet haben. "

und dann gibt es mir kein Beispiel für den kühnen Teil. Was wäre eines dieser Beispiele? Stellen Sie sich ein hypothetisches Lisp-Entwicklerteam vor, dessen verrückter Chef die Verwendung von Gensym oder alles, was uninteressierte Symbole erzeugt, verbannt und die Programmierer einfach auf alphanumerische Würfel zurückgreifen, um zufällige Variablennamen wie temp-27s63f8sk2n oder sum-3t84hj4df zu erzeugen, wenn sie Gensym verpassen. Was wäre ein Beispiel, wo das Team in Schwierigkeiten geraten wird?

Apropos, Emacs 24.3.1 definiert die Zeitpunkte und den Dolist ohne Verwendung von Symbolen ohne Unterbrechungen. Seltsam.

    
Le Curious 02.07.2013, 22:19
quelle

2 Antworten

2

OK, dann würde ich vorschlagen, diesen Prozess "Alphanumerische Würfel werfen" zu automatisieren. Natürlich muss es nicht zufällig sein, Sie könnten einfach einen Zähler verwenden. Außerdem wäre es schön, ein Präfix zum Debuggen angeben zu können. Oh warte, genau das macht gensym .

    
Svante 03.07.2013 07:57
quelle
1

Das Problem tritt auf, wenn Sie Ihr eigenes Makro in einem anderen Kontext wiederverwenden und Ihre clever benannten Variablen effektiv redundant sind, da sie sich alle im selben Namensraum befinden.

Ich kann mir ein Beispiel vorstellen, wenn ich eine Closure verwende, die auf eine Variable in einem umschließenden (let) zugreift, aber an ein Makro übergeben wird, das ebenfalls eine umschließende (let) definiert, die eine "sichere" Variable mit einem Namenskonflikt definiert. Es ist ein künstliches Beispiel, tut mir leid, ich kann mir im Moment keinen realen Fall vorstellen.

%Vor%     
d11wtq 02.07.2013 23:49
quelle

Tags und Links