2017-07-03 77 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沒有。 –