我该如何退回`nil`?


18

我不小心执行了以下操作:

(unintern variable)

variable价值在哪里nil

我如何nil不重新启动Emacs而返回?


3
+1让我发笑。:-)不是以居高临下的方式,而是以“我也将完全做到这一点”的方式。
马拉巴巴

@Malabarba :)当我弄清楚自己做了什么时,这确实是一个谦卑的认识
Sean Allred 2014年

1
您可以删除nil!没看到那来。
2014年

@Gambo我也没有:)
肖恩·

Answers:


19

(defconst nil ())

似乎有适当的效果;请注意,nil在Emacs Lisp中,和空列表是无法区分的。

我看着lread.c:4034看看如何nil在中创建obarray

注意第3896行中lread.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"); */

这就解释了为什么Emacs不能防止(unintern nil)和防御(unintern t)


非常聪明!我同意Stef这一点,实际上:)在这条道路上存在疯狂。
肖恩·艾瑞德

eh 我同意rms over sm在这里。Uninterning nil是一个常见的错误,很容易防范。当人们可以跳过楼梯时,为什么要在楼梯上放置扶手?
吉尔斯(Gilles)'“ SO-不要邪恶”

@Gilles我想到C时就想到了这一点:C坚持这样的哲学:程序员知道他在做什么,只需要一种表达自己的方式。IMO,我们应该将emacs lisp视为emacs的汇编语言。应当以编译成elisp的语言添加更高的抽象(和防护/功能)。但这当然是另一种媒体的主题:)
肖恩·阿雷德

unintern确实不经常使用。在主体上使用它obarray几乎总是一个坏主意(这就是为什么当您无法传递第二个参数时字节编译器会抱怨的原因,并且C-h f unintern没有告诉您第二个arg实际上仍然是可选的)。
Stefan 2014年

@Stefan看来这是一个文档错误,然后是:(
Sean Allred
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.