【发布时间】:2011-02-04 00:15:53
【问题描述】:
我知道 Lisp 和 Scheme 程序员通常会说除非绝对必要,否则应该避免使用 eval。我已经看到了针对几种编程语言的相同建议,但我还没有看到反对使用 eval 的明确论据列表。我在哪里可以找到关于使用 eval 的潜在问题的说明?
例如,我知道GOTO 在过程编程中的问题(使程序不可读且难以维护,使安全问题难以找到等),但我从未见过反对eval 的论据。
有趣的是,反对GOTO 的相同论点应该对延续有效,但我看到例如,Schemers 不会说延续是“邪恶的”——你在使用它们时应该小心。与使用延续的代码相比,他们更可能对使用 eval 的代码皱眉(据我所知——我可能是错的)。
【问题讨论】:
-
eval 不是邪恶的,但邪恶是 eval 所做的
-
@yar - 我认为你的评论表明了一个非常单一的以对象为中心的世界观。它可能对大多数语言都有效,但在 Common Lisp 中会有所不同,其中方法不属于类,在 Clojure 中更不同,其中类仅通过 Java 互操作函数支持。 Jay 将此问题标记为 Scheme,它没有任何内置的类或方法概念(各种形式的 OO 可作为库使用)。
-
@Zak,你说得对,我只知道我知道的语言,但即使你使用 Word 文档而不使用样式,你也不会干。我的观点是使用该技术不要重复自己。 OO 不是通用的,真的……
-
我冒昧地为这个问题添加了 clojure 标签,因为我相信 Clojure 用户可能会从这里发布的优秀答案中受益。
-
goto是“邪恶的”,因为它是一种突变形式:实际上,一个新值被突然分配给指令指针。延续不涉及突变;纯函数式语言可以具有延续性。它们比 if 和 while 之类的控制结构更纯粹,尽管它们是 goto 和标签的轻语法糖,但 Dijkstra 没问题。
标签: clojure scheme lisp common-lisp eval