gpt4 book ai didi

方案和 Lisp 最佳实践 : recursion yes for Scheme, Lisp 没有?

转载 作者:行者123 更新时间:2023-12-04 22:03:06 25 4
gpt4 key购买 nike

据我了解——如果错了我会在这里纠正——好的方案实践是做任何需要循环、重复递归的事情,此外,溢出不会成为问题,因为尾递归是内置的.然而,Lisp 没有溢出保护,因此,所有循环迭代宏( loopwhile 等)。所以在现实世界的 Lisp 中,你通常不使用递归,而 Scheme 却只想要它。

如果我的假设是正确的,有没有办法让 Lisp 变得“纯粹”而不会有溢出的风险?或者这是否太多地逆流而上,无法在 Lisp 中使用递归?我从 The Little Schemer 记忆起他们是如何通过递归为您提供彻底的锻炼的。还有一个更早的版本,叫做 The Little Lisper。它是否在 Lisp 中为您提供了相同的递归练习?然后 Lisp 之国让我对循环或递归是否是“最佳实践”感到困惑。

我要做的是决定是在 Emacs Org-mode 中使用 Racket,还是只为初学者使用内置的 Elisp。我希望学生尽可能保持纯函数式,例如,我不想解释递归这个非常新的和困难的话题,然后说“哦,但我们不会使用它......”

最佳答案

As I understand -- and I'm here to be corrected if wrong -- good Scheme practice is to do anything requiring looping, repeating with recursion, and, furthermore, overflow won't be a problem because tail-recursion is built-in.



据我所知,这是正确的。

Lisp, however, doesn't have protection from overflow [...]



不完全是。大多数独立的 Common Lisp 实现都提供尾调用合并(有一些限制,请参阅 https://0branch.com/notes/tco-cl.html)。不同之处在于语言规范没有要求拥有它。这在实现各种 Common Lisp 功能时赋予编译器编写者更多的自由。 Emacs Lisp 没有 TCO,除了像 recur 这样的库形式。或 tco (自递归)。

... hence, all the loop iterative macros (loop, while, etc). And so in real-world Lisp you usually don't use recursion, while Scheme wants it all but exclusively.



差异主要是文化上的。使用 REPL(读取-评估-打印-循环)。我认为将交互视为循环而不是无限尾递归函数更有意义。不知何故,在纯函数式语言中似乎有些不愿意将循环视为原始控制结构,而迭代过程被认为更优雅。为什么不能两者兼得?

If my assumptions are true, is there a way to be "pure" with Lisp and not risk overflow? Or is this too much swimming against the stream to use recursion in Lisp?



你当然可以在 Lisp 中使用递归,只要你不滥用它,小程序不应该这样。例如,考虑 map在 OCaml 中不是尾递归的,但人们仍然经常使用它。如果您使用 SBCL,手册中有一节解释了如何强制执行尾调用消除。

What I'm trying to do is decide whether to use Racket inside of Emacs Org-mode or just use built-in Elisp for beginner students. I want students to stay as purely functional as possible, e.g., I don't want to explain the very new and difficult topic of recursion, then say "Oh, but we won't be using it..."



如果您想教授函数式编程,请使用更函数式的语言。换句话说,在 Racket 和 Emacs Lisp 之间,我会说 Racket 更适合学生。还有更多使用 Racket 教授函数式编程的 Material ,还有 Typed Racket。

关于方案和 Lisp 最佳实践 : recursion yes for Scheme, Lisp 没有?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49014140/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com