在 CppCon 的一次演讲中(https://www.youtube.com/watch?v=80BZxujhY38 5:00)Herb Sutter暗指在defun defun 3某种程度上是一个问题。在我用谷歌搜索之后,我仍然不清楚为什么。有人可以详细说明吗?
在同一视频的评论中:
\n\n\n赫伯·萨特
\n另请参阅论文 P0707 ( http://wg21.link/p0707 ),并搜索“defun”。Lisp defun(和Scheme Define)可以让你定义一个函数……但是在Lisp和Scheme中你甚至可以重新定义内置函数和宏,包括defun/define本身,这就是“defun defun”/“define Define”所做的。这是一个与 StackExchange 相关的示例问题:https://emacs.stackexchange.com/questions/375/symbols-value-as-a-variable-is-void-defun-when-reloading-emacs。
\n我对在 C++ 中做类似的事情不感兴趣,并且我的提案中没有类似的内容,您不能更改任何定义(包括定义此类后的定义),您不能接触并影响其他任何人的类型或代码,您唯一能做的就是参与生成您现在正在编写的此类的一次性且不可变的定义,该定义很好且本地化,并且有界...但仍然非常强大。
\n
链接的论文包含此部分:
\n\n\n5.2.1 其他语言的问题
\n在Lisp和相关语言中,程序员可以重新定义其他人\xe2\x80\x99的代码甚至全局语言设施(例如,
\n(defun defun () 3)Lisp中臭名昭著的,或(define define () 3)Scheme中的)。这是强大的,但没有纪律(导致任意全局影响,甚至包括破坏语言本身),脆弱(Lisp 使得编写 \xe2\x80\x9cwrite-only\xe2\x80\x9d 代码变得非常容易,而这些代码很难审查、阅读和维护),并导致程序在其组件之间以及与其开发人员\xe2\x80\x99s环境紧密耦合(Lisp使得编写其含义取决于本地定制的代码变得非常容易,难以共享,并且当共享时很难与来自具有竞争假设的环境的其他代码组合)。4
脚注说:
\n\n\n4 Lisp 的各种版本和分支试图以各种方式缓解这个问题,但没有真正消除根本原因:Common Lisp 添加了保证,包中的所有符号都
\nCOMMON-LISP受到保护,并且不能由用户代码重新定义,否则您会得到未定义的行为;虽然这为标准设施提供了一些保护,但它并没有解决一般问题,因为它仍然允许一组用户代码重新定义另一组用户代码中的事物。此外,像 SBCL 这样的实现试图通过提供 \xe2\x80\x9clock\xe2\x80\x9d 包的方法来进一步改善这个问题,这样它们的内容就不会被意外地重新定义;然而,即使 SBCL 也提供了再次 \xe2\x80\x9cunlock\xe2\x80\x9d 的方法。