2017-07-03 44 views
1

如果我要在Lisp中定义以下过程会发生什么情况: (define(p)(p)) 它会返回什么值?我是而不是编程新手,但我正在阅读这本书更深入,并使用Lisp的例子,这让我感到困惑。Lisp中的过程

+0

相同:“10 GOTO 10” – coredump

+0

是否有任何理由假设它不同于'int foo(){return foo(); }在C或Java中(抛开尾部优化)? –

回答

5

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

def p(): 
    return p() 

你的程序被称为tail position,该方案可以优化利用的空间一定量 - 而Python解释不了做这种优化,并会由于堆栈溢出而迅速崩溃。

+2

根据Lisp实现(解释器或高调试设置),也可能会出现堆栈溢出。 Scheme要求TCO得到实现,解释器或编译器的支持。 Lisp没有。 –