Lisp (defun defun()3)将做什么?

Lisp (defun defun()3)将做什么?,lisp,Lisp,在CppCon演讲中(5:00) 赫伯·萨特(Herb Sutter)暗指,defun-defun 3在某种程度上是一个问题。之后 我用谷歌搜索了一下,我还是不清楚为什么。有人能详细说明一下吗?用一种: 赫伯萨特 另请参阅论文P0707(),并搜索“defun”。Lisp defun(和Scheme define)允许您定义函数。。。但在Lisp和Scheme中,您甚至可以重新定义内置函数和宏,包括defun/define本身,“defun-defun”/“define-define”就是这样做

在CppCon演讲中(5:00) 赫伯·萨特(Herb Sutter)暗指,
defun-defun 3
在某种程度上是一个问题。之后 我用谷歌搜索了一下,我还是不清楚为什么。有人能详细说明一下吗?

用一种:

赫伯萨特

另请参阅论文P0707(),并搜索“defun”。Lisp defun(和Scheme define)允许您定义函数。。。但在Lisp和Scheme中,您甚至可以重新定义内置函数和宏,包括defun/define本身,“defun-defun”/“define-define”就是这样做的。这里有一个与StackExchange相关的示例问题:

我对C++中的任何事情都不感兴趣,而且在我的提议中没有任何类似的东西,你不能改变任何定义(包括定义后的这个类),你不能接触到其他人的类型或代码,你能做的唯一一件事就是参与生成你现在正在编写的这个类的一次性且不可变的定义,这个定义很好,本地化且有界。。。而且仍然非常强大

本节包含以下内容:

5.2.1其他语言的问题

在Lisp和相关语言中,程序员可以重新定义其他人的代码甚至全局语言设施(例如,Lisp中臭名昭著的
(defun defun()3)
,或Scheme中的
(define define()3)
)。这是强大的,但没有纪律(造成任意的全局影响,包括破坏语言本身)、脆弱的(Lisp使编写“只写”代码变得非常容易,难以查看、读取和维护),并导致程序在其组件之间以及与开发人员的环境紧密耦合(众所周知,Lisp使编写代码变得容易,其意义取决于本地定制,难以共享,并且在共享时很难与来自具有竞争性假设的环境的其他代码组合。)4

脚注说:

4 Lisp的各种化身和分支试图以各种方式缓解这一问题,但没有真正消除根本原因:Common Lisp增加了一项保证,即包
Common-Lisp
中的所有符号都受到保护,并且不能由用户代码重新定义,否则会出现未定义的行为;尽管这提供了保护对于标准设施的me保护,它不能解决一般问题,因为它仍然允许一组用户代码在另一组用户代码中重新定义内容。此外,像SBCL这样的实现试图通过提供“锁定”方法来进一步改善问题包,这样它们的内容就不会被意外地重新定义;然而,即使是SBCL也提供了再次“解锁”它们的方法


在普通的LISP中,重新定义标准符号如“代码”> DeFun 具有不确定的行为。链接纸是一种通过击败另一种语言来推动一种语言的方式,这是与编程语言共用者发生了很多事情。@ C++实际上是在论文中找到的。关于Lisp这样的。C++是语言的超位移位运算符,I/O对某人来说似乎是个好主意。@ TFB完全正确。<代码>图像显然是最好的方法。IO@TamaMcGlinn:我不知道这意味着什么。如果你在Lisp中谈论的是
quote
:那根本与IO无关。
它解决不了问题这是一个普遍的问题,因为它仍然允许一组用户代码在另一组用户代码中重新定义内容。
。在Lisp中,这被视为一个有用的功能,而不是一个问题。@RainerJoswig同意。这完全取决于您如何设置优先级。Lisp在这方面与Perl非常相似(另请参见示例).CL有锁,如果您选择忽略这些锁,则需要自行处理。在Scheme中,您需要返回R5RS以解决此问题。从R6RS中,您可以导入标准库,并可以在自己的代码中重新定义它,但不能影响其他人编写的库。如果您获取对象并调用该对象上的方法,则可以如果你的类型规范不明确,我不知道你在调用什么方法。这与defun-defun完全相同,但有类。顺便说一句,我不喜欢Python,但他们的猴子补丁方式非常好。当我使用lisp机器时,我加载了补丁,重新定义了系统的各个部分,使它们正常工作(“在另一组用户代码中重新定义内容”)。这被称为“修复bug”。@melpomene
defun
是一个宏。您可以在C和C++中重新定义宏:
#undef mac
#define mac(blah)…
。就像在Lisp中一样,这对已经编译的代码没有影响。如果有人在Lisp映像中删除了
defun
,我仍然可以在Lisp映像中使用
defun
编译文件,并给他们将要加载的编译模块,因为他们没有扩展我的
defun
宏。