Wie kann ich `nil` zurückbringen?

18

Ich habe versehentlich Folgendes ausgeführt:

(unintern variable)

wo variable‚s - Wert war nil.

Wie komme ich nilzurück, ohne Emacs neu zu starten?

Sean Allred
quelle
3
+1 dafür, dass ich kichere. :-) Nicht herablassend, aber so "hätte ich das auch gemacht".
Malabarba
@ Malabarba :) Es war wirklich eine demütigende Erkenntnis, als ich herausfand, was ich getan hatte
Sean Allred
1
Du kannst nil löschen! Das habe ich nicht kommen sehen.
Gambo
@ Gambo habe ich auch nicht :)
Sean Allred

Antworten:

19

(defconst nil ())

scheint die richtige Wirkung zu haben; Beachten Sie, dass nilund eine leere Liste in Emacs Lisp nicht zu unterscheiden sind.

Ich habe mir angeschaut, um lread.c:4034zu sehen, wie nilin einer obarray.

Beachten Sie den Kommentar in Zeile 3896 inlread.c :

/* There are plenty of other symbols which will screw up the Emacs
     session if we unintern them, as well as even more ways to use
     `setq' or `fset' or whatnot to make the Emacs session
     unusable.  Let's not go down this silly road.  --Stef  */
  /* if (EQ (tem, Qnil) || EQ (tem, Qt))
       error ("Attempt to unintern t or nil"); */

Dies erklärt, warum Emacs nicht vor (unintern nil)und schützt (unintern t).

Konstantin
quelle
Sehr schlau! Ich stimme dem Stefzu, eigentlich :) Auf diesem Weg liegt der Wahnsinn.
Sean Allred
Bleh. Ich stimme mit rms über sm hier überein. Uninterning nilist ein häufiger Fehler, vor dem man sich leicht schützen kann. Warum einen Handlauf auf eine Treppe stellen, wenn Leute darüber springen könnten?
Gilles 'SO- hör auf böse zu sein'
@Gilles Ich denke darüber nach, wenn ich an C denke: C hält an der Philosophie fest, dass der Programmierer weiß, was er tut, und lediglich eine Möglichkeit benötigt, sich auszudrücken. IMO, wir sollten Emacs Lispel als Assemblersprache von Emacs betrachten; Höhere Abstraktionen (und Guards / Features) sollten in einer Sprache hinzugefügt werden, die sich zu elisp kompiliert. Aber das ist sicherlich ein Thema für ein anderes Medium :)
Sean Allred
uninternwird eigentlich nicht oft verwendet. Es obarrayist so gut wie immer eine schlechte Idee, es auf dem Main zu verwenden (weshalb sich der Byte-Compiler beschwert, wenn Sie das zweite Argument C-h f uninternnicht übergeben und Ihnen nicht sagen, dass das zweite Argument tatsächlich noch optional ist).
Stefan
@ Stefan Es scheint, dass das ein Dokumentationsfehler ist, dann :(
Sean Allred