【问题标题】:Procedures in LispLisp 中的过程
【发布时间】:2017-07-03 03:22:21
【问题描述】:

如果我在 Lisp 中定义以下过程会发生什么: (定义(p)(p)) 它会返回什么值?我对编程不是新手,但我正在阅读这本书,它有点深入,并使用 Lisp 作为示例,这本书让我感到困惑。

【问题讨论】:

  • 同:"10 GOTO 10"
  • 是否有任何理由认为它与 C 或 Java 中的 int foo() { return foo(); } 之类的不同(除了尾部调用优化)?

标签: scheme lisp procedures


【解决方案1】:

执行时,该过程将创建一个无限循环,并且永远不会返回值。我们正在定义一个名为p 的递归过程,其主体是对自身的调用;因为没有基本情况,程序永远不会结束。在更熟悉的语法(例如 Python 的)中,它与以下语法相同:

def p():
    return p()

您的过程在 tail position 中被调用,Scheme 可以对其进行优化以使用恒定数量的空间 - 而 Python 解释器无法进行该优化,并且会由于堆栈溢出而迅速崩溃。

【讨论】:

  • 根据 Lisp 实现(解释器或高调试设置),也可能存在堆栈溢出。 Scheme 要求实现、解释器或编译器支持 TCO。 Lisp 没有。
猜你喜欢
  • 2015-10-13
  • 1970-01-01
  • 1970-01-01
  • 2019-11-30
  • 1970-01-01
  • 2012-06-19
  • 1970-01-01
  • 2010-09-09
  • 1970-01-01
相关资源
最近更新 更多